@@ -12,9 +12,10 @@ typedef struct {
12
12
PyObject * origin ;
13
13
PyObject * args ;
14
14
PyObject * parameters ;
15
- PyObject * weakreflist ;
15
+ PyObject * weakreflist ;
16
16
// Whether we're a starred type, e.g. *tuple[int].
17
17
bool starred ;
18
+ vectorcallfunc vectorcall ;
18
19
} gaobject ;
19
20
20
21
typedef struct {
@@ -383,13 +384,11 @@ ga_hash(PyObject *self)
383
384
return h0 ^ h1 ;
384
385
}
385
386
386
- static PyObject *
387
- ga_call (PyObject * self , PyObject * args , PyObject * kwds )
387
+ static inline PyObject *
388
+ set_orig_class (PyObject * obj , PyObject * self )
388
389
{
389
- gaobject * alias = (gaobject * )self ;
390
- PyObject * obj = PyObject_Call (alias -> origin , args , kwds );
391
390
if (obj != NULL ) {
392
- if (PyObject_SetAttrString (obj , " __orig_class__" , self ) < 0 ) {
391
+ if (PyObject_SetAttr (obj , & _Py_ID ( __orig_class__ ) , self ) < 0 ) {
393
392
if (!PyErr_ExceptionMatches (PyExc_AttributeError ) &&
394
393
!PyErr_ExceptionMatches (PyExc_TypeError ))
395
394
{
@@ -402,6 +401,23 @@ ga_call(PyObject *self, PyObject *args, PyObject *kwds)
402
401
return obj ;
403
402
}
404
403
404
+ static PyObject *
405
+ ga_call (PyObject * self , PyObject * args , PyObject * kwds )
406
+ {
407
+ gaobject * alias = (gaobject * )self ;
408
+ PyObject * obj = PyObject_Call (alias -> origin , args , kwds );
409
+ return set_orig_class (obj , self );
410
+ }
411
+
412
+ static PyObject *
413
+ ga_vectorcall (PyObject * self , PyObject * const * args ,
414
+ size_t nargsf , PyObject * kwnames )
415
+ {
416
+ gaobject * alias = (gaobject * ) self ;
417
+ PyObject * obj = PyVectorcall_Function (alias -> origin )(alias -> origin , args , nargsf , kwnames );
418
+ return set_orig_class (obj , self );
419
+ }
420
+
405
421
static const char * const attr_exceptions [] = {
406
422
"__origin__" ,
407
423
"__args__" ,
@@ -588,6 +604,14 @@ setup_ga(gaobject *alias, PyObject *origin, PyObject *args) {
588
604
alias -> args = args ;
589
605
alias -> parameters = NULL ;
590
606
alias -> weakreflist = NULL ;
607
+
608
+ if (PyVectorcall_Function (origin ) != NULL ) {
609
+ alias -> vectorcall = ga_vectorcall ;
610
+ }
611
+ else {
612
+ alias -> vectorcall = NULL ;
613
+ }
614
+
591
615
return 1 ;
592
616
}
593
617
@@ -695,7 +719,7 @@ PyTypeObject Py_GenericAliasType = {
695
719
.tp_hash = ga_hash ,
696
720
.tp_call = ga_call ,
697
721
.tp_getattro = ga_getattro ,
698
- .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE ,
722
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL ,
699
723
.tp_traverse = ga_traverse ,
700
724
.tp_richcompare = ga_richcompare ,
701
725
.tp_weaklistoffset = offsetof(gaobject , weakreflist ),
@@ -706,6 +730,7 @@ PyTypeObject Py_GenericAliasType = {
706
730
.tp_free = PyObject_GC_Del ,
707
731
.tp_getset = ga_properties ,
708
732
.tp_iter = (getiterfunc )ga_iter ,
733
+ .tp_vectorcall_offset = offsetof(gaobject , vectorcall ),
709
734
};
710
735
711
736
PyObject *
0 commit comments