summaryrefslogtreecommitdiffstats
path: root/Python/symtable.c
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2012-05-27 08:17:07 (GMT)
committerNick Coghlan <ncoghlan@gmail.com>2012-05-27 08:17:07 (GMT)
commit0b43bcf5287d9494e3332b391350fcd32fe93f2c (patch)
tree4afedcf7ea32b14bb3c9a46fb8fd9532e9344bd0 /Python/symtable.c
parent5c6eba3a93ce5fe989e372a8b12f535c72fc4e8f (diff)
downloadcpython-0b43bcf5287d9494e3332b391350fcd32fe93f2c.zip
cpython-0b43bcf5287d9494e3332b391350fcd32fe93f2c.tar.gz
cpython-0b43bcf5287d9494e3332b391350fcd32fe93f2c.tar.bz2
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
Diffstat (limited to 'Python/symtable.c')
-rw-r--r--Python/symtable.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/Python/symtable.c b/Python/symtable.c
index b622835..a0b786b 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -221,17 +221,10 @@ symtable_new(void)
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 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
}
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 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
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 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
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 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
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;