Skip to content

Commit 34f7a26

Browse files
committed
Properly wrap functions during type initialization.
1 parent 8d8a6b8 commit 34f7a26

File tree

1 file changed

+39
-11
lines changed
  • graalpython/com.oracle.graal.python.cext/src

1 file changed

+39
-11
lines changed

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

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,10 @@ static PyObject* wrap_setattrfunc(setattrfunc f, PyObject* obj, PyObject* unicod
201201
return f(explicit_cast(obj), as_char_pointer(unicode), explicit_cast(value));
202202
}
203203

204+
static PyObject* wrap_setattrofunc(setattrofunc f, PyObject* obj, PyObject* key, PyObject* item) {
205+
return PyLong_FromLong(f(explicit_cast(obj), explicit_cast(key), explicit_cast(item)));
206+
}
207+
204208
static PyObject* wrap_richcmpfunc(richcmpfunc f, PyObject* a, PyObject* b, PyObject* n) {
205209
return f(explicit_cast(a), explicit_cast(b), (int)PyLong_AsLong(n));
206210
}
@@ -209,10 +213,26 @@ static PyObject* wrap_ssizeobjargproc(ssizeobjargproc f, PyObject* a, PyObject*
209213
return PyLong_FromLong(f(explicit_cast(a), PyLong_AsSsize_t(size), explicit_cast(b)));
210214
}
211215

216+
static PyObject* wrap_ssizeargfunc(ssizeargfunc f, PyObject* a, PyObject* size) {
217+
return PyLong_FromLong(f(explicit_cast(a), PyLong_AsSsize_t(size)));
218+
}
219+
212220
static PyObject* wrap_initproc(initproc f, PyObject* a, PyObject* b, PyObject* c) {
213221
return PyLong_FromLong(f(explicit_cast(a), explicit_cast(b), explicit_cast(c)));
214222
}
215223

