:c:func:`PyObject_Vectorcall` will usually be most efficient.
-.. note::
-
- In CPython 3.8, the vectorcall API and related functions were available
- provisionally under names with a leading underscore:
- ``_PyObject_Vectorcall``, ``_Py_TPFLAGS_HAVE_VECTORCALL``,
- ``_PyObject_VectorcallMethod``, ``_PyVectorcall_Function``,
- ``_PyObject_CallOneArg``, ``_PyObject_CallMethodNoArgs``,
- ``_PyObject_CallMethodOneArg``.
- Additionally, ``PyObject_VectorcallDict`` was available as
- ``_PyObject_FastCallDict``.
- The old names are still defined as aliases of the new, non-underscored names.
-
-
Recursion Control
.................
/* === Vectorcall protocol (PEP 590) ============================= */
-// Call callable using tp_call. Arguments are like PyObject_Vectorcall()
-// or PyObject_FastCallDict() (both forms are supported),
+// Call callable using tp_call. Arguments are like PyObject_Vectorcall(),
// except that nargs is plainly the number of arguments without flags.
//
// Export for shared stdlib extensions like the math extension,
}
-static inline PyObject *
-_PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func,
- PyObject *const *args, Py_ssize_t nargs)
-{
- EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func);
- return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL);
-}
-
extern PyObject *const *
_PyStack_UnpackDict(PyThreadState *tstate,
PyObject *const *args, Py_ssize_t nargs,
call_trampoline(PyThreadState *tstate, PyObject* callback,
PyFrameObject *frame, int what, PyObject *arg)
{
-
- PyObject *stack[3];
- stack[0] = (PyObject *)frame;
- stack[1] = whatstrings[what];
- stack[2] = (arg != NULL) ? arg : Py_None;
-
/* Discard any previous modifications the frame's fast locals */
if (frame->f_fast_as_locals) {
if (PyFrame_FastToLocalsWithError(frame) < 0) {
}
/* call the Python-level function */
- PyObject *result = _PyObject_FastCallTstate(tstate, callback, stack, 3);
+ if (arg == NULL) {
+ arg = Py_None;
+ }
+ PyObject *args[3] = {(PyObject *)frame, whatstrings[what], arg};
+ PyObject *result = _PyObject_VectorcallTstate(tstate, callback, args, 3, NULL);
PyFrame_LocalsToFast(frame, 1);
return result;