From 463b86a881ab9afc4c24f4a669582626977708d7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 22 Aug 2016 23:33:13 +0200 Subject: [PATCH] Issue #27809: Use _PyObject_FastCallDict() Modify: * init_subclass() * builtin___build_class__() Fix also a bug in init_subclass(): check for super() failure. --- Objects/typeobject.c | 34 ++++++++++++++++------------------ Python/bltinmodule.c | 12 ++---------- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 544d0b5f4ed..63bfd667477 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -7007,30 +7007,28 @@ set_names(PyTypeObject *type) static int init_subclass(PyTypeObject *type, PyObject *kwds) { - PyObject *super, *func, *tmp, *tuple; + PyObject *super, *func, *result; + PyObject *args[2] = {(PyObject *)type, (PyObject *)type}; - super = PyObject_CallFunctionObjArgs((PyObject *) &PySuper_Type, - type, type, NULL); - func = _PyObject_GetAttrId(super, &PyId___init_subclass__); - Py_DECREF(super); - - if (func == NULL) + super = _PyObject_FastCall((PyObject *)&PySuper_Type, args, 2); + if (super == NULL) { return -1; - - tuple = PyTuple_New(0); - if (tuple == NULL) { - Py_DECREF(func); - return 0; } - tmp = PyObject_Call(func, tuple, kwds); - Py_DECREF(tuple); - Py_DECREF(func); - - if (tmp == NULL) + func = _PyObject_GetAttrId(super, &PyId___init_subclass__); + Py_DECREF(super); + if (func == NULL) { return -1; + } - Py_DECREF(tmp); + + result = _PyObject_FastCallDict(func, NULL, 0, kwds); + Py_DECREF(func); + if (result == NULL) { + return -1; + } + + Py_DECREF(result); return 0; } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 1cdc0e2563a..b22867eb073 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -155,16 +155,8 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) } } else { - PyObject *pargs = PyTuple_Pack(2, name, bases); - if (pargs == NULL) { - Py_DECREF(prep); - Py_DECREF(meta); - Py_XDECREF(mkw); - Py_DECREF(bases); - return NULL; - } - ns = PyEval_CallObjectWithKeywords(prep, pargs, mkw); - Py_DECREF(pargs); + PyObject *pargs[2] = {name, bases}; + ns = _PyObject_FastCallDict(prep, pargs, 2, mkw); Py_DECREF(prep); } if (ns == NULL) {