summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeroen Demeyer <J.Demeyer@UGent.be>2019-06-18 11:05:41 (GMT)
committerInada Naoki <songofacandy@gmail.com>2019-06-18 11:05:41 (GMT)
commit59543347d12a7717235f941e7fd363d4df92984a (patch)
treee1f2ba54fe86cf9010bb30d997839073e7dae4bd
parentd8f336fdc10decdd82d3bc81a63aea8be149c0c8 (diff)
downloadcpython-59543347d12a7717235f941e7fd363d4df92984a.zip
cpython-59543347d12a7717235f941e7fd363d4df92984a.tar.gz
cpython-59543347d12a7717235f941e7fd363d4df92984a.tar.bz2
bpo-37151: remove _PyFunction_FastCallDict (GH-13864)
-rw-r--r--Include/funcobject.h6
-rw-r--r--Objects/call.c88
-rw-r--r--Objects/funcobject.c13
3 files changed, 1 insertions, 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 */