diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2016-09-11 14:45:49 +1000 |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2016-09-11 14:45:49 +1000 |
commit | 0780d6cb0e6e406d0030dee40156a6dd00066147 (patch) | |
tree | 0d2f017d3c398d69513e81b31c2a489252f6acc6 /Python/compile.c | |
parent | 84f77c2f0f78aca1337ab3ddc00dff10fedfcad1 (diff) | |
download | cpython-0780d6cb0e6e406d0030dee40156a6dd00066147.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/compile.c')
-rw-r--r-- | Python/compile.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/Python/compile.c b/Python/compile.c index 36683d30e1..4631dbbf18 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1968,7 +1968,7 @@ compiler_class(struct compiler *c, stmt_ty s) return 0; } if (c->u->u_ste->ste_needs_class_closure) { - /* return the (empty) __class__ cell */ + /* store __classcell__ into class namespace */ str = PyUnicode_InternFromString("__class__"); if (str == NULL) { compiler_exit_scope(c); @@ -1981,15 +1981,20 @@ compiler_class(struct compiler *c, stmt_ty s) return 0; } assert(i == 0); - /* Return the cell where to store __class__ */ + ADDOP_I(c, LOAD_CLOSURE, i); + str = PyUnicode_InternFromString("__classcell__"); + if (!str || !compiler_nameop(c, str, Store)) { + Py_XDECREF(str); + compiler_exit_scope(c); + return 0; + } + Py_DECREF(str); } else { + /* This happens when nobody references the cell. */ assert(PyDict_Size(c->u->u_cellvars) == 0); - /* This happens when nobody references the cell. Return None. */ - ADDOP_O(c, LOAD_CONST, Py_None, consts); } - ADDOP_IN_SCOPE(c, RETURN_VALUE); /* create the code object */ co = assemble(c, 1); } |