@@ -26,6 +26,7 @@ custom_converter(PyObject *obj, custom_t *val)
2626static PyTypeObject VcNew_Type ;
2727static PyTypeObject VcInit_Type ;
2828static PyTypeObject VcNewExact_Type ;
29+ static PyTypeObject VcKwOnly_Type ;
2930#include "clinic/_testclinic.c.h"
3031
3132
@@ -2407,6 +2408,38 @@ static PyTypeObject VcNewExact_Type = {
24072408};
24082409
24092410
2411+ /* VcKwOnly: @vectorcall + keyword-only arg.
2412+ * Exercises the no-kwnames==NULL-fast-path branch of the vectorcall codegen:
2413+ * the vectorcall function delegates unconditionally to the helper because the
2414+ * keyword-only parameter rules out the positional-only fast path. */
2415+
2416+ /*[clinic input]
2417+ class _testclinic.VcKwOnly "PyObject *" "&VcKwOnly_Type"
2418+ @classmethod
2419+ @vectorcall
2420+ _testclinic.VcKwOnly.__new__ as vc_kwonly_new
2421+ a: object
2422+ *
2423+ b: object = None
2424+ [clinic start generated code]*/
2425+
2426+ static PyObject *
2427+ vc_kwonly_new_impl (PyTypeObject * type , PyObject * a , PyObject * b )
2428+ /*[clinic end generated code: output=00417079caa234dc input=68c863b55575a9e1]*/
2429+ {
2430+ return type -> tp_alloc (type , 0 );
2431+ }
2432+
2433+ static PyTypeObject VcKwOnly_Type = {
2434+ PyVarObject_HEAD_INIT (NULL , 0 )
2435+ .tp_name = "_testclinic.VcKwOnly" ,
2436+ .tp_basicsize = sizeof (PyObject ),
2437+ .tp_flags = Py_TPFLAGS_DEFAULT ,
2438+ .tp_new = vc_kwonly_new ,
2439+ .tp_vectorcall = vc_kwonly_vectorcall ,
2440+ };
2441+
2442+
24102443
24112444/*[clinic input]
24122445output push
@@ -2636,6 +2669,9 @@ PyInit__testclinic(void)
26362669 if (PyModule_AddType (m , & VcNewExact_Type ) < 0 ) {
26372670 goto error ;
26382671 }
2672+ if (PyModule_AddType (m , & VcKwOnly_Type ) < 0 ) {
2673+ goto error ;
2674+ }
26392675 return m ;
26402676
26412677error :
0 commit comments