changeset: 102844:15eab21bf934 user: Victor Stinner date: Mon Aug 22 23:21:55 2016 +0200 files: Objects/descrobject.c Python/bltinmodule.c description: Issue #27809: Use _PyObject_FastCallDict() Modify: * builtin_sorted() * classmethoddescr_call() * methoddescr_call() * wrapperdescr_call() diff -r 7924eac912fe -r 15eab21bf934 Objects/descrobject.c --- a/Objects/descrobject.c Mon Aug 22 23:17:30 2016 +0200 +++ b/Objects/descrobject.c Mon Aug 22 23:21:55 2016 +0200 @@ -213,7 +213,7 @@ methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds) { Py_ssize_t argc; - PyObject *self, *func, *result; + PyObject *self, *func, *result, **stack; /* Make sure that the first argument is acceptable as 'self' */ assert(PyTuple_Check(args)); @@ -242,13 +242,8 @@ func = PyCFunction_NewEx(descr->d_method, self, NULL); if (func == NULL) return NULL; - args = PyTuple_GetSlice(args, 1, argc); - if (args == NULL) { - Py_DECREF(func); - return NULL; - } - result = PyEval_CallObjectWithKeywords(func, args, kwds); - Py_DECREF(args); + stack = &PyTuple_GET_ITEM(args, 1); + result = _PyObject_FastCallDict(func, stack, argc - 1, kwds); Py_DECREF(func); return result; } @@ -258,7 +253,7 @@ PyObject *kwds) { Py_ssize_t argc; - PyObject *self, *func, *result; + PyObject *self, *func, *result, **stack; /* Make sure that the first argument is acceptable as 'self' */ assert(PyTuple_Check(args)); @@ -295,14 +290,9 @@ func = PyCFunction_NewEx(descr->d_method, self, NULL); if (func == NULL) return NULL; - args = PyTuple_GetSlice(args, 1, argc); - if (args == NULL) { - Py_DECREF(func); - return NULL; - } - result = PyEval_CallObjectWithKeywords(func, args, kwds); + stack = &PyTuple_GET_ITEM(args, 1); + result = _PyObject_FastCallDict(func, stack, argc - 1, kwds); Py_DECREF(func); - Py_DECREF(args); return result; } @@ -310,7 +300,7 @@ wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds) { Py_ssize_t argc; - PyObject *self, *func, *result; + PyObject *self, *func, *result, **stack; /* Make sure that the first argument is acceptable as 'self' */ assert(PyTuple_Check(args)); @@ -339,13 +329,9 @@ func = PyWrapper_New((PyObject *)descr, self); if (func == NULL) return NULL; - args = PyTuple_GetSlice(args, 1, argc); - if (args == NULL) { - Py_DECREF(func); - return NULL; - } - result = PyEval_CallObjectWithKeywords(func, args, kwds); - Py_DECREF(args); + + stack = &PyTuple_GET_ITEM(args, 1); + result = _PyObject_FastCallDict(func, stack, argc - 1, kwds); Py_DECREF(func); return result; } diff -r 7924eac912fe -r 15eab21bf934 Python/bltinmodule.c --- a/Python/bltinmodule.c Mon Aug 22 23:17:30 2016 +0200 +++ b/Python/bltinmodule.c Mon Aug 22 23:21:55 2016 +0200 @@ -2087,10 +2087,11 @@ static PyObject * builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds) { - PyObject *newlist, *v, *seq, *keyfunc=NULL, *newargs; + PyObject *newlist, *v, *seq, *keyfunc=NULL, **newargs; PyObject *callable; static char *kwlist[] = {"iterable", "key", "reverse", 0}; int reverse; + int nargs; /* args 1-3 should match listsort in Objects/listobject.c */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted", @@ -2107,15 +2108,9 @@ return NULL; } - newargs = PyTuple_GetSlice(args, 1, 4); - if (newargs == NULL) { - Py_DECREF(newlist); - Py_DECREF(callable); - return NULL; - } - - v = PyObject_Call(callable, newargs, kwds); - Py_DECREF(newargs); + newargs = &PyTuple_GET_ITEM(args, 1); + nargs = PyTuple_GET_SIZE(args) - 1; + v = _PyObject_FastCallDict(callable, newargs, nargs, kwds); Py_DECREF(callable); if (v == NULL) { Py_DECREF(newlist);