Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions graalpython/com.oracle.graal.python.cext/src/dictobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -1766,6 +1766,7 @@ _PyDict_GetItemIdWithError(PyObject *dp, _Py_Identifier *key)
return PyDict_GetItemWithError(dp, kv);
}

#if 0 // GraalPy change
PyObject *
_PyDict_GetItemStringWithError(PyObject *v, const char *key)
{
Expand All @@ -1779,7 +1780,6 @@ _PyDict_GetItemStringWithError(PyObject *v, const char *key)
return rv;
}

#if 0 // GraalPy change
/* Fast version of global value lookup (LOAD_GLOBAL).
* Lookup in globals, then builtins.
*
Expand Down Expand Up @@ -3895,6 +3895,7 @@ PyTypeObject PyDict_Type = {

/* For backward compatibility with old dictionary interface */

#if 0 // GraalPy change
PyObject *
PyDict_GetItemString(PyObject *v, const char *key)
{
Expand All @@ -3908,6 +3909,7 @@ PyDict_GetItemString(PyObject *v, const char *key)
Py_DECREF(kv);
return rv;
}
#endif // GraalPy change

int
_PyDict_SetItemId(PyObject *v, _Py_Identifier *key, PyObject *item)
Expand All @@ -3919,6 +3921,7 @@ _PyDict_SetItemId(PyObject *v, _Py_Identifier *key, PyObject *item)
return PyDict_SetItem(v, kv, item);
}

#if 0 // GraalPy change
int
PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
{
Expand All @@ -3934,7 +3937,6 @@ PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
return err;
}

#if 0 // GraalPy change
int
_PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
{
Expand All @@ -3943,7 +3945,6 @@ _PyDict_DelItemId(PyObject *v, _Py_Identifier *key)
return -1;
return PyDict_DelItem(v, kv);
}
#endif // GraalPy change

int
PyDict_DelItemString(PyObject *v, const char *key)
Expand All @@ -3958,7 +3959,6 @@ PyDict_DelItemString(PyObject *v, const char *key)
return err;
}

#if 0 // GraalPy change
/* Dictionary iterator types */

typedef struct {
Expand Down
4 changes: 2 additions & 2 deletions graalpython/com.oracle.graal.python.cext/src/import.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (c) 2024, 2025, Oracle and/or its affiliates.
/* Copyright (c) 2024, 2026, Oracle and/or its affiliates.
* Copyright (C) 1996-2024 Python Software Foundation
*
* Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
Expand Down Expand Up @@ -3330,6 +3330,7 @@ _PyImport_GetModuleAttr(PyObject *modname, PyObject *attrname)
return result;
}

#if 0 // GraalPy change
PyObject *
_PyImport_GetModuleAttrString(const char *modname, const char *attrname)
{
Expand All @@ -3349,7 +3350,6 @@ _PyImport_GetModuleAttrString(const char *modname, const char *attrname)
}


#if 0 // GraalPy change
/**************/
/* the module */
/**************/
Expand Down
13 changes: 9 additions & 4 deletions graalpython/com.oracle.graal.python.cext/src/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -993,6 +993,10 @@ PyObject_GetAttrString(PyObject *v, const char *name)
{
PyObject *w, *res;

// GraalPy change: avoid temp name object if receiver is managed
if (points_to_py_handle_space(v)) {
return GraalPyPrivate_Object_GetAttrString(v, name);
}
if (Py_TYPE(v)->tp_getattr != NULL)
return (*Py_TYPE(v)->tp_getattr)(v, (char*)name);
w = PyUnicode_FromString(name);
Expand Down Expand Up @@ -1034,12 +1038,13 @@ PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
PyObject *s;
int res;

// GraalPy change: avoid temp name object if receiver is managed
if (points_to_py_handle_space(v)) {
return GraalPyPrivate_Object_SetAttrString(v, name, w);
}
if (Py_TYPE(v)->tp_setattr != NULL)
return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w);
// GraalPy change
// TODO(fa): CPython interns strings; verify if that makes sense for us as well
// s = PyUnicode_InternFromString(name);
s = PyUnicode_FromString(name);
s = PyUnicode_InternFromString(name);
if (s == NULL)
return -1;
res = PyObject_SetAttr(v, s, w);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14718,6 +14718,7 @@ PyUnicode_InternImmortal(PyObject **p)
_PyUnicode_InternImmortal(interp, p);
}

#if 0 // GraalPy change
PyObject *
PyUnicode_InternFromString(const char *cp)
{
Expand All @@ -14730,7 +14731,6 @@ PyUnicode_InternFromString(const char *cp)
return s;
}

#if 0 // GraalPy change
void
_PyUnicode_ClearInterned(PyInterpreterState *interp)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct;
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored;
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString;
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_HASH_T_PTR;
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_SSIZE_T_PTR;
Expand All @@ -54,7 +55,7 @@
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_hash_t;
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void;
import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P;
import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC;
import static com.oracle.graal.python.nodes.ErrorMessages.HASH_MISMATCH;
import static com.oracle.graal.python.nodes.ErrorMessages.OBJ_P_HAS_NO_ATTR_S;
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_KEYS;
Expand Down Expand Up @@ -109,12 +110,12 @@
import com.oracle.graal.python.builtins.objects.ints.PInt;
import com.oracle.graal.python.builtins.objects.list.PList;
import com.oracle.graal.python.builtins.objects.object.PythonObject;
import com.oracle.graal.python.builtins.objects.str.StringBuiltins;
import com.oracle.graal.python.lib.PyDictDelItem;
import com.oracle.graal.python.lib.PyDictSetDefault;
import com.oracle.graal.python.lib.PyObjectGetAttr;
import com.oracle.graal.python.lib.PyObjectHashNode;
import com.oracle.graal.python.lib.PyUnicodeCheckNode;
import com.oracle.graal.python.nodes.PGuards;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode;
import com.oracle.graal.python.nodes.call.CallNode;
Expand All @@ -125,6 +126,7 @@
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
import com.oracle.graal.python.util.PythonUtils;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.TruffleLogger;
import com.oracle.truffle.api.dsl.Bind;
import com.oracle.truffle.api.dsl.Cached;
Expand All @@ -133,6 +135,7 @@
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.GenerateCached;
import com.oracle.truffle.api.dsl.GenerateInline;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.Frame;
import com.oracle.truffle.api.frame.VirtualFrame;
Expand All @@ -141,6 +144,7 @@
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile;
import com.oracle.truffle.api.strings.TruffleString;

public final class PythonCextDictBuiltins {
private static final TruffleLogger LOGGER = CApiContext.getLogger(PythonCextDictBuiltins.class);
Expand Down Expand Up @@ -306,12 +310,14 @@ Object fallback(Object dict) {
}
}

@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject, PyObject}, call = Direct)
public abstract static class PyDict_GetItem extends CApiBinaryBuiltinNode {
@GenerateInline
@GenerateCached(false)
@ImportStatic(PGuards.class)
abstract static class DictGetAndPromoteItem extends Node {
abstract Object execute(Node inliningTarget, Object dict, Object key);

@Specialization
static Object getItem(PDict dict, Object key,
@Bind Node inliningTarget,
static Object doPDict(Node inliningTarget, PDict dict, Object key,
@Bind PythonContext context,
@Cached HashingStorageGetItem getItem,
@Cached EnsurePythonObjectNode ensureNode,
Expand All @@ -336,22 +342,42 @@ static Object getItem(PDict dict, Object key,
}

@Specialization(guards = "!isDict(obj)")
static Object getItem(Object obj, @SuppressWarnings("unused") Object key,
@Bind Node inliningTarget,
@Cached StringBuiltins.StrNewNode strNode) {
return PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(null, obj), obj);
@TruffleBoundary
static Object doOther(Node inliningTarget, @SuppressWarnings("unused") Object obj, @SuppressWarnings("unused") Object key) {
return PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC);
}
}

@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct)
public abstract static class PyDict_GetItemString extends CApiBinaryBuiltinNode {

protected boolean isDict(Object obj) {
return obj instanceof PDict;
@Specialization
static Object doGeneric(Object dict, Object key,
@Bind Node inliningTarget,
@Cached DictGetAndPromoteItem getAndPromoteItem) {
return getAndPromoteItem.execute(inliningTarget, dict, key);
}
}

@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject, PyObject}, call = Direct)
abstract static class PyDict_GetItemWithError extends CApiBinaryBuiltinNode {
public abstract static class PyDict_GetItem extends CApiBinaryBuiltinNode {

@Specialization
static Object getItem(PDict dict, Object key,
static Object doGeneric(Object dict, Object key,
@Bind Node inliningTarget,
@Cached DictGetAndPromoteItem getAndPromoteItem) {
return getAndPromoteItem.execute(inliningTarget, dict, key);
}
}

@GenerateInline
@GenerateCached(false)
@ImportStatic(PGuards.class)
abstract static class DictGetAndPromoteItemWithError extends Node {
abstract Object execute(Node inliningTarget, Object dict, Object key);

@Specialization
static Object doPDict(Node inliningTarget, PDict dict, Object key,
@Bind PythonContext context,
@Cached HashingStorageGetItem getItem,
@Cached EnsurePythonObjectNode ensureNode,
Expand All @@ -370,26 +396,70 @@ static Object getItem(PDict dict, Object key,
return res;
}

@Fallback
Object fallback(Object dict, @SuppressWarnings("unused") Object key) {
throw raiseFallback(dict, PythonBuiltinClassType.PDict);
@Specialization(guards = "!isDict(obj)")
@TruffleBoundary
static Object doOther(Node inliningTarget, @SuppressWarnings("unused") Object obj, @SuppressWarnings("unused") Object key) {
return PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC);
}
}

@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject, PyObject}, call = Direct)
abstract static class PyDict_GetItemWithError extends CApiBinaryBuiltinNode {
@Specialization
static Object doGeneric(Object dict, Object key,
@Bind Node inliningTarget,
@Cached DictGetAndPromoteItemWithError getAndPromoteItem) {
return getAndPromoteItem.execute(inliningTarget, dict, key);
}
}

@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct)
abstract static class _PyDict_GetItemStringWithError extends CApiBinaryBuiltinNode {
@Specialization
static Object doGeneric(Object dict, Object key,
@Bind Node inliningTarget,
@Cached DictGetAndPromoteItemWithError getAndPromoteItem) {
return getAndPromoteItem.execute(inliningTarget, dict, key);
}
}

@CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtrAsTruffleString, PyObject}, call = Direct)
@ImportStatic(PGuards.class)
abstract static class PyDict_SetItemString extends CApiTernaryBuiltinNode {
@Specialization
static int doPDict(PDict dict, TruffleString key, Object value,
@Bind Node inliningTarget,
@Cached SetItemNode setItemNode) {
setItemNode.execute(null, inliningTarget, dict, key, value);
return 0;
}

@Specialization(guards = "!isDict(dict)")
@TruffleBoundary
@SuppressWarnings("unused")
static int doOther(Object dict, Object key, Object value,
@Bind Node inliningTarget) {
throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC);
}
}

@CApiBuiltin(ret = Int, args = {PyObject, PyObject, PyObject}, call = Direct)
@ImportStatic(PGuards.class)
abstract static class PyDict_SetItem extends CApiTernaryBuiltinNode {
@Specialization
static int setItem(PDict dict, Object key, Object value,
static int doPDict(PDict dict, Object key, Object value,
@Bind Node inliningTarget,
@Cached SetItemNode setItemNode) {
setItemNode.execute(null, inliningTarget, dict, key, value);
return 0;
}

@Specialization(guards = "!isDict(dict)")
@TruffleBoundary
@SuppressWarnings("unused")
@Fallback
int fallback(Object dict, Object key, Object value) {
throw raiseFallback(dict, PythonBuiltinClassType.PDict);
static int doOther(Object dict, Object key, Object value,
@Bind Node inliningTarget) {
throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC);
}
}

Expand Down Expand Up @@ -442,6 +512,26 @@ public Object fallback(Object dict, @SuppressWarnings("unused") Object key, @Sup
}
}

@CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct)
@ImportStatic(PGuards.class)
abstract static class PyDict_DelItemString extends CApiBinaryBuiltinNode {
@Specialization
static int doPDict(PDict dict, TruffleString key,
@Bind Node inliningTarget,
@Cached PyDictDelItem delItemNode) {
delItemNode.execute(null, inliningTarget, dict, key);
return 0;
}

@Specialization(guards = "!isDict(dict)")
@TruffleBoundary
@SuppressWarnings("unused")
static int doOther(Object dict, Object key,
@Bind Node inliningTarget) {
throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC);
}
}

@CApiBuiltin(ret = Int, args = {PyObject, PyObject}, call = Direct)
abstract static class PyDict_DelItem extends CApiBinaryBuiltinNode {
@Specialization
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,14 @@
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;

import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi5BuiltinNode;
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode;
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode;
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.dict.PDict;
import com.oracle.graal.python.builtins.objects.function.PKeyword;
import com.oracle.graal.python.builtins.objects.module.PythonModule;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
import com.oracle.graal.python.lib.PyObjectGetAttr;
import com.oracle.graal.python.lib.PyObjectGetItem;
Expand Down Expand Up @@ -158,4 +160,15 @@ private static void waitForInitialization(Object name, PythonContext context) {
PyObjectCallMethodObjArgs.executeUncached(context.getImportlib(), T__LOCK_UNLOCK_MODULE, name);
}
}

@CApiBuiltin(ret = PyObjectTransfer, args = {ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString}, call = Direct)
abstract static class _PyImport_GetModuleAttrString extends CApiBinaryBuiltinNode {
@Specialization
static Object doTruffleString(TruffleString modname, TruffleString attrname,
@Bind Node inliningTarget,
@Cached PyObjectGetAttr getAttr) {
PythonModule mod = AbstractImportNode.importModuleBoundary(modname);
return getAttr.execute(inliningTarget, mod, attrname);
}
}
}
Loading
Loading