@@ -70,10 +70,6 @@ _Py_IDENTIFIER(__module__);
70
70
_Py_IDENTIFIER (__eq__ );
71
71
_Py_IDENTIFIER (__hash__ );
72
72
73
- // GraalPy change: forward delcarations of our helpers
74
- static void add_slot (PyTypeObject * cls , char * name , void * meth , int flags , int signature , char * doc );
75
- static int type_ready_graalpy_slot_conv (PyTypeObject * cls );
76
-
77
73
78
74
static PyObject *
79
75
slot_tp_new (PyTypeObject * type , PyObject * args , PyObject * kwds );
@@ -4114,6 +4110,7 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
4114
4110
extern void
4115
4111
_PyDictKeys_DecRef (PyDictKeysObject * keys );
4116
4112
4113
+
4117
4114
static void
4118
4115
type_dealloc_common (PyTypeObject * type )
4119
4116
{
@@ -4540,6 +4537,7 @@ PyTypeObject PyType_Type = {
4540
4537
#endif // GraalPy change
4541
4538
};
4542
4539
4540
+
4543
4541
#if 0 // GraalPy change
4544
4542
/* The base type of all types (eventually)... except itself. */
4545
4543
@@ -6250,11 +6248,9 @@ static int
6250
6248
type_ready_fill_dict (PyTypeObject * type )
6251
6249
{
6252
6250
/* Add type-specific descriptors to tp_dict */
6253
- #if 0 // GraalPy change
6254
6251
if (add_operators (type ) < 0 ) {
6255
6252
return -1 ;
6256
6253
}
6257
- #endif // GraalPy change
6258
6254
if (type_add_methods (type ) < 0 ) {
6259
6255
return -1 ;
6260
6256
}
@@ -6439,10 +6435,7 @@ type_ready_set_new(PyTypeObject *type)
6439
6435
6440
6436
if (!(type -> tp_flags & Py_TPFLAGS_DISALLOW_INSTANTIATION )) {
6441
6437
if (type -> tp_new != NULL ) {
6442
- // If "__new__" key does not exists in the type dictionary,
6443
- // set it to tp_new_wrapper().
6444
- // GraalPy change
6445
- add_slot (type , "__new__" , type -> tp_new , METH_KEYWORDS | METH_VARARGS , JWRAPPER_NEW , NULL );
6438
+ // GraalPy change: the wrapper is created in add_operators with the rest of slots
6446
6439
}
6447
6440
else {
6448
6441
// tp_new is NULL: inherit tp_new from base
@@ -6497,10 +6490,8 @@ type_ready_post_checks(PyTypeObject *type)
6497
6490
}
6498
6491
return 0 ;
6499
6492
}
6500
- #endif // GraalPy change
6501
6493
6502
- // GraalPy-specific
6503
- static int type_ready_graalpy_slot_conv (PyTypeObject * cls );
6494
+ #endif // GraalPy change
6504
6495
6505
6496
static int
6506
6497
type_ready (PyTypeObject * type )
@@ -6536,10 +6527,6 @@ type_ready(PyTypeObject *type)
6536
6527
if (type_ready_fill_dict (type ) < 0 ) {
6537
6528
return -1 ;
6538
6529
}
6539
- // GraalPy change
6540
- if (type_ready_graalpy_slot_conv (type ) < 0 ) {
6541
- return -1 ;
6542
- }
6543
6530
if (type_ready_inherit (type ) < 0 ) {
6544
6531
return -1 ;
6545
6532
}
@@ -8785,6 +8772,7 @@ recurse_down_subclasses(PyTypeObject *type, PyObject *attr_name,
8785
8772
}
8786
8773
return 0 ;
8787
8774
}
8775
+ #endif // GraalPy change
8788
8776
8789
8777
/* This function is called by PyType_Ready() to populate the type's
8790
8778
dictionary with method descriptors for function slots. For each
@@ -8819,46 +8807,12 @@ recurse_down_subclasses(PyTypeObject *type, PyObject *attr_name,
8819
8807
static int
8820
8808
add_operators (PyTypeObject * type )
8821
8809
{
8822
- PyObject * dict = type -> tp_dict ;
8823
- slotdef * p ;
8824
- PyObject * descr ;
8825
- void * * ptr ;
8826
-
8827
- assert (slotdefs_initialized );
8828
- for (p = slotdefs ; p -> name ; p ++ ) {
8829
- if (p -> wrapper == NULL )
8830
- continue ;
8831
- ptr = slotptr (type , p -> offset );
8832
- if (!ptr || !* ptr )
8833
- continue ;
8834
- int r = PyDict_Contains (dict , p -> name_strobj );
8835
- if (r > 0 )
8836
- continue ;
8837
- if (r < 0 ) {
8838
- return -1 ;
8839
- }
8840
- if (* ptr == (void * )PyObject_HashNotImplemented ) {
8841
- /* Classes may prevent the inheritance of the tp_hash
8842
- slot by storing PyObject_HashNotImplemented in it. Make it
8843
- visible as a None value for the __hash__ attribute. */
8844
- if (PyDict_SetItem (dict , p -> name_strobj , Py_None ) < 0 )
8845
- return -1 ;
8846
- }
8847
- else {
8848
- descr = PyDescr_NewWrapper (type , p , * ptr );
8849
- if (descr == NULL )
8850
- return -1 ;
8851
- if (PyDict_SetItem (dict , p -> name_strobj , descr ) < 0 ) {
8852
- Py_DECREF (descr );
8853
- return -1 ;
8854
- }
8855
- Py_DECREF (descr );
8856
- }
8857
- }
8858
- return 0 ;
8810
+ // GraalPy change: different implementation
8811
+ return GraalPyTruffleType_AddOperators (type );
8859
8812
}
8860
8813
8861
8814
8815
+ #if 0 // GraalPy change
8862
8816
/* Cooperative 'super' */
8863
8817
8864
8818
typedef struct {
@@ -9310,165 +9264,3 @@ PyTypeObject PySuper_Type = {
9310
9264
.tp_vectorcall = (vectorcallfunc )super_vectorcall ,
9311
9265
};
9312
9266
#endif // GraalPy change
9313
-
9314
-
9315
- // GraalPy additions
9316
-
9317
- static void add_slot (PyTypeObject * type , char * name , void * meth , int flags , int signature , char * doc ) {
9318
- if (meth ) {
9319
- GraalPyTruffleType_AddSlot (type ,
9320
- type -> tp_dict ,
9321
- name ,
9322
- meth ,
9323
- flags ,
9324
- (signature != 0 ? signature : get_method_flags_wrapper (flags )),
9325
- doc );
9326
- }
9327
- }
9328
-
9329
- static int type_ready_graalpy_slot_conv (PyTypeObject * cls ) {
9330
- #define ADD_SLOT_CONV (__name__ , __meth__ , __flags__ , __signature__ ) add_slot(cls, (__name__), (__meth__), (__flags__), (__signature__), NULL)
9331
-
9332
- // TODO: once all slots are converted, we can do one upcall to managed implementation
9333
- // of add_operators that will use TpSlots#SLOTDEFS and the same algorithm as CPython
9334
-
9335
- /*
9336
- * NOTE: ADD_SLOT_CONV won't overwrite existing attributes, so the order is crucial and must
9337
- * reflect CPython's 'slotdefs' array.
9338
- */
9339
-
9340
- // add special methods defined directly on the type structs
9341
- ADD_SLOT_CONV ("__dealloc__" , cls -> tp_dealloc , -1 , JWRAPPER_DIRECT );
9342
- // https://docs.python.org/3/c-api/typeobj.html#c.PyTypeObject.tp_getattr
9343
- // tp_getattr and tp_setattr are deprecated, and should be the same as
9344
- // tp_getattro and tp_setattro
9345
-
9346
- // NOTE: The slots may be called from managed code, i.e., we need to wrap the functions
9347
- // and convert arguments that should be C primitives.
9348
- // ADD_SLOT_CONV("__getattribute__", cls->tp_getattr, -2, JWRAPPER_GETATTR); tp_getattr does not have wrapper set in slotdefs and hence is ignored in add_operators
9349
- // ADD_SLOT_CONV("__setattr__", cls->tp_setattr, -3, JWRAPPER_SETATTR); dtto for tp_setattr
9350
- ADD_SLOT_CONV ("__repr__" , cls -> tp_repr , -1 , JWRAPPER_REPR );
9351
- ADD_SLOT_CONV ("__hash__" , cls -> tp_hash , -1 , JWRAPPER_HASHFUNC );
9352
- ADD_SLOT_CONV ("__call__" , cls -> tp_call , METH_KEYWORDS | METH_VARARGS , JWRAPPER_CALL );
9353
- ADD_SLOT_CONV ("__str__" , cls -> tp_str , -1 , JWRAPPER_STR );
9354
- ADD_SLOT_CONV ("__getattribute__" , cls -> tp_getattro , -2 , JWRAPPER_BINARYFUNC );
9355
- ADD_SLOT_CONV ("__setattr__" , cls -> tp_setattro , -3 , JWRAPPER_SETATTRO );
9356
- ADD_SLOT_CONV ("__delattr__" , cls -> tp_setattro , -3 , JWRAPPER_DELATTRO );
9357
- ADD_SLOT_CONV ("__clear__" , cls -> tp_clear , -1 , JWRAPPER_INQUIRY );
9358
-
9359
- richcmpfunc richcompare = cls -> tp_richcompare ;
9360
- if (richcompare ) {
9361
- ADD_SLOT_CONV ("__lt__" , richcompare , -2 , JWRAPPER_LT );
9362
- ADD_SLOT_CONV ("__le__" , richcompare , -2 , JWRAPPER_LE );
9363
- ADD_SLOT_CONV ("__eq__" , richcompare , -2 , JWRAPPER_EQ );
9364
- ADD_SLOT_CONV ("__ne__" , richcompare , -2 , JWRAPPER_NE );
9365
- ADD_SLOT_CONV ("__gt__" , richcompare , -2 , JWRAPPER_GT );
9366
- ADD_SLOT_CONV ("__ge__" , richcompare , -2 , JWRAPPER_GE );
9367
- }
9368
- ADD_SLOT_CONV ("__iter__" , cls -> tp_iter , -1 , JWRAPPER_UNARYFUNC );
9369
- ADD_SLOT_CONV ("__next__" , cls -> tp_iternext , -1 , JWRAPPER_ITERNEXT );
9370
- ADD_SLOT_CONV ("__get__" , cls -> tp_descr_get , -3 , JWRAPPER_DESCR_GET );
9371
- ADD_SLOT_CONV ("__set__" , cls -> tp_descr_set , -3 , JWRAPPER_DESCR_SET );
9372
- ADD_SLOT_CONV ("__delete__" , cls -> tp_descr_set , -2 , JWRAPPER_DESCR_DELETE );
9373
- ADD_SLOT_CONV ("__init__" , cls -> tp_init , METH_KEYWORDS | METH_VARARGS , JWRAPPER_INITPROC );
9374
- ADD_SLOT_CONV ("__alloc__" , cls -> tp_alloc , -2 , JWRAPPER_ALLOC );
9375
- /* Note: '__new__' was added here previously but we don't do it similar to CPython.
9376
- They also skip it because the appropriate 'slotdef' doesn't have a wrapper.
9377
- Adding '__new__' is done by function 'type_ready_set_new'. */
9378
- ADD_SLOT_CONV ("__free__" , cls -> tp_free , -1 , JWRAPPER_DIRECT );
9379
- ADD_SLOT_CONV ("__del__" , cls -> tp_del , -1 , JWRAPPER_DIRECT );
9380
- ADD_SLOT_CONV ("__finalize__" , cls -> tp_finalize , -1 , JWRAPPER_DIRECT );
9381
-
9382
- // 'tp_as_number' takes precedence over 'tp_as_mapping' and 'tp_as_sequence' !
9383
- PyNumberMethods * numbers = cls -> tp_as_number ;
9384
- if (numbers ) {
9385
- ADD_SLOT_CONV ("__add__" , numbers -> nb_add , -2 , JWRAPPER_BINARYFUNC_L );
9386
- ADD_SLOT_CONV ("__radd__" , numbers -> nb_add , -2 , JWRAPPER_BINARYFUNC_R );
9387
- ADD_SLOT_CONV ("__sub__" , numbers -> nb_subtract , -2 , JWRAPPER_BINARYFUNC_L );
9388
- ADD_SLOT_CONV ("__rsub__" , numbers -> nb_subtract , -2 , JWRAPPER_BINARYFUNC_R );
9389
- ADD_SLOT_CONV ("__mul__" , numbers -> nb_multiply , -2 , JWRAPPER_BINARYFUNC_L );
9390
- ADD_SLOT_CONV ("__rmul__" , numbers -> nb_multiply , -2 , JWRAPPER_BINARYFUNC_R );
9391
- ADD_SLOT_CONV ("__mod__" , numbers -> nb_remainder , -2 , JWRAPPER_BINARYFUNC_L );
9392
- ADD_SLOT_CONV ("__rmod__" , numbers -> nb_remainder , -2 , JWRAPPER_BINARYFUNC_R );
9393
- ADD_SLOT_CONV ("__divmod__" , numbers -> nb_divmod , -2 , JWRAPPER_BINARYFUNC_L );
9394
- ADD_SLOT_CONV ("__rdivmod__" , numbers -> nb_divmod , -2 , JWRAPPER_BINARYFUNC_R );
9395
- ADD_SLOT_CONV ("__pow__" , numbers -> nb_power , -3 , JWRAPPER_TERNARYFUNC );
9396
- ADD_SLOT_CONV ("__rpow__" , numbers -> nb_power , -3 , JWRAPPER_TERNARYFUNC_R );
9397
- ADD_SLOT_CONV ("__neg__" , numbers -> nb_negative , -1 , JWRAPPER_UNARYFUNC );
9398
- ADD_SLOT_CONV ("__pos__" , numbers -> nb_positive , -1 , JWRAPPER_UNARYFUNC );
9399
- ADD_SLOT_CONV ("__abs__" , numbers -> nb_absolute , -1 , JWRAPPER_UNARYFUNC );
9400
- ADD_SLOT_CONV ("__bool__" , numbers -> nb_bool , -1 , JWRAPPER_INQUIRY );
9401
- ADD_SLOT_CONV ("__invert__" , numbers -> nb_invert , -1 , JWRAPPER_UNARYFUNC );
9402
- ADD_SLOT_CONV ("__lshift__" , numbers -> nb_lshift , -2 , JWRAPPER_BINARYFUNC_L );
9403
- ADD_SLOT_CONV ("__rlshift__" , numbers -> nb_lshift , -2 , JWRAPPER_BINARYFUNC_R );
9404
- ADD_SLOT_CONV ("__rshift__" , numbers -> nb_rshift , -2 , JWRAPPER_BINARYFUNC_L );
9405
- ADD_SLOT_CONV ("__rrshift__" , numbers -> nb_rshift , -2 , JWRAPPER_BINARYFUNC_R );
9406
- ADD_SLOT_CONV ("__and__" , numbers -> nb_and , -2 , JWRAPPER_BINARYFUNC_L );
9407
- ADD_SLOT_CONV ("__rand__" , numbers -> nb_and , -2 , JWRAPPER_BINARYFUNC_R );
9408
- ADD_SLOT_CONV ("__xor__" , numbers -> nb_xor , -2 , JWRAPPER_BINARYFUNC_L );
9409
- ADD_SLOT_CONV ("__rxor__" , numbers -> nb_xor , -2 , JWRAPPER_BINARYFUNC_R );
9410
- ADD_SLOT_CONV ("__or__" , numbers -> nb_or , -2 , JWRAPPER_BINARYFUNC_L );
9411
- ADD_SLOT_CONV ("__ror__" , numbers -> nb_or , -2 , JWRAPPER_BINARYFUNC_R );
9412
- ADD_SLOT_CONV ("__int__" , numbers -> nb_int , -1 , JWRAPPER_UNARYFUNC );
9413
- ADD_SLOT_CONV ("__float__" , numbers -> nb_float , -1 , JWRAPPER_UNARYFUNC );
9414
- ADD_SLOT_CONV ("__iadd__" , numbers -> nb_inplace_add , -2 , JWRAPPER_BINARYFUNC );
9415
- ADD_SLOT_CONV ("__isub__" , numbers -> nb_inplace_subtract , -2 , JWRAPPER_BINARYFUNC );
9416
- ADD_SLOT_CONV ("__imul__" , numbers -> nb_inplace_multiply , -2 , JWRAPPER_BINARYFUNC );
9417
- ADD_SLOT_CONV ("__imod__" , numbers -> nb_inplace_remainder , -2 , JWRAPPER_BINARYFUNC );
9418
- ADD_SLOT_CONV ("__ipow__" , numbers -> nb_inplace_power , -3 , JWRAPPER_TERNARYFUNC );
9419
- ADD_SLOT_CONV ("__ilshift__" , numbers -> nb_inplace_lshift , -2 , JWRAPPER_BINARYFUNC );
9420
- ADD_SLOT_CONV ("__irshift__" , numbers -> nb_inplace_rshift , -2 , JWRAPPER_BINARYFUNC );
9421
- ADD_SLOT_CONV ("__iand__" , numbers -> nb_inplace_and , -2 , JWRAPPER_BINARYFUNC );
9422
- ADD_SLOT_CONV ("__ixor__" , numbers -> nb_inplace_xor , -2 , JWRAPPER_BINARYFUNC );
9423
- ADD_SLOT_CONV ("__ior__" , numbers -> nb_inplace_or , -2 , JWRAPPER_BINARYFUNC );
9424
- ADD_SLOT_CONV ("__floordiv__" , numbers -> nb_floor_divide , -2 , JWRAPPER_BINARYFUNC_L );
9425
- ADD_SLOT_CONV ("__rfloordiv__" , numbers -> nb_floor_divide , -2 , JWRAPPER_BINARYFUNC_R );
9426
- ADD_SLOT_CONV ("__truediv__" , numbers -> nb_true_divide , -2 , JWRAPPER_BINARYFUNC_L );
9427
- ADD_SLOT_CONV ("__rtruediv__" , numbers -> nb_true_divide , -2 , JWRAPPER_BINARYFUNC_R );
9428
- ADD_SLOT_CONV ("__ifloordiv__" , numbers -> nb_inplace_floor_divide , -2 , JWRAPPER_BINARYFUNC );
9429
- ADD_SLOT_CONV ("__itruediv__" , numbers -> nb_inplace_true_divide , -2 , JWRAPPER_BINARYFUNC );
9430
- ADD_SLOT_CONV ("__index__" , numbers -> nb_index , -1 , JWRAPPER_UNARYFUNC );
9431
- ADD_SLOT_CONV ("__matmul__" , numbers -> nb_matrix_multiply , -2 , JWRAPPER_BINARYFUNC_L );
9432
- ADD_SLOT_CONV ("__rmatmul__" , numbers -> nb_matrix_multiply , -2 , JWRAPPER_BINARYFUNC_R );
9433
- ADD_SLOT_CONV ("__imatmul__" , numbers -> nb_inplace_matrix_multiply , -2 , JWRAPPER_BINARYFUNC_L );
9434
- }
9435
-
9436
- // 'tp_as_mapping' takes precedence over 'tp_as_sequence' !
9437
- PyMappingMethods * mappings = cls -> tp_as_mapping ;
9438
- if (mappings ) {
9439
- ADD_SLOT_CONV ("__len__" , mappings -> mp_length , -1 , JWRAPPER_LENFUNC );
9440
- ADD_SLOT_CONV ("__getitem__" , mappings -> mp_subscript , -2 , JWRAPPER_BINARYFUNC );
9441
- ADD_SLOT_CONV ("__setitem__" , mappings -> mp_ass_subscript , -3 , JWRAPPER_OBJOBJARGPROC );
9442
- ADD_SLOT_CONV ("__delitem__" , mappings -> mp_ass_subscript , -3 , JWRAPPER_MP_DELITEM );
9443
- }
9444
-
9445
- PySequenceMethods * sequences = cls -> tp_as_sequence ;
9446
- if (sequences ) {
9447
- // sequence functions first, so that the number functions take precendence
9448
- ADD_SLOT_CONV ("__len__" , sequences -> sq_length , -1 , JWRAPPER_LENFUNC );
9449
- ADD_SLOT_CONV ("__add__" , sequences -> sq_concat , -2 , JWRAPPER_BINARYFUNC );
9450
- ADD_SLOT_CONV ("__mul__" , sequences -> sq_repeat , -2 , JWRAPPER_SSIZE_ARG );
9451
- ADD_SLOT_CONV ("__rmul__" , sequences -> sq_repeat , -2 , JWRAPPER_SSIZE_ARG );
9452
- ADD_SLOT_CONV ("__getitem__" , sequences -> sq_item , -2 , JWRAPPER_GETITEM );
9453
- ADD_SLOT_CONV ("__setitem__" , sequences -> sq_ass_item , -3 , JWRAPPER_SETITEM );
9454
- ADD_SLOT_CONV ("__delitem__" , sequences -> sq_ass_item , -3 , JWRAPPER_DELITEM );
9455
- ADD_SLOT_CONV ("__contains__" , sequences -> sq_contains , -2 , JWRAPPER_OBJOBJPROC );
9456
- ADD_SLOT_CONV ("__iadd__" , sequences -> sq_inplace_concat , -2 , JWRAPPER_BINARYFUNC );
9457
- ADD_SLOT_CONV ("__imul__" , sequences -> sq_inplace_repeat , -2 , JWRAPPER_SSIZE_ARG );
9458
- }
9459
-
9460
- PyAsyncMethods * async = cls -> tp_as_async ;
9461
- if (async ) {
9462
- ADD_SLOT_CONV ("__await__" , async -> am_await , -1 , JWRAPPER_UNARYFUNC );
9463
- ADD_SLOT_CONV ("__aiter__" , async -> am_aiter , -1 , JWRAPPER_UNARYFUNC );
9464
- ADD_SLOT_CONV ("__anext__" , async -> am_anext , -1 , JWRAPPER_UNARYFUNC );
9465
- }
9466
-
9467
- PyBufferProcs * buffers = cls -> tp_as_buffer ;
9468
- if (buffers ) {
9469
- // TODO ...
9470
- }
9471
-
9472
- #undef ADD_SLOT_CONV
9473
- return 0 ;
9474
- }
0 commit comments