From 59543347d12a7717235f941e7fd363d4df92984a Mon Sep 17 00:00:00 2001 From: Jeroen Demeyer Date: Tue, 18 Jun 2019 13:05:41 +0200 Subject: bpo-37151: remove _PyFunction_FastCallDict (GH-13864) --- Include/funcobject.h | 6 ---- Objects/call.c | 88 ---------------------------------------------------- Objects/funcobject.c | 13 +------- 3 files changed, 1 insertion(+), 106 deletions(-) diff --git a/Include/funcobject.h b/Include/funcobject.h index e563a74..c6dd67d 100644 --- a/Include/funcobject.h +++ b/Include/funcobject.h @@ -60,12 +60,6 @@ PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( - PyObject *func, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs); - PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall( PyObject *func, PyObject *const *stack, diff --git a/Objects/call.c b/Objects/call.c index f9a3207..75dbd6f 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -304,94 +304,6 @@ function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs PyObject * -_PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs) -{ - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *kwdefs, *closure, *name, *qualname; - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd, nk; - PyObject *result; - - assert(func != NULL); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - assert(kwargs == NULL || PyDict_Check(kwargs)); - - if (co->co_kwonlyargcount == 0 && - (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) && - (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) - { - /* Fast paths */ - if (argdefs == NULL && co->co_argcount == nargs) { - return function_code_fastcall(co, args, nargs, globals); - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == PyTuple_GET_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = _PyTuple_ITEMS(argdefs); - return function_code_fastcall(co, args, PyTuple_GET_SIZE(argdefs), - globals); - } - } - - nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0; - if (nk != 0) { - Py_ssize_t pos, i; - - /* bpo-29318, bpo-27840: Caller and callee functions must not share - the dictionary: kwargs must be copied. */ - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - return NULL; - } - - k = _PyTuple_ITEMS(kwtuple); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - /* We must hold strong references because keyword arguments can be - indirectly modified while the function is called: - see issue #2016 and test_extcall */ - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - assert(i / 2 == nk); - } - else { - kwtuple = NULL; - k = NULL; - } - - kwdefs = PyFunction_GET_KW_DEFAULTS(func); - closure = PyFunction_GET_CLOSURE(func); - name = ((PyFunctionObject *)func) -> func_name; - qualname = ((PyFunctionObject *)func) -> func_qualname; - - if (argdefs != NULL) { - d = _PyTuple_ITEMS(argdefs); - nd = PyTuple_GET_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } - - result = _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL, - args, nargs, - k, k != NULL ? k + 1 : NULL, nk, 2, - d, nd, kwdefs, - closure, name, qualname); - Py_XDECREF(kwtuple); - return result; -} - - -PyObject * _PyFunction_Vectorcall(PyObject *func, PyObject* const* stack, size_t nargsf, PyObject *kwnames) { diff --git a/Objects/funcobject.c b/Objects/funcobject.c index df5cc2d..a65c1f4 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -622,17 +622,6 @@ func_traverse(PyFunctionObject *f, visitproc visit, void *arg) return 0; } -static PyObject * -function_call(PyObject *func, PyObject *args, PyObject *kwargs) -{ - PyObject **stack; - Py_ssize_t nargs; - - stack = _PyTuple_ITEMS(args); - nargs = PyTuple_GET_SIZE(args); - return _PyFunction_FastCallDict(func, stack, nargs, kwargs); -} - /* Bind a function to an object */ static PyObject * func_descr_get(PyObject *func, PyObject *obj, PyObject *type) @@ -659,7 +648,7 @@ PyTypeObject PyFunction_Type = { 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ - function_call, /* tp_call */ + PyVectorcall_Call, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ -- cgit v0.12