@@ -201,6 +201,10 @@ static PyObject* wrap_setattrfunc(setattrfunc f, PyObject* obj, PyObject* unicod
201
201
return f (explicit_cast (obj ), as_char_pointer (unicode ), explicit_cast (value ));
202
202
}
203
203
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
+
204
208
static PyObject * wrap_richcmpfunc (richcmpfunc f , PyObject * a , PyObject * b , PyObject * n ) {
205
209
return f (explicit_cast (a ), explicit_cast (b ), (int )PyLong_AsLong (n ));
206
210
}
@@ -209,10 +213,26 @@ static PyObject* wrap_ssizeobjargproc(ssizeobjargproc f, PyObject* a, PyObject*
209
213
return PyLong_FromLong (f (explicit_cast (a ), PyLong_AsSsize_t (size ), explicit_cast (b )));
210
214
}
211
215
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
+
212
220
static PyObject * wrap_initproc (initproc f , PyObject * a , PyObject * b , PyObject * c ) {
213
221
return PyLong_FromLong (f (explicit_cast (a ), explicit_cast (b ), explicit_cast (c )));
214
222
}
215
223
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
+
216
236
/* very special case: operator '**' has an optional third arg */
217
237
static PyObject * wrap_pow (ternaryfunc f , ...) {
218
238
int nargs = polyglot_get_arg_count ();
@@ -227,6 +247,15 @@ static PyObject* wrap_pow(ternaryfunc f, ...) {
227
247
return native_to_java (NULL );
228
248
}
229
249
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
+
230
259
int PyType_Ready (PyTypeObject * cls ) {
231
260
#define ADD_IF_MISSING (attr , def ) if (!(attr)) { attr = def; }
232
261
#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) {
378
407
ADD_SLOT_CONV ("__getattr__" , wrap_getattrfunc , cls -> tp_getattr , -2 );
379
408
ADD_SLOT_CONV ("__setattr__" , wrap_setattrfunc , cls -> tp_setattr , -3 );
380
409
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 );
382
411
ADD_SLOT ("__call__" , cls -> tp_call , METH_KEYWORDS | METH_VARARGS );
383
412
ADD_SLOT ("__str__" , cls -> tp_str , -1 );
384
413
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 );
386
415
ADD_SLOT ("__clear__" , cls -> tp_clear , -1 );
387
416
ADD_SLOT_CONV ("__compare__" , wrap_richcmpfunc , cls -> tp_richcompare , -3 );
388
417
ADD_SLOT ("__iter__" , cls -> tp_iter , -1 );
@@ -407,7 +436,7 @@ int PyType_Ready(PyTypeObject* cls) {
407
436
ADD_SLOT ("__neg__" , numbers -> nb_negative , -1 );
408
437
ADD_SLOT ("__pos__" , numbers -> nb_positive , -1 );
409
438
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 );
411
440
ADD_SLOT ("__invert__" , numbers -> nb_invert , -1 );
412
441
ADD_SLOT ("__lshift__" , numbers -> nb_lshift , -2 );
413
442
ADD_SLOT ("__rshift__" , numbers -> nb_rshift , -2 );
@@ -437,21 +466,21 @@ int PyType_Ready(PyTypeObject* cls) {
437
466
438
467
PySequenceMethods * sequences = cls -> tp_as_sequence ;
439
468
if (sequences ) {
440
- ADD_SLOT ("__len__" , sequences -> sq_length , -1 );
469
+ ADD_SLOT_CONV ("__len__" , wrap_lenfunc , sequences -> sq_length , -1 );
441
470
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 );
444
473
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 );
446
475
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 );
448
477
}
449
478
450
479
PyMappingMethods * mappings = cls -> tp_as_mapping ;
451
480
if (mappings ) {
452
- ADD_SLOT ("__len__" , mappings -> mp_length , -1 );
481
+ ADD_SLOT_CONV ("__len__" , wrap_lenfunc , mappings -> mp_length , -1 );
453
482
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 );
455
484
}
456
485
457
486
PyAsyncMethods * async = cls -> tp_as_async ;
@@ -466,7 +495,6 @@ int PyType_Ready(PyTypeObject* cls) {
466
495
// TODO ...
467
496
}
468
497
469
- // TODO link subclasses
470
498
/* Link into each base class's list of subclasses */
471
499
bases = cls -> tp_bases ;
472
500
Py_ssize_t n = PyTuple_GET_SIZE (bases );
0 commit comments