Skip to content

Commit 100d90f

Browse files
committed
- added PyMapping_Check
- fixes in PyObject/Seq/Mapping_Size/Check
1 parent ebe5ae5 commit 100d90f

File tree

3 files changed

+154
-102
lines changed

3 files changed

+154
-102
lines changed

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

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

288+
// downcall for native python objects
289+
// taken from CPython "Objects/abstract.c PySequence_Check()"
290+
int PyTruffle_PySequence_Check(PyObject *s) {
291+
if (PyDict_Check(s))
292+
return 0;
293+
return s->ob_type->tp_as_sequence && s->ob_type->tp_as_sequence->sq_item != NULL;
294+
}
295+
288296
UPCALL_ID(PySequence_Size);
289297
Py_ssize_t PySequence_Size(PyObject *s) {
290298
return UPCALL_CEXT_L(_jls_PySequence_Size, native_to_java(s));
291299
}
292300

293-
// PySequence_Size downcall for native python objects
301+
// downcall for native python objects
294302
// taken from CPython "Objects/abstract.c/Py_Sequence_Size"
295303
Py_ssize_t PyTruffle_PySequence_Size(PyObject *s) {
296304
PySequenceMethods *m;
@@ -308,10 +316,10 @@ Py_ssize_t PyTruffle_PySequence_Size(PyObject *s) {
308316
}
309317

310318
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);
319+
PyErr_Format(PyExc_TypeError, "PyTruffle_PySequence_Size(): object of type '%s' is not a sequence", Py_TYPE(s)->tp_name);
312320
return -1;
313321
}
314-
PyErr_Format(PyExc_TypeError, "object of type '%s' has no len()", Py_TYPE(s)->tp_name);
322+
PyErr_Format(PyExc_TypeError, "PyTruffle_PySequence_Size(): object of type '%s' has no len()", Py_TYPE(s)->tp_name);
315323
return -1;
316324
}
317325

@@ -377,8 +385,8 @@ Py_ssize_t PyObject_Size(PyObject *o) {
377385
return UPCALL_CEXT_L(_jls_PyObject_Size, native_to_java(o));
378386
}
379387

380-
// PyObject_Size downcall for native python objects
381-
// taken from CPython "Objects/abstract.c/Py_Object_Size"
388+
// downcall for native python objects
389+
// taken from CPython "Objects/abstract.c/PyObject_Size"
382390
Py_ssize_t PyTruffle_PyObject_Size(PyObject *o) {
383391
PySequenceMethods *m;
384392

@@ -415,8 +423,14 @@ PyObject * PyMapping_Values(PyObject *o) {
415423
return UPCALL_CEXT_O(_jls_PyMapping_Values, native_to_java(o));
416424
}
417425

418-
// taken from CPython "Objects/abstract.c"
426+
UPCALL_ID(PyMapping_Check);
419427
int PyMapping_Check(PyObject *o) {
428+
return UPCALL_CEXT_I(_jls_PyMapping_Check, native_to_java(o));
429+
}
430+
431+
// downcall for native python objects
432+
// taken from CPython "Objects/abstract.c PyMapping_Check"
433+
int PyTruffle_PyMapping_Check(PyObject *o) {
420434
return o && o->ob_type->tp_as_mapping && o->ob_type->tp_as_mapping->mp_subscript;
421435
}
422436

@@ -589,7 +603,7 @@ Py_ssize_t PyTruffle_PyMapping_Size(PyObject *o) {
589603
return len;
590604
}
591605

592-
PyErr_Format(PyExc_TypeError, "object of type '%s' has no len()", Py_TYPE(o)->tp_name);
606+
PyErr_Format(PyExc_TypeError, "PyTruffle_PyMapping_Size(): object of type '%s' has no len()", Py_TYPE(o)->tp_name);
593607
return -1;
594608
}
595609

0 commit comments

Comments
 (0)