diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2016-09-11 04:45:49 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2016-09-11 04:45:49 (GMT) |
commit | 944368e1cc90a0bebaaf1a0a6f4346a81d8f46ad (patch) | |
tree | ea2c59fec386dfbe32c0f53ba8a85f75860e554d /Python/bltinmodule.c | |
parent | fc3f7d56773b3816eb0e8f4151239a0983aedb2c (diff) | |
download | cpython-944368e1cc90a0bebaaf1a0a6f4346a81d8f46ad.zip cpython-944368e1cc90a0bebaaf1a0a6f4346a81d8f46ad.tar.gz cpython-944368e1cc90a0bebaaf1a0a6f4346a81d8f46ad.tar.bz2 |
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.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index da9ad55..cee013f 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); |