mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Add _PyObject_FastCall()
Issue #27128: Add _PyObject_FastCall(), a new calling convention avoiding a temporary tuple to pass positional parameters in most cases, but create a temporary tuple if needed (ex: for the tp_call slot). The API is prepared to support keyword parameters, but the full implementation will come later (_PyFunction_FastCall() doesn't support keyword parameters yet). Add also: * _PyStack_AsTuple() helper function: convert a "stack" of parameters to a tuple. * _PyCFunction_FastCall(): fast call implementation for C functions * _PyFunction_FastCall(): fast call implementation for Python functions
This commit is contained in:
parent
fa46aa7899
commit
9be7e7b52f
6 changed files with 314 additions and 49 deletions
|
@ -267,10 +267,26 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
|
|||
PyObject *args, PyObject *kw);
|
||||
|
||||
#ifndef Py_LIMITED_API
|
||||
PyAPI_FUNC(PyObject*) _PyStack_AsTuple(PyObject **stack,
|
||||
Py_ssize_t nargs);
|
||||
|
||||
/* Call the callable object func with the "fast call" calling convention:
|
||||
args is a C array for positional parameters (nargs is the number of
|
||||
positional paramater), kwargs is a dictionary for keyword parameters.
|
||||
|
||||
If nargs is equal to zero, args can be NULL. kwargs can be NULL.
|
||||
nargs must be greater or equal to zero.
|
||||
|
||||
Return the result on success. Raise an exception on return NULL on
|
||||
error. */
|
||||
PyAPI_FUNC(PyObject *) _PyObject_FastCall(PyObject *func,
|
||||
PyObject **args, int nargs,
|
||||
PyObject *kwargs);
|
||||
|
||||
PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *func,
|
||||
PyObject *result,
|
||||
const char *where);
|
||||
#endif
|
||||
#endif /* Py_LIMITED_API */
|
||||
|
||||
/*
|
||||
Call a callable Python object, callable_object, with
|
||||
|
|
|
@ -58,6 +58,13 @@ PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *);
|
|||
PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *);
|
||||
PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *);
|
||||
|
||||
#ifndef Py_LIMITED_API
|
||||
PyAPI_FUNC(PyObject *) _PyFunction_FastCall(
|
||||
PyObject *func,
|
||||
PyObject **args, int nargs,
|
||||
PyObject *kwargs);
|
||||
#endif
|
||||
|
||||
/* Macros for direct access to these values. Type checks are *not*
|
||||
done, so use with care. */
|
||||
#define PyFunction_GET_CODE(func) \
|
||||
|
|
|
@ -37,6 +37,12 @@ PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *);
|
|||
#endif
|
||||
PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *);
|
||||
|
||||
#ifndef Py_LIMITED_API
|
||||
PyAPI_FUNC(PyObject *) _PyCFunction_FastCall(PyObject *func,
|
||||
PyObject **args, int nargs,
|
||||
PyObject *kwargs);
|
||||
#endif
|
||||
|
||||
struct PyMethodDef {
|
||||
const char *ml_name; /* The name of the built-in function/method */
|
||||
PyCFunction ml_meth; /* The C function that implements it */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue