mirror of
https://github.com/python/cpython.git
synced 2024-12-02 06:14:49 +08:00
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
This commit is contained in:
parent
99b2533539
commit
944d3eb154
@ -12,6 +12,11 @@
|
|||||||
*
|
*
|
||||||
* Note that compiler_mod() suggests module, but the module ast type
|
* Note that compiler_mod() suggests module, but the module ast type
|
||||||
* (mod_ty) has cases for expressions and interactive statements.
|
* (mod_ty) has cases for expressions and interactive statements.
|
||||||
|
*
|
||||||
|
* CAUTION: The VISIT_* macros abort the current function when they encounter
|
||||||
|
* a problem. So don't invoke them when there is memory which needs to be
|
||||||
|
* released. Code blocks are OK, as the compiler structure takes care of
|
||||||
|
* releasing those.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
@ -1990,13 +1995,15 @@ static int
|
|||||||
compiler_lambda(struct compiler *c, expr_ty e)
|
compiler_lambda(struct compiler *c, expr_ty e)
|
||||||
{
|
{
|
||||||
PyCodeObject *co;
|
PyCodeObject *co;
|
||||||
identifier name;
|
static identifier name;
|
||||||
arguments_ty args = e->v.Lambda.args;
|
arguments_ty args = e->v.Lambda.args;
|
||||||
assert(e->kind == Lambda_kind);
|
assert(e->kind == Lambda_kind);
|
||||||
|
|
||||||
name = PyString_InternFromString("<lambda>");
|
if (!name) {
|
||||||
if (!name)
|
name = PyString_InternFromString("<lambda>");
|
||||||
return 0;
|
if (!name)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (args->defaults)
|
if (args->defaults)
|
||||||
VISIT_SEQ(c, expr, args->defaults);
|
VISIT_SEQ(c, expr, args->defaults);
|
||||||
@ -2015,7 +2022,6 @@ compiler_lambda(struct compiler *c, expr_ty e)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
|
compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
|
||||||
Py_DECREF(name);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -3168,15 +3174,17 @@ compiler_genexp_generator(struct compiler *c,
|
|||||||
static int
|
static int
|
||||||
compiler_genexp(struct compiler *c, expr_ty e)
|
compiler_genexp(struct compiler *c, expr_ty e)
|
||||||
{
|
{
|
||||||
PyObject *name;
|
static identifier name;
|
||||||
PyCodeObject *co;
|
PyCodeObject *co;
|
||||||
expr_ty outermost_iter = ((comprehension_ty)
|
expr_ty outermost_iter = ((comprehension_ty)
|
||||||
(asdl_seq_GET(e->v.GeneratorExp.generators,
|
(asdl_seq_GET(e->v.GeneratorExp.generators,
|
||||||
0)))->iter;
|
0)))->iter;
|
||||||
|
|
||||||
name = PyString_FromString("<generator expression>");
|
if (!name) {
|
||||||
if (!name)
|
name = PyString_FromString("<genexpr>");
|
||||||
return 0;
|
if (!name)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
|
if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
|
||||||
return 0;
|
return 0;
|
||||||
@ -3191,8 +3199,6 @@ compiler_genexp(struct compiler *c, expr_ty e)
|
|||||||
VISIT(c, expr, outermost_iter);
|
VISIT(c, expr, outermost_iter);
|
||||||
ADDOP(c, GET_ITER);
|
ADDOP(c, GET_ITER);
|
||||||
ADDOP_I(c, CALL_FUNCTION, 1);
|
ADDOP_I(c, CALL_FUNCTION, 1);
|
||||||
Py_DECREF(name);
|
|
||||||
Py_DECREF(co);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user