224+
static PyObject* wrap_objobjargproc(objobjargproc f, PyObject* a, PyObject* b, PyObject* c) {
225+
return PyLong_FromLong(f(explicit_cast(a), explicit_cast(b), explicit_cast(c)));
226+
}
227+
228+
static PyObject* wrap_objobjproc(objobjproc f, PyObject* a, PyObject* b) {
229+
return PyLong_FromLong(f(explicit_cast(a), explicit_cast(b)));
230+
}
231+
232+
static PyObject* wrap_inquiry(inquiry f, PyObject* a) {
233+
return PyLong_FromLong(f(explicit_cast(a)));
234+
}
235+
216236
/* very special case: operator '**' has an optional third arg */
217237
static PyObject* wrap_pow(ternaryfunc f, ...) {
218238
int nargs = polyglot_get_arg_count();
@@ -227,6 +247,15 @@ static PyObject* wrap_pow(ternaryfunc f, ...) {
227247
return native_to_java(NULL);
228248
}
229249

250+
static PyObject* wrap_lenfunc(lenfunc f, PyObject* a) {
251+
return PyLong_FromSsize_t(f(explicit_cast(a)));
252+
}
253+
254+
static Py_hash_t wrap_hashfunc(hashfunc f, PyObject* a) {
255+
return PyLong_FromSsize_t(f(explicit_cast(a)));
256+
}
257+
258+
230259
int PyType_Ready(PyTypeObject* cls) {
231260
#define ADD_IF_MISSING(attr, def) if (!(attr)) { attr = def; }
232261
#define ADD_METHOD(m) ADD_METHOD_OR_SLOT(m.ml_name, get_method_flags_cwrapper(m.ml_flags), m.ml_meth, m.ml_flags, m.ml_doc)
@@ -378,11 +407,11 @@ int PyType_Ready(PyTypeObject* cls) {
378407
ADD_SLOT_CONV("__getattr__", wrap_getattrfunc, cls->tp_getattr, -2);
379408
ADD_SLOT_CONV("__setattr__", wrap_setattrfunc, cls->tp_setattr, -3);
380409
ADD_SLOT("__repr__", cls->tp_repr, -1);
381-
ADD_SLOT("__hash__", cls->tp_hash, -1);
410+
ADD_SLOT_CONV("__hash__", wrap_hashfunc, cls->tp_hash, -1);
382411
ADD_SLOT("__call__", cls->tp_call, METH_KEYWORDS | METH_VARARGS);
383412
ADD_SLOT("__str__", cls->tp_str, -1);
384413
ADD_SLOT("__getattr__", cls->tp_getattro, -2);
385-
ADD_SLOT("__setattr__", cls->tp_getattro, -3);
414+
ADD_SLOT_CONV("__setattr__", wrap_setattrofunc, cls->tp_setattro, -3);
386415
ADD_SLOT("__clear__", cls->tp_clear, -1);
387416
ADD_SLOT_CONV("__compare__", wrap_richcmpfunc, cls->tp_richcompare, -3);
388417
ADD_SLOT("__iter__", cls->tp_iter, -1);
@@ -407,7 +436,7 @@ int PyType_Ready(PyTypeObject* cls) {
407436
ADD_SLOT("__neg__", numbers->nb_negative, -1);
408437
ADD_SLOT("__pos__", numbers->nb_positive, -1);
409438
ADD_SLOT("__abs__", numbers->nb_absolute, -1);
410-
ADD_SLOT("__bool__", numbers->nb_bool, -1);
439+
ADD_SLOT_CONV("__bool__", wrap_inquiry, numbers->nb_bool, -1);
411440
ADD_SLOT("__invert__", numbers->nb_invert, -1);
412441
ADD_SLOT("__lshift__", numbers->nb_lshift, -2);
413442
ADD_SLOT("__rshift__", numbers->nb_rshift, -2);
@@ -437,21 +466,21 @@ int PyType_Ready(PyTypeObject* cls) {
437466

438467
PySequenceMethods* sequences = cls->tp_as_sequence;
439468
if (sequences) {
440-
ADD_SLOT("__len__", sequences->sq_length, -1);
469+
ADD_SLOT_CONV("__len__", wrap_lenfunc, sequences->sq_length, -1);
441470
ADD_SLOT("__add__", sequences->sq_concat, -2);
442-
ADD_SLOT("__mul__", sequences->sq_repeat, -2);
443-
ADD_SLOT("__getitem__", sequences->sq_item, -2);
471+
ADD_SLOT_CONV("__mul__", wrap_ssizeargfunc, sequences->sq_repeat, -2);
472+
ADD_SLOT_CONV("__getitem__", wrap_ssizeargfunc, sequences->sq_item, -2);
444473
ADD_SLOT_CONV("__setitem__", wrap_ssizeobjargproc, sequences->sq_ass_item, -3);
445-
ADD_SLOT("__contains__", sequences->sq_contains, -2);
474+
ADD_SLOT_CONV("__contains__", wrap_objobjproc, sequences->sq_contains, -2);
446475
ADD_SLOT("__iadd__", sequences->sq_inplace_concat, -2);
447-
ADD_SLOT("__imul__", sequences->sq_inplace_repeat, -2);
476+
ADD_SLOT_CONV("__imul__", wrap_ssizeargfunc, sequences->sq_inplace_repeat, -2);
448477
}
449478

450479
PyMappingMethods* mappings = cls->tp_as_mapping;
451480
if (mappings) {
452-
ADD_SLOT("__len__", mappings->mp_length, -1);
481+
ADD_SLOT_CONV("__len__", wrap_lenfunc, mappings->mp_length, -1);
453482
ADD_SLOT("__getitem__", mappings->mp_subscript, -2);
454-
ADD_SLOT("__setitem__", mappings->mp_ass_subscript, -3);
483+
ADD_SLOT_CONV("__setitem__", wrap_objobjargproc, mappings->mp_ass_subscript, -3);
455484
}
456485

457486
PyAsyncMethods* async = cls->tp_as_async;
@@ -466,7 +495,6 @@ int PyType_Ready(PyTypeObject* cls) {
466495
// TODO ...
467496
}
468497

469-
// TODO link subclasses
470498
/* Link into each base class's list of subclasses */
471499
bases = cls->tp_bases;
472500
Py_ssize_t n = PyTuple_GET_SIZE(bases);

0 commit comments

Comments
 (0)