diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2019-10-14 04:18:05 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-14 04:18:05 (GMT) |
commit | fd5c414880b2e05720b9cf14ab0b0d7ae2b7d925 (patch) | |
tree | eedbde8610788bd4ea9577b0aa94f1af10cde089 /Python/symtable.c | |
parent | 8a6cbf8adb68aa2c43a48769af92e50d5ca1539d (diff) | |
download | cpython-fd5c414880b2e05720b9cf14ab0b0d7ae2b7d925.zip cpython-fd5c414880b2e05720b9cf14ab0b0d7ae2b7d925.tar.gz cpython-fd5c414880b2e05720b9cf14ab0b0d7ae2b7d925.tar.bz2 |
bpo-38469: Handle named expression scope with global/nonlocal keywords (GH-16755)
The symbol table handing of PEP572's assignment expressions is not resolving correctly the scope of some variables in presence of global/nonlocal keywords in conjunction with comprehensions.
Diffstat (limited to 'Python/symtable.c')
-rw-r--r-- | Python/symtable.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/Python/symtable.c b/Python/symtable.c index f2453db..b871358 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1467,10 +1467,16 @@ symtable_extend_namedexpr_scope(struct symtable *st, expr_ty e) continue; } - /* If we find a FunctionBlock entry, add as NONLOCAL/LOCAL */ + /* If we find a FunctionBlock entry, add as GLOBAL/LOCAL or NONLOCAL/LOCAL */ if (ste->ste_type == FunctionBlock) { - if (!symtable_add_def(st, target_name, DEF_NONLOCAL)) - VISIT_QUIT(st, 0); + long target_in_scope = _PyST_GetSymbol(ste, target_name); + if (target_in_scope & DEF_GLOBAL) { + if (!symtable_add_def(st, target_name, DEF_GLOBAL)) + VISIT_QUIT(st, 0); + } else { + if (!symtable_add_def(st, target_name, DEF_NONLOCAL)) + VISIT_QUIT(st, 0); + } if (!symtable_record_directive(st, target_name, e->lineno, e->col_offset)) VISIT_QUIT(st, 0); |