bpo-32836: Remove obsolete code from symtable pass (GH-5680)
When comprehensions switched to using a nested scope, the old code for generating a temporary name to hold the accumulation target became redundant, but was never actually removed. Patch by Nitish Chandra.
This commit is contained in:
parent
6b5df906af
commit
3a087beddd
|
@ -60,7 +60,6 @@ typedef struct _symtable_entry {
|
||||||
int ste_col_offset; /* offset of first line of block */
|
int ste_col_offset; /* offset of first line of block */
|
||||||
int ste_opt_lineno; /* lineno of last exec or import * */
|
int ste_opt_lineno; /* lineno of last exec or import * */
|
||||||
int ste_opt_col_offset; /* offset of last exec or import * */
|
int ste_opt_col_offset; /* offset of last exec or import * */
|
||||||
int ste_tmpname; /* counter for listcomp temp vars */
|
|
||||||
struct symtable *ste_table;
|
struct symtable *ste_table;
|
||||||
} PySTEntryObject;
|
} PySTEntryObject;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Don't use temporary variables in cases of list/dict/set comprehensions
|
|
@ -69,7 +69,6 @@ ste_new(struct symtable *st, identifier name, _Py_block_ty block,
|
||||||
ste->ste_varkeywords = 0;
|
ste->ste_varkeywords = 0;
|
||||||
ste->ste_opt_lineno = 0;
|
ste->ste_opt_lineno = 0;
|
||||||
ste->ste_opt_col_offset = 0;
|
ste->ste_opt_col_offset = 0;
|
||||||
ste->ste_tmpname = 0;
|
|
||||||
ste->ste_lineno = lineno;
|
ste->ste_lineno = lineno;
|
||||||
ste->ste_col_offset = col_offset;
|
ste->ste_col_offset = col_offset;
|
||||||
|
|
||||||
|
@ -1082,24 +1081,6 @@ error:
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
symtable_new_tmpname(struct symtable *st)
|
|
||||||
{
|
|
||||||
char tmpname[256];
|
|
||||||
identifier tmp;
|
|
||||||
|
|
||||||
PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
|
|
||||||
++st->st_cur->ste_tmpname);
|
|
||||||
tmp = PyUnicode_InternFromString(tmpname);
|
|
||||||
if (!tmp)
|
|
||||||
return 0;
|
|
||||||
if (!symtable_add_def(st, tmp, DEF_LOCAL))
|
|
||||||
return 0;
|
|
||||||
Py_DECREF(tmp);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
symtable_record_directive(struct symtable *st, identifier name, stmt_ty s)
|
symtable_record_directive(struct symtable *st, identifier name, stmt_ty s)
|
||||||
{
|
{
|
||||||
|
@ -1723,7 +1704,6 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e,
|
||||||
expr_ty elt, expr_ty value)
|
expr_ty elt, expr_ty value)
|
||||||
{
|
{
|
||||||
int is_generator = (e->kind == GeneratorExp_kind);
|
int is_generator = (e->kind == GeneratorExp_kind);
|
||||||
int needs_tmp = !is_generator;
|
|
||||||
comprehension_ty outermost = ((comprehension_ty)
|
comprehension_ty outermost = ((comprehension_ty)
|
||||||
asdl_seq_GET(generators, 0));
|
asdl_seq_GET(generators, 0));
|
||||||
/* Outermost iterator is evaluated in current scope */
|
/* Outermost iterator is evaluated in current scope */
|
||||||
|
@ -1742,11 +1722,6 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e,
|
||||||
symtable_exit_block(st, (void *)e);
|
symtable_exit_block(st, (void *)e);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* Allocate temporary name if needed */
|
|
||||||
if (needs_tmp && !symtable_new_tmpname(st)) {
|
|
||||||
symtable_exit_block(st, (void *)e);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
VISIT(st, expr, outermost->target);
|
VISIT(st, expr, outermost->target);
|
||||||
VISIT_SEQ(st, expr, outermost->ifs);
|
VISIT_SEQ(st, expr, outermost->ifs);
|
||||||
VISIT_SEQ_TAIL(st, comprehension, generators, 1);
|
VISIT_SEQ_TAIL(st, comprehension, generators, 1);
|
||||||
|
|
Loading…
Reference in New Issue