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