@@ -32,6 +32,105 @@ LimitedVectorCallClass_new(PyTypeObject *tp, PyTypeObject *a, PyTypeObject *kw)
3232 return self ;
3333}
3434
35+ static PyObject *
36+ call_vectorcall (PyObject * self , PyObject * callable )
37+ {
38+ PyObject * args [3 ] = { NULL , NULL , NULL };
39+ PyObject * kwname = NULL , * kwnames = NULL , * result = NULL ;
40+
41+ args [1 ] = PyUnicode_FromString ("foo" );
42+ if (!args [1 ]) {
43+ goto leave ;
44+ }
45+
46+ args [2 ] = PyUnicode_FromString ("bar" );
47+ if (!args [2 ]) {
48+ goto leave ;
49+ }
50+
51+ kwname = PyUnicode_InternFromString ("baz" );
52+ if (!kwname ) {
53+ goto leave ;
54+ }
55+
56+ kwnames = PyTuple_New (1 );
57+ if (!kwnames ) {
58+ goto leave ;
59+ }
60+
61+ if (PyTuple_SetItem (kwnames , 0 , kwname )) {
62+ goto leave ;
63+ }
64+
65+ result = PyObject_Vectorcall (
66+ callable ,
67+ args + 1 ,
68+ 1 | PY_VECTORCALL_ARGUMENTS_OFFSET ,
69+ kwnames
70+ );
71+
72+ leave :
73+ Py_XDECREF (args [1 ]);
74+ Py_XDECREF (args [2 ]);
75+ Py_XDECREF (kwnames );
76+
77+ return result ;
78+ }
79+
80+ static PyObject *
81+ call_vectorcall_method (PyObject * self , PyObject * callable )
82+ {
83+ PyObject * args [3 ] = { NULL , NULL , NULL };
84+ PyObject * name = NULL , * kwname = NULL ,
85+ * kwnames = NULL , * result = NULL ;
86+
87+ name = PyUnicode_FromString ("f" );
88+ if (!name ) {
89+ goto leave ;
90+ }
91+
92+ args [0 ] = callable ;
93+ args [1 ] = PyUnicode_FromString ("foo" );
94+ if (!args [1 ]) {
95+ goto leave ;
96+ }
97+
98+ args [2 ] = PyUnicode_FromString ("bar" );
99+ if (!args [2 ]) {
100+ goto leave ;
101+ }
102+
103+ kwname = PyUnicode_InternFromString ("baz" );
104+ if (!kwname ) {
105+ goto leave ;
106+ }
107+
108+ kwnames = PyTuple_New (1 );
109+ if (!kwnames ) {
110+ goto leave ;
111+ }
112+
113+ if (PyTuple_SetItem (kwnames , 0 , kwname )) {
114+ goto leave ;
115+ }
116+
117+
118+ result = PyObject_VectorcallMethod (
119+ name ,
120+ args ,
121+ 2 | PY_VECTORCALL_ARGUMENTS_OFFSET ,
122+ kwnames
123+ );
124+
125+ leave :
126+ Py_XDECREF (name );
127+ Py_XDECREF (args [1 ]);
128+ Py_XDECREF (args [2 ]);
129+ Py_XDECREF (kwnames );
130+
131+ return result ;
132+ }
133+
35134static PyMemberDef LimitedVectorCallClass_members [] = {
36135 {"__vectorcalloffset__" , T_PYSSIZET , sizeof (PyObject ), READONLY },
37136 {NULL }
@@ -54,10 +153,8 @@ static PyType_Spec LimitedVectorCallClass_spec = {
54153};
55154
56155static PyMethodDef TestMethods [] = {
57- /* Add module methods here.
58- * (Empty list left here as template/example, since using
59- * PyModule_AddFunctions isn't very common.)
60- */
156+ {"call_vectorcall" , call_vectorcall , METH_O },
157+ {"call_vectorcall_method" , call_vectorcall_method , METH_O },
61158 {NULL },
62159};
63160
0 commit comments