@@ -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+
204208static 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+
212220static 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 */
217237static 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+
230259int 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