Commit 463b86a8 authored by Victor Stinner's avatar Victor Stinner

Issue #27809: Use _PyObject_FastCallDict()

Modify:

* init_subclass()
* builtin___build_class__()

Fix also a bug in init_subclass(): check for super() failure.
parent 155ea65e
...@@ -7007,30 +7007,28 @@ set_names(PyTypeObject *type) ...@@ -7007,30 +7007,28 @@ set_names(PyTypeObject *type)
static int static int
init_subclass(PyTypeObject *type, PyObject *kwds) init_subclass(PyTypeObject *type, PyObject *kwds)
{ {
PyObject *super, *func, *tmp, *tuple; PyObject *super, *func, *result;
PyObject *args[2] = {(PyObject *)type, (PyObject *)type};
super = _PyObject_FastCall((PyObject *)&PySuper_Type, args, 2);
if (super == NULL) {
return -1;
}
super = PyObject_CallFunctionObjArgs((PyObject *) &PySuper_Type,
type, type, NULL);
func = _PyObject_GetAttrId(super, &PyId___init_subclass__); func = _PyObject_GetAttrId(super, &PyId___init_subclass__);
Py_DECREF(super); Py_DECREF(super);
if (func == NULL) {
if (func == NULL)
return -1; 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) result = _PyObject_FastCallDict(func, NULL, 0, kwds);
Py_DECREF(func);
if (result == NULL) {
return -1; return -1;
}
Py_DECREF(tmp); Py_DECREF(result);
return 0; return 0;
} }
......
...@@ -155,16 +155,8 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -155,16 +155,8 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
} }
} }
else { else {
PyObject *pargs = PyTuple_Pack(2, name, bases); PyObject *pargs[2] = {name, bases};
if (pargs == NULL) { ns = _PyObject_FastCallDict(prep, pargs, 2, mkw);
Py_DECREF(prep);
Py_DECREF(meta);
Py_XDECREF(mkw);
Py_DECREF(bases);
return NULL;
}
ns = PyEval_CallObjectWithKeywords(prep, pargs, mkw);
Py_DECREF(pargs);
Py_DECREF(prep); Py_DECREF(prep);
} }
if (ns == NULL) { if (ns == NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment