Skip to content
Merged
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
14 changes: 13 additions & 1 deletion graalpython/com.oracle.graal.python.cext/src/tupleobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ PyTuple_New(Py_ssize_t size)
_PyObject_GC_TRACK(op);
return (PyObject *) op;
}
#endif // GraalPy change

Py_ssize_t
PyTuple_Size(PyObject *op)
Expand All @@ -100,10 +101,21 @@ PyTuple_Size(PyObject *op)
PyErr_BadInternalCall();
return -1;
}
#if 0 // GraalPy change
else
return Py_SIZE(op);
}
#else // GraalPy change
/*
* CPython uses Py_SIZE here but our Py_SIZE would redundantly check the
* type again. Since performance is really crucial for tuples, we inline
* the minimal code here.
*/
if (points_to_py_handle_space(op)) {
return ((GraalPyVarObject *) pointer_to_stub(op))->ob_size;
}
return _PyVarObject_CAST(op)->ob_size;
#endif // GraalPy change
}

/* Allocate an uninitialized tuple object. Before making it public, following
steps must be done:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,13 @@
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.getter;
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.setter;
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.vectorcallfunc;
import static com.oracle.graal.python.runtime.nativeaccess.NativeMemory.NULLPTR;
import static com.oracle.graal.python.nodes.HiddenAttr.METHOD_DEF_PTR;
import static com.oracle.graal.python.nodes.HiddenAttr.PROMOTED_START;
import static com.oracle.graal.python.nodes.HiddenAttr.PROMOTED_STEP;
import static com.oracle.graal.python.nodes.HiddenAttr.PROMOTED_STOP;
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__;
import static com.oracle.graal.python.runtime.PythonContext.NATIVE_NULL;
import static com.oracle.graal.python.runtime.nativeaccess.NativeMemory.NULLPTR;

import com.oracle.graal.python.builtins.PythonBuiltinClassType;
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode;
Expand Down Expand Up @@ -108,11 +108,11 @@
import com.oracle.graal.python.builtins.objects.set.PBaseSet;
import com.oracle.graal.python.builtins.objects.slice.PSlice;
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
import com.oracle.graal.python.lib.PyObjectLookupAttr;
import com.oracle.graal.python.lib.PyObjectSetAttr;
import com.oracle.graal.python.nodes.HiddenAttr;
import com.oracle.graal.python.nodes.attributes.GetFixedAttributeNode;
import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectExactProfile;
import com.oracle.graal.python.nodes.object.GetClassNode;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.sequence.storage.NativeByteSequenceStorage;
Expand Down Expand Up @@ -571,11 +571,9 @@ abstract static class GraalPyPrivate_Get_PyVarObject_ob_size extends CApiUnaryBu
@Specialization
static long get(Object object,
@Bind Node inliningTarget,
@Cached GetClassNode getClassNode,
@Cached TypeNodes.IsSameTypeNode isSameTypeNode,
@Cached ObSizeNode obSizeNode) {
assert !isSameTypeNode.execute(inliningTarget, getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PInt);
assert !isSameTypeNode.execute(inliningTarget, getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.Boolean);
assert !IsBuiltinObjectExactProfile.profileObjectUncached(object, PythonBuiltinClassType.PInt);
assert !IsBuiltinObjectExactProfile.profileObjectUncached(object, PythonBuiltinClassType.Boolean);
return obSizeNode.execute(inliningTarget, object);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@
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.CApiTernaryBuiltinNode;
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.cext.PythonAbstractNativeObject;
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.EnsurePythonObjectNode;
Expand All @@ -70,7 +69,6 @@
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SetLenNode;
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
import com.oracle.graal.python.lib.PySliceNew;
import com.oracle.graal.python.lib.PyTupleSizeNode;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.builtins.TupleNodes.GetTupleStorage;
Expand Down Expand Up @@ -157,19 +155,6 @@ private static int checkIndex(Node inliningTarget, long key, SequenceStorage seq
}
}

/*
* The best attempt at moving this to pure C regressed by about 1.09x by median time.
*/
@CApiBuiltin(ret = Py_ssize_t, args = {PyObject}, call = Direct)
abstract static class PyTuple_Size extends CApiUnaryBuiltinNode {
@Specialization
public static long size(Object tuple,
@Bind Node inliningTarget,
@Cached PyTupleSizeNode pyTupleSizeNode) {
return pyTupleSizeNode.execute(inliningTarget, tuple);
}
}

