#define _PyObject_CallArg1(func, arg) \
_PyObject_FastCall((func), &(arg), 1)
- /* Call the callable object func with the "fast call" calling convention:
- args is a C array for positional arguments followed by (key, value)
- pairs for keyword arguments.
-
- nargs is the number of positional parameters at the beginning of stack.
- nkwargs is the number of (key, value) pairs at the end of stack.
-
- If nargs and nkwargs are equal to zero, stack can be NULL.
-
- Return the result on success. Raise an exception and return NULL on
- error. */
- PyAPI_FUNC(PyObject *) _PyObject_FastCallKeywords(
- PyObject *func,
- PyObject **stack,
- Py_ssize_t nargs,
- Py_ssize_t nkwargs);
-
PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend(PyObject *func,
PyObject *obj, PyObject *args,
PyObject *kwargs);
PyObject **args,
Py_ssize_t nargs,
PyObject *kwargs);
-
-PyAPI_FUNC(PyObject *) _PyFunction_FastCallKeywords(
- PyObject *func,
- PyObject **stack,
- Py_ssize_t nargs,
- Py_ssize_t nkwargs);
#endif
/* Macros for direct access to these values. Type checks are *not*
return kwdict;
}
-PyObject *
-_PyObject_FastCallKeywords(PyObject *func, PyObject **stack, Py_ssize_t nargs,
- Py_ssize_t nkwargs)
-{
- PyObject *args, *kwdict, *result;
-
- /* _PyObject_FastCallKeywords() must not be called with an exception set,
- because it may clear it (directly or indirectly) and so the
- caller loses its exception */
- assert(!PyErr_Occurred());
-
- assert(func != NULL);
- assert(nargs >= 0);
- assert(nkwargs >= 0);
- assert((nargs == 0 && nkwargs == 0) || stack != NULL);
-
- if (PyFunction_Check(func)) {
- /* Fast-path: avoid temporary tuple or dict */
- return _PyFunction_FastCallKeywords(func, stack, nargs, nkwargs);
- }
-
- if (PyCFunction_Check(func) && nkwargs == 0) {
- return _PyCFunction_FastCallDict(func, stack, nargs, NULL);
- }
-
- /* Slow-path: build temporary tuple and/or dict */
- args = _PyStack_AsTuple(stack, nargs);
-
- if (nkwargs > 0) {
- kwdict = _PyStack_AsDict(stack + nargs, nkwargs, func);
- if (kwdict == NULL) {
- Py_DECREF(args);
- return NULL;
- }
- }
- else {
- kwdict = NULL;
- }
-
- result = PyObject_Call(func, args, kwdict);
- Py_DECREF(args);
- Py_XDECREF(kwdict);
- return result;
-}
-
/* Positional arguments are obj followed args. */
PyObject *
_PyObject_Call_Prepend(PyObject *func,
#else
static PyObject * call_function(PyObject ***, int);
#endif
+static PyObject * fast_function(PyObject *, PyObject **, Py_ssize_t, Py_ssize_t);
static PyObject * do_call(PyObject *, PyObject ***, Py_ssize_t, Py_ssize_t);
static PyObject * ext_do_call(PyObject *, PyObject ***, int, Py_ssize_t, Py_ssize_t);
static PyObject * update_keyword_args(PyObject *, Py_ssize_t, PyObject ***,
}
READ_TIMESTAMP(*pintr0);
if (PyFunction_Check(func)) {
- x = _PyFunction_FastCallKeywords(func, (*pp_stack) - n, nargs, nkwargs);
+ x = fast_function(func, (*pp_stack) - n, nargs, nkwargs);
}
else {
x = do_call(func, pp_stack, nargs, nkwargs);
/* Clear the stack of the function object. Also removes
the arguments in case they weren't consumed already
- (_PyFunction_FastCallKeywords() and err_args() leave them on the stack).
+ (fast_function() and err_args() leave them on the stack).
*/
while ((*pp_stack) > pfunc) {
w = EXT_POP(*pp_stack);
return x;
}
-/* The _PyFunction_FastCallKeywords() function optimize calls for which no argument
+/* The fast_function() function optimize calls for which no argument
tuple is necessary; the objects are passed directly from the stack.
For the simplest case -- a function that takes only positional
arguments and is called with only positional arguments -- it
/* Similar to _PyFunction_FastCall() but keywords are passed a (key, value)
pairs in stack */
-PyObject *
-_PyFunction_FastCallKeywords(PyObject *func, PyObject **stack,
- Py_ssize_t nargs, Py_ssize_t nkwargs)
+static PyObject *
+fast_function(PyObject *func, PyObject **stack, Py_ssize_t nargs, Py_ssize_t nkwargs)
{
PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
PyObject *globals = PyFunction_GET_GLOBALS(func);