summaryrefslogtreecommitdiff
path: root/Python/bltinmodule.c
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2016-09-11 14:45:49 +1000
committerNick Coghlan <ncoghlan@gmail.com>2016-09-11 14:45:49 +1000
commit944368e1cc90a0bebaaf1a0a6f4346a81d8f46ad (patch)
treeea2c59fec386dfbe32c0f53ba8a85f75860e554d /Python/bltinmodule.c
parentfc3f7d56773b3816eb0e8f4151239a0983aedb2c (diff)
downloadcpython-git-944368e1cc90a0bebaaf1a0a6f4346a81d8f46ad.tar.gz
Issue #23722: Initialize __class__ from type.__new__()
The __class__ cell used by zero-argument super() is now initialized from type.__new__ rather than __build_class__, so class methods relying on that will now work correctly when called from metaclass methods during class creation. Patch by Martin Teichmann.
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r--Python/bltinmodule.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index da9ad55ce8..cee013f57b 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -54,7 +54,7 @@ _Py_IDENTIFIER(stderr);
static PyObject *
builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
{
- PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns, *cell;
+ PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns, *none;
PyObject *cls = NULL;
Py_ssize_t nargs;
int isclass = 0; /* initialize to prevent gcc warning */
@@ -167,15 +167,13 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
Py_DECREF(bases);
return NULL;
}
- cell = PyEval_EvalCodeEx(PyFunction_GET_CODE(func), PyFunction_GET_GLOBALS(func), ns,
+ none = PyEval_EvalCodeEx(PyFunction_GET_CODE(func), PyFunction_GET_GLOBALS(func), ns,
NULL, 0, NULL, 0, NULL, 0, NULL,
PyFunction_GET_CLOSURE(func));
- if (cell != NULL) {
+ if (none != NULL) {
PyObject *margs[3] = {name, bases, ns};
cls = _PyObject_FastCallDict(meta, margs, 3, mkw);
- if (cls != NULL && PyCell_Check(cell))
- PyCell_Set(cell, cls);
- Py_DECREF(cell);
+ Py_DECREF(none);
}
Py_DECREF(ns);
Py_DECREF(meta);