Feature or enhancement
The PyType_FromSpec family of functions provides a convenient and forward-compatible way mechanism for creating new types. It could in principle also be used to create callables providing a PEP-590 vector call interface, which has significant performance benefits for binding libraries (see the related discussion here).
One can already specify a member named __vectorcalloffset__ in PyType_FromSpec. This isn't fully working in the limited API, however. I encountered the following problems.
- The
Py_TPFLAGS_HAVE_VECTORCALL flag is not part of the limited API.
- The
PyVectorcall_NARGS() helper function is not part of the limited API.
- One would normally set
tp_call to the compatibility dispatch routine PyVectorcall_Call. It is, however, also not part of the public ABI.
- Leaving
tp_call unspecified is not an option. PyType_Ready() even throws an exception in type_ready_pre_checks() when tp_call is unspecified.
Pitch
I propose the following changes:
- Adding
Py_TPFLAGS_HAVE_VECTORCALL, PyVectorcall_NARGS(), and PyVectorcall_Call() to the limited API.
- Redundant, but nice: Setting
tp_call to PyVectorcall_Call when PyType_Ready encounters a type that doesn't have this field set.
Note that vector calls can be received and performed. This issue is just about the receiving end.
Previous discussion
See the discord thread https://discuss.python.org/t/ideas-for-forward-compatible-and-fast-extension-libraries-in-python-3-12/15993/12.
Feature or enhancement
The
PyType_FromSpecfamily of functions provides a convenient and forward-compatible way mechanism for creating new types. It could in principle also be used to create callables providing a PEP-590 vector call interface, which has significant performance benefits for binding libraries (see the related discussion here).One can already specify a member named
__vectorcalloffset__inPyType_FromSpec. This isn't fully working in the limited API, however. I encountered the following problems.Py_TPFLAGS_HAVE_VECTORCALLflag is not part of the limited API.PyVectorcall_NARGS()helper function is not part of the limited API.tp_callto the compatibility dispatch routinePyVectorcall_Call. It is, however, also not part of the public ABI.tp_callunspecified is not an option.PyType_Ready()even throws an exception intype_ready_pre_checks()whentp_callis unspecified.Pitch
I propose the following changes:
Py_TPFLAGS_HAVE_VECTORCALL,PyVectorcall_NARGS(), andPyVectorcall_Call()to the limited API.tp_calltoPyVectorcall_CallwhenPyType_Readyencounters a type that doesn't have this field set.Note that vector calls can be received and performed. This issue is just about the receiving end.
Previous discussion
See the discord thread https://discuss.python.org/t/ideas-for-forward-compatible-and-fast-extension-libraries-in-python-3-12/15993/12.