@@ -21,6 +21,13 @@ custom_converter(PyObject *obj, custom_t *val)
2121}
2222
2323
24+ /* Forward declarations for vectorcall exemplar types, needed because
25+ * clinic/_testclinic.c.h is included before the type definitions. */
26+ static PyTypeObject VcNew_Type ;
27+ static PyTypeObject VcInit_Type ;
28+ static PyTypeObject VcNewExact_Type ;
29+ static PyTypeObject VcNewZeroArg_Type ;
30+
2431#include "clinic/_testclinic.c.h"
2532
2633
@@ -2314,6 +2321,133 @@ output pop
23142321/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e7c7c42daced52b0]*/
23152322
23162323
2324+ /*
2325+ * Vectorcall exemplars.
2326+ *
2327+ * Each type exercises a different @vectorcall code-generation path.
2328+ * There is one type per exemplar because tp_vectorcall is a single slot.
2329+ */
2330+
2331+
2332+ /* --- VcNew: @vectorcall on __new__, single pos-or-kw optional
2333+ * (general + kw fast-path, METHOD_NEW finale) --- */
2334+
2335+ /*[clinic input]
2336+ class _testclinic.VcNew "PyObject *" "&VcNew_Type"
2337+ @classmethod
2338+ @vectorcall
2339+ _testclinic.VcNew.__new__ as vc_plain_new
2340+ a: object = None
2341+ [clinic start generated code]*/
2342+
2343+ static PyObject *
2344+ vc_plain_new_impl (PyTypeObject * type , PyObject * a )
2345+ /*[clinic end generated code: output=55b273e9797a3013 input=e15d88606280badc]*/
2346+ {
2347+ return type -> tp_alloc (type , 0 );
2348+ }
2349+
2350+ static PyTypeObject VcNew_Type = {
2351+ PyVarObject_HEAD_INIT (NULL , 0 )
2352+ .tp_name = "_testclinic.VcNew" ,
2353+ .tp_basicsize = sizeof (PyObject ),
2354+ .tp_flags = Py_TPFLAGS_DEFAULT ,
2355+ .tp_new = vc_plain_new ,
2356+ .tp_vectorcall = vc_plain_vectorcall ,
2357+ };
2358+
2359+
2360+ /* --- VcInit: @vectorcall on __init__, pos-only + pos-or-kw optional
2361+ * (general + kw fast-path) --- */
2362+
2363+ /*[clinic input]
2364+ class _testclinic.VcInit "PyObject *" "&VcInit_Type"
2365+ @vectorcall
2366+ _testclinic.VcInit.__init__ as vc_posorkw_init
2367+ a: object
2368+ /
2369+ b: object = None
2370+ [clinic start generated code]*/
2371+
2372+ static int
2373+ vc_posorkw_init_impl (PyObject * self , PyObject * a , PyObject * b )
2374+ /*[clinic end generated code: output=6018424ba9fb0744 input=25e4c2b792040c31]*/
2375+ {
2376+ return 0 ;
2377+ }
2378+
2379+ static PyTypeObject VcInit_Type = {
2380+ PyVarObject_HEAD_INIT (NULL , 0 )
2381+ .tp_name = "_testclinic.VcInit" ,
2382+ .tp_basicsize = sizeof (PyObject ),
2383+ .tp_flags = Py_TPFLAGS_DEFAULT ,
2384+ .tp_new = PyType_GenericNew ,
2385+ .tp_init = vc_posorkw_init ,
2386+ .tp_vectorcall = vc_posorkw_vectorcall ,
2387+ };
2388+
2389+
2390+ /* --- VcNewExact: @vectorcall exact_only on __new__, pos-only required +
2391+ * pos-or-kw optional (general + kw fast-path + exact_only guard) --- */
2392+
2393+ /*[clinic input]
2394+ class _testclinic.VcNewExact "PyObject *" "&VcNewExact_Type"
2395+ @classmethod
2396+ @vectorcall exact_only
2397+ _testclinic.VcNewExact.__new__ as vc_exact_new
2398+ a: object
2399+ /
2400+ b: object = None
2401+ [clinic start generated code]*/
2402+
2403+ static PyObject *
2404+ vc_exact_new_impl (PyTypeObject * type , PyObject * a , PyObject * b )
2405+ /*[clinic end generated code: output=e88217e36443b698 input=ea86a1ab634c93a6]*/
2406+ {
2407+ return type -> tp_alloc (type , 0 );
2408+ }
2409+
2410+ static PyTypeObject VcNewExact_Type = {
2411+ PyVarObject_HEAD_INIT (NULL , 0 )
2412+ .tp_name = "_testclinic.VcNewExact" ,
2413+ .tp_basicsize = sizeof (PyObject ),
2414+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE ,
2415+ .tp_new = vc_exact_new ,
2416+ .tp_vectorcall = vc_exact_vectorcall ,
2417+ };
2418+
2419+
2420+ /* --- VcNewZeroArg: @vectorcall zero_arg on __new__, pos-only optional +
2421+ * kw-only optional (general path, no kw fast-path + zero_arg) --- */
2422+
2423+ /*[clinic input]
2424+ class _testclinic.VcNewZeroArg "PyObject *" "&VcNewZeroArg_Type"
2425+ @classmethod
2426+ @vectorcall zero_arg=Py_NewRef(Py_None)
2427+ _testclinic.VcNewZeroArg.__new__ as vc_zeroarg_new
2428+ a: object = None
2429+ /
2430+ *
2431+ b: object = None
2432+ [clinic start generated code]*/
2433+
2434+ static PyObject *
2435+ vc_zeroarg_new_impl (PyTypeObject * type , PyObject * a , PyObject * b )
2436+ /*[clinic end generated code: output=6425b64d61c6317a input=f3d3ba860fc40034]*/
2437+ {
2438+ return type -> tp_alloc (type , 0 );
2439+ }
2440+
2441+ static PyTypeObject VcNewZeroArg_Type = {
2442+ PyVarObject_HEAD_INIT (NULL , 0 )
2443+ .tp_name = "_testclinic.VcNewZeroArg" ,
2444+ .tp_basicsize = sizeof (PyObject ),
2445+ .tp_flags = Py_TPFLAGS_DEFAULT ,
2446+ .tp_new = vc_zeroarg_new ,
2447+ .tp_vectorcall = vc_zeroarg_vectorcall ,
2448+ };
2449+
2450+
23172451/*[clinic input]
23182452output push
23192453destination kwarg new file '{dirname}/clinic/_testclinic_kwds.c.h'
@@ -2533,6 +2667,18 @@ PyInit__testclinic(void)
25332667 if (PyModule_AddType (m , & DeprKwdInitNoInline ) < 0 ) {
25342668 goto error ;
25352669 }
2670+ if (PyModule_AddType (m , & VcNew_Type ) < 0 ) {
2671+ goto error ;
2672+ }
2673+ if (PyModule_AddType (m , & VcInit_Type ) < 0 ) {
2674+ goto error ;
2675+ }
2676+ if (PyModule_AddType (m , & VcNewExact_Type ) < 0 ) {
2677+ goto error ;
2678+ }
2679+ if (PyModule_AddType (m , & VcNewZeroArg_Type ) < 0 ) {
2680+ goto error ;
2681+ }
25362682 return m ;
25372683
25382684error :
0 commit comments