@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Py_ssize_t, Py_ssize_t}, call = Direct)
abstract static class PyTuple_GetSlice extends CApiTernaryBuiltinNode {
@Specialization
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,7 @@ public final class CApiFunction {
@CApiBuiltin(name = "PyTuple_Pack", ret = PyObject, args = {Py_ssize_t, VARARGS}, call = CImpl)
@CApiBuiltin(name = "PyTuple_GetItem", ret = PyObjectBorrowed, args = {PyObject, Py_ssize_t}, call = CImpl)
@CApiBuiltin(name = "PyTuple_SetItem", ret = Int, args = {PyObject, Py_ssize_t, PyObjectTransfer}, call = CImpl)
@CApiBuiltin(name = "PyTuple_Size", ret = Py_ssize_t, args = {PyObject}, call = CImpl)
@CApiBuiltin(name = "PyType_FromModuleAndSpec", ret = PyObject, args = {PyObject, PY_TYPE_SPEC, PyObject}, call = CImpl)
@CApiBuiltin(name = "PyType_FromSpec", ret = PyObject, args = {PY_TYPE_SPEC}, call = CImpl)
@CApiBuiltin(name = "PyType_FromSpecWithBases", ret = PyObject, args = {PY_TYPE_SPEC, PyObject}, call = CImpl)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2022, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
Expand Down Expand Up @@ -45,27 +45,26 @@
import static com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.readLongField;
import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_S;

import com.oracle.graal.python.builtins.PythonBuiltinClassType;
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
import com.oracle.graal.python.nodes.PGuards;
import com.oracle.graal.python.nodes.PNodeWithContext;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
import com.oracle.graal.python.nodes.object.GetClassNode;
import com.oracle.graal.python.util.PythonUtils;
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
import com.oracle.truffle.api.dsl.Bind;
import com.oracle.truffle.api.dsl.Cached;
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.GenerateUncached;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.nodes.Node;

@GenerateUncached
@GenerateInline
@GenerateCached(false)
@ImportStatic(PGuards.class)
public abstract class PyTupleSizeNode extends PNodeWithContext {
public static int executeUncached(Object tuple) {
return PyTupleSizeNodeGen.getUncached().execute(null, tuple);
Expand All @@ -78,11 +77,9 @@ static int size(PTuple tuple) {
return tuple.getSequenceStorage().length();
}

@Specialization(guards = "isTupleSubtype(tuple, inliningTarget, getClassNode, isSubtypeNode)", limit = "1")
@Specialization(guards = "isNativeTuple(tuple)")
@InliningCutoff
static int sizeNative(Node inliningTarget, PythonAbstractNativeObject tuple,
@SuppressWarnings("unused") @Cached GetClassNode getClassNode,
@SuppressWarnings("unused") @Cached(inline = false) IsSubtypeNode isSubtypeNode) {
static int sizeNative(PythonAbstractNativeObject tuple) {
return PythonUtils.toIntError(readLongField(tuple.getPtr(), PyVarObject__ob_size));
}

Expand All @@ -93,8 +90,4 @@ static int size(Object obj,
@Bind Node inliningTarget) {
throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC_S, "PyTuple_Size");
}

protected boolean isTupleSubtype(Object obj, Node inliningTarget, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) {
return isSubtypeNode.execute(getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PTuple);
}
}
Loading