Skip to content

Commit c5465b1

Browse files
committed
moved PythonCextBuiltins.PyObjectSize to PythonCextAbstractBuiltins
1 parent c362748 commit c5465b1

File tree

4 files changed

+62
-55
lines changed

4 files changed

+62
-55
lines changed

graalpython/com.oracle.graal.python.cext/src/abstract.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,10 @@ PyObject * PyMapping_GetItemString(PyObject *o, const char *key) {
347347
return _jls_PyObject_GetItem(native_to_java(o), polyglot_from_string(key, SRC_CS));
348348
}
349349

350+
Py_ssize_t PyObject_Size(PyObject *o) {
351+
return UPCALL_CEXT_L(_jls_PyObject_Size, native_to_java(o));
352+
}
353+
350354
UPCALL_ID(PyMapping_Keys);
351355
PyObject * PyMapping_Keys(PyObject *o) {
352356
return UPCALL_CEXT_O(_jls_PyMapping_Keys, native_to_java(o));

graalpython/com.oracle.graal.python.cext/src/object.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,6 @@ int PyObject_GenericInit(PyObject* self, PyObject* args, PyObject* kwds) {
135135
return self;
136136
}
137137

138-
UPCALL_ID(PyObject_Size);
139-
Py_ssize_t PyObject_Size(PyObject *o) {
140-
return UPCALL_CEXT_L(_jls_PyObject_Size, native_to_java(o));
141-
}
142-
143138
typedef void (*object_dump_fun_t)(PyObject *);
144139
UPCALL_TYPED_ID(_PyObject_Dump, object_dump_fun_t);
145140
void _PyObject_Dump(PyObject* op) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextAbstractBuiltins.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,26 +69,35 @@
6969
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.NativeBuiltin;
7070
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.PyErrRestoreNode;
7171
import com.oracle.graal.python.builtins.objects.PNone;
72+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
73+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
7274
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AddRefCntNode;
7375
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
7476
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
7577
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToNewRefNode;
7678
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
7779
import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper.PrimitiveNativeWrapper;
80+
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
81+
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
82+
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
7883
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ItemsNode;
7984
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.KeysNode;
8085
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ValuesNode;
8186
import com.oracle.graal.python.builtins.objects.dict.PDict;
8287
import com.oracle.graal.python.builtins.objects.list.PList;
8388
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
89+
import com.oracle.graal.python.lib.PyMappingCheckNode;
8490
import com.oracle.graal.python.lib.PyNumberFloatNode;
8591
import com.oracle.graal.python.lib.PyObjectDelItem;
8692
import com.oracle.graal.python.lib.PyObjectGetAttr;
8793
import com.oracle.graal.python.lib.PyObjectLookupAttr;
94+
import com.oracle.graal.python.lib.PyObjectSizeNode;
8895
import com.oracle.graal.python.lib.PySequenceCheckNode;
8996
import com.oracle.graal.python.nodes.ErrorMessages;
97+
import com.oracle.graal.python.nodes.SpecialMethodNames;
9098
import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode;
9199
import com.oracle.graal.python.nodes.call.CallNode;
100+
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
92101
import com.oracle.graal.python.nodes.expression.BinaryArithmetic;
93102
import com.oracle.graal.python.nodes.expression.BinaryArithmetic.MulNode;
94103
import com.oracle.graal.python.nodes.expression.BinaryOpNode;
@@ -106,10 +115,12 @@
106115
import com.oracle.graal.python.nodes.subscript.SliceLiteralNode;
107116
import com.oracle.graal.python.nodes.truffle.PythonTypes;
108117
import com.oracle.graal.python.runtime.exception.PException;
118+
import com.oracle.graal.python.runtime.sequence.PSequence;
109119
import com.oracle.truffle.api.CompilerDirectives;
110120
import com.oracle.truffle.api.dsl.Cached;
111121
import com.oracle.truffle.api.dsl.Fallback;
112122
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
123+
import com.oracle.truffle.api.dsl.ImportStatic;
113124
import com.oracle.truffle.api.dsl.NodeFactory;
114125
import com.oracle.truffle.api.dsl.Specialization;
115126
import com.oracle.truffle.api.dsl.TypeSystemReference;
@@ -976,6 +987,53 @@ Object doManaged(VirtualFrame frame, Object listWrapper, Object key,
976987
}
977988
}
978989

