Skip to content

Commit 9449ddc

Browse files
committed
implemented PySequence_Size
1 parent 03613ea commit 9449ddc

File tree

3 files changed

+71
-3
lines changed

3 files changed

+71
-3
lines changed

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,34 @@ int PySequence_Check(PyObject *s) {
285285
return UPCALL_CEXT_I(_jls_PySequence_Check, native_to_java(s));
286286
}
287287

288-
UPCALL_ID(PyObject_Size);
288+
UPCALL_ID(PySequence_Size);
289289
Py_ssize_t PySequence_Size(PyObject *s) {
290-
return UPCALL_CEXT_L(_jls_PyObject_Size, native_to_java(s));
290+
return UPCALL_CEXT_L(_jls_PySequence_Size, native_to_java(s));
291+
}
292+
293+
// taken from CPython "Objects/abstract.c"
294+
// called for native python objects
295+
Py_ssize_t PyTruffle_Sequence_Size(PyObject *s) {
296+
PySequenceMethods *m;
297+
298+
if (s == NULL) {
299+
null_error();
300+
return -1;
301+
}
302+
303+
m = s->ob_type->tp_as_sequence;
304+
if (m && m->sq_length) {
305+
Py_ssize_t len = m->sq_length(s);
306+
assert(len >= 0 || PyErr_Occurred());
307+
return len;
308+
}
309+
310+
if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_length) {
311+
PyErr_Format(PyExc_TypeError, "%s is not a sequence", s);
312+
return -1;
313+
}
314+
PyErr_Format(PyExc_TypeError, "object of type '%s' has no len()", Py_TYPE(s)->tp_name);
315+
return -1;
291316
}
292317

293318
UPCALL_ID(PySequence_Contains);

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

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,17 @@
7373
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
7474
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AddRefCntNode;
7575
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
76+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
7677
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
7778
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToNewRefNode;
79+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
7880
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
7981
import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper.PrimitiveNativeWrapper;
8082
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
8183
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
8284
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
85+
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.DefaultCheckFunctionResultNode;
86+
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_SEQUENCE_SIZE;
8387
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ItemsNode;
8488
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.KeysNode;
8589
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ValuesNode;
@@ -112,6 +116,7 @@
112116
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
113117
import com.oracle.graal.python.nodes.subscript.SliceLiteralNode;
114118
import com.oracle.graal.python.nodes.truffle.PythonTypes;
119+
import com.oracle.graal.python.runtime.PythonContext;
115120
import com.oracle.graal.python.runtime.exception.PException;
116121
import com.oracle.graal.python.runtime.sequence.PSequence;
117122
import com.oracle.truffle.api.CompilerDirectives;
@@ -928,7 +933,7 @@ Object run(VirtualFrame frame, Object o, Object i,
928933

929934
@Builtin(name = "PySequence_Check", minNumOfPositionalArgs = 1)
930935
@GenerateNodeFactory
931-
abstract static class PySequenceCheck extends PythonUnaryBuiltinNode {
936+
abstract static class PyCextSequenceCheckNode extends PythonUnaryBuiltinNode {
932937
@Specialization
933938
static boolean check(Object object,
934939
@Cached PySequenceCheckNode check) {
@@ -962,6 +967,43 @@ Object doManaged(VirtualFrame frame, Object listWrapper, Object position,
962967
}
963968
}
964969

970+
@Builtin(name = "PySequence_Size", minNumOfPositionalArgs = 1)
971+
@GenerateNodeFactory
972+
@ImportStatic(SpecialMethodNames.class)
973+
abstract static class PySequenceSizeNode extends PythonUnaryBuiltinNode {
974+
975+
@Specialization(guards = "checkNode.execute(obj)")
976+
static int doSequence(VirtualFrame frame, Object obj,
977+
@SuppressWarnings("unused") @Cached PySequenceCheckNode checkNode,
978+
@Cached PyObjectSizeNode sizeNode,
979+
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
980+
try {
981+
return sizeNode.execute(frame, obj);
982+
} catch (PException e) {
983+
transformExceptionToNativeNode.execute(frame, e);
984+
return -1;
985+
}
986+
}
987+
988+
@Specialization(guards = "isNativeObject(obj)")
989+
static Object doNative(VirtualFrame frame, Object obj,
990+
@Cached ToSulongNode toSulongNode,
991+
@Cached AsPythonObjectNode asPythonObjectNode,
992+
@Cached PCallCapiFunction callCapiFunction,
993+
@Cached DefaultCheckFunctionResultNode checkFunctionResultNode) {
994+
Object result = callCapiFunction.call(FUN_PY_TRUFFLE_SEQUENCE_SIZE, toSulongNode.execute(obj));
995+
checkFunctionResultNode.execute(PythonContext.get(callCapiFunction), FUN_PY_TRUFFLE_SEQUENCE_SIZE.getName(), result);
996+
return asPythonObjectNode.execute(result);
997+
}
998+
999+
@Specialization(guards = {"!isNativeObject(obj)", "!checkNode.execute(obj)"})
1000+
Object notSequence(VirtualFrame frame, Object obj,
1001+
@SuppressWarnings("unused") @Cached PySequenceCheckNode checkNode,
1002+
@Cached PRaiseNativeNode raiseNativeNode) {
1003+
return raiseNativeNode.raiseInt(frame, -1, TypeError, ErrorMessages.IS_NOT_A_SEQUENCE, obj);
1004+
}
1005+
}
1006+
9651007
/////// PyObject ///////
9661008

9671009
@Builtin(name = "PyObject_GetItem", minNumOfPositionalArgs = 2)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/NativeCAPISymbol.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ public enum NativeCAPISymbol implements NativeCExtSymbol {
167167
FUN_PY_TRUFFLE_MEMORYVIEW_FROM_BUFFER("PyTruffle_MemoryViewFromBuffer"),
168168
FUN_PY_TRUFFLE_MEMORYVIEW_FROM_OBJECT("PyTruffle_MemoryViewFromObject"),
169169
FUN_PY_TRUFFLE_RELEASE_BUFFER("PyTruffle_ReleaseBuffer"),
170+
FUN_PY_TRUFFLE_SEQUENCE_SIZE("PyTruffle_Sequence_Size"),
170171
FUN_GET_INT_T_TYPEID("get_int_t_typeid"),
171172
FUN_GET_INT8_T_TYPEID("get_int8_t_typeid"),
172173
FUN_GET_INT16_T_TYPEID("get_int16_t_typeid"),

0 commit comments

Comments
 (0)