Mercurial > cpython-lru_cache-weakref
diff Python/symtable.c @ 77181:96ab78ef82a7
Close #14857: fix regression in references to PEP 3135 implicit __class__ closure variable. Reopens issue #12370, but also updates unittest.mock to workaround that issue
| author | Nick Coghlan <ncoghlan@gmail.com> |
|---|---|
| date | Sun, 27 May 2012 18:17:07 +1000 |
| parents | e1177b9167ce |
| children | a29854168241 |
line wrap: on
line diff
--- a/Python/symtable.c Sun May 27 17:49:58 2012 +1000 +++ b/Python/symtable.c Sun May 27 18:17:07 2012 +1000 @@ -221,17 +221,10 @@ struct symtable * PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) { - struct symtable *st; + struct symtable *st = symtable_new(); asdl_seq *seq; int i; - if (__class__ == NULL) { - __class__ = PyUnicode_InternFromString("@__class__"); - if (__class__ == NULL) - return NULL; - } - - st = symtable_new(); if (st == NULL) return st; st->st_filename = filename; @@ -747,6 +740,8 @@ } else { /* Special-case __class__ */ + if (!GET_IDENTIFIER(__class__)) + goto error; assert(PySet_Contains(local, __class__) == 1); if (PySet_Add(newbound, __class__) < 0) goto error; @@ -784,7 +779,7 @@ NULL)) goto error; else if (ste->ste_type == ClassBlock && !analyze_cells(scopes, newfree, - "@__class__")) + "__class__")) goto error; /* Records the results of the analysis in the symbol table entry */ if (!update_symbols(ste->ste_symbols, scopes, bound, newfree, @@ -1111,7 +1106,8 @@ if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock, (void *)s, s->lineno, s->col_offset)) return 0; - if (!symtable_add_def(st, __class__, DEF_LOCAL) || + if (!GET_IDENTIFIER(__class__) || + !symtable_add_def(st, __class__, DEF_LOCAL) || !GET_IDENTIFIER(__locals__) || !symtable_add_def(st, __locals__, DEF_PARAM)) { symtable_exit_block(st, s); @@ -1376,7 +1372,8 @@ if (e->v.Name.ctx == Load && st->st_cur->ste_type == FunctionBlock && !PyUnicode_CompareWithASCIIString(e->v.Name.id, "super")) { - if (!symtable_add_def(st, __class__, USE)) + if (!GET_IDENTIFIER(__class__) || + !symtable_add_def(st, __class__, USE)) return 0; } break;