990+
@Builtin(name = "PyObject_Size", minNumOfPositionalArgs = 1)
991+
@GenerateNodeFactory
992+
@ImportStatic(SpecialMethodNames.class)
993+
abstract static class PyObject_Size extends PythonUnaryBuiltinNode {
994+
995+
// n.b.: specializations 'doSequence' and 'doMapping' are not just shortcuts but also
996+
// required for correctness because CPython's implementation uses
997+
// 'type->tp_as_sequence->sq_length', 'type->tp_as_mapping->mp_length' which will bypass
998+
// any
999+
// user implementation of '__len__'.
1000+
@Specialization
1001+
static int doSequence(PSequence sequence,
1002+
@Cached SequenceNodes.LenNode seqLenNode) {
1003+
return seqLenNode.execute(sequence);
1004+
}
1005+
1006+
@Specialization
1007+
static int doMapping(PHashingCollection container,
1008+
@Cached HashingCollectionNodes.LenNode seqLenNode) {
1009+
return seqLenNode.execute(container);
1010+
}
1011+
1012+
@Specialization(guards = "!isMappingOrSequence(obj)")
1013+
static Object doGenericUnboxed(VirtualFrame frame, Object obj,
1014+
@Cached("create(Len)") LookupAndCallUnaryNode callLenNode,
1015+
@Cached ConditionProfile noLenProfile,
1016+
@Cached CExtNodes.CastToNativeLongNode castToLongNode,
1017+
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
1018+
try {
1019+
Object result = callLenNode.executeObject(frame, obj);
1020+
if (noLenProfile.profile(result == PNone.NO_VALUE)) {
1021+
return -1;
1022+
}
1023+
Object lresult = castToLongNode.execute(result);
1024+
assert lresult instanceof Long || lresult instanceof PythonNativeVoidPtr;
1025+
return lresult;
1026+
} catch (PException e) {
1027+
transformExceptionToNativeNode.execute(frame, e);
1028+
return -1;
1029+
}
1030+
}
1031+
1032+
protected static boolean isMappingOrSequence(Object obj) {
1033+
return obj instanceof PSequence || obj instanceof PHashingCollection;
1034+
}
1035+
}
1036+
9791037
/////// PyMapping ///////
9801038

9811039
@Builtin(name = "PyMapping_Keys", minNumOfPositionalArgs = 1)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,6 @@
163163
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
164164
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
165165
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
166-
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
167-
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
168166
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
169167
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
170168
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemScalarNode;
@@ -255,7 +253,6 @@
255253
import com.oracle.graal.python.runtime.exception.PException;
256254
import com.oracle.graal.python.runtime.exception.PythonErrorType;
257255
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
258-
import com.oracle.graal.python.runtime.sequence.PSequence;
259256
import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage;
260257
import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage;
261258
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
@@ -1979,53 +1976,6 @@ protected static boolean isReprFormatCode(int formatCode) {
19791976
}
19801977
}
19811978

1982-
@Builtin(name = "PyObject_Size", minNumOfPositionalArgs = 1)
1983-
@GenerateNodeFactory
1984-
@ImportStatic(SpecialMethodNames.class)
1985-
abstract static class PyObject_Size extends PythonUnaryBuiltinNode {
1986-
1987-
// n.b.: specializations 'doSequence' and 'doMapping' are not just shortcuts but also
1988-
// required for correctness because CPython's implementation uses
1989-
// 'type->tp_as_sequence->sq_length', 'type->tp_as_mapping->mp_length' which will bypass
1990-
// any
1991-
// user implementation of '__len__'.
1992-
@Specialization
1993-
static int doSequence(PSequence sequence,
1994-
@Cached SequenceNodes.LenNode seqLenNode) {
1995-
return seqLenNode.execute(sequence);
1996-
}
1997-
1998-
@Specialization
1999-
static int doMapping(PHashingCollection container,
2000-
@Cached HashingCollectionNodes.LenNode seqLenNode) {
2001-
return seqLenNode.execute(container);
2002-
}
2003-
2004-
@Specialization(guards = "!isMappingOrSequence(obj)")
2005-
static Object doGenericUnboxed(VirtualFrame frame, Object obj,
2006-
@Cached("create(Len)") LookupAndCallUnaryNode callLenNode,
2007-
@Cached ConditionProfile noLenProfile,
2008-
@Cached CastToNativeLongNode castToLongNode,
2009-
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
2010-
try {
2011-
Object result = callLenNode.executeObject(frame, obj);
2012-
if (noLenProfile.profile(result == PNone.NO_VALUE)) {
2013-
return -1;
2014-
}
2015-
Object lresult = castToLongNode.execute(result);
2016-
assert lresult instanceof Long || lresult instanceof PythonNativeVoidPtr;
2017-
return lresult;
2018-
} catch (PException e) {
2019-
transformExceptionToNativeNode.execute(frame, e);
2020-
return -1;
2021-
}
2022-
}
2023-
2024-
protected static boolean isMappingOrSequence(Object obj) {
2025-
return obj instanceof PSequence || obj instanceof PHashingCollection;
2026-
}
2027-
}
2028-
20291979
@ReportPolymorphism
20301980
abstract static class CastArgsNode extends Node {
20311981

0 commit comments

Comments
 (0)