symtable.c 55.8 KB
Newer Older
1
#include "Python.h"
Jeremy Hylton's avatar
Jeremy Hylton committed
2 3
#include "Python-ast.h"
#include "code.h"
4 5 6
#include "symtable.h"
#include "structmember.h"

7
/* error strings used for warnings */
Jeremy Hylton's avatar
Jeremy Hylton committed
8 9
#define GLOBAL_AFTER_ASSIGN \
"name '%.400s' is assigned to before global declaration"
10

11 12 13
#define NONLOCAL_AFTER_ASSIGN \
"name '%.400s' is assigned to before nonlocal declaration"

Jeremy Hylton's avatar
Jeremy Hylton committed
14 15
#define GLOBAL_AFTER_USE \
"name '%.400s' is used prior to global declaration"
16

17 18 19
#define NONLOCAL_AFTER_USE \
"name '%.400s' is used prior to nonlocal declaration"

20 21
#define IMPORT_STAR_WARNING "import * only allowed at module level"

22
static PySTEntryObject *
23
ste_new(struct symtable *st, identifier name, _Py_block_ty block,
24
        void *key, int lineno, int col_offset)
25
{
26
    PySTEntryObject *ste = NULL;
27
    PyObject *k = NULL;
28 29 30 31 32

    k = PyLong_FromVoidPtr(key);
    if (k == NULL)
        goto fail;
    ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
33 34
    if (ste == NULL) {
        Py_DECREF(k);
35
        goto fail;
36
    }
37
    ste->ste_table = st;
38
    ste->ste_id = k; /* ste owns reference to k */
39 40

    Py_INCREF(name);
41
    ste->ste_name = name;
42 43 44 45 46

    ste->ste_symbols = NULL;
    ste->ste_varnames = NULL;
    ste->ste_children = NULL;

47 48
    ste->ste_directives = NULL;

49 50 51 52 53 54
    ste->ste_type = block;
    ste->ste_nested = 0;
    ste->ste_free = 0;
    ste->ste_varargs = 0;
    ste->ste_varkeywords = 0;
    ste->ste_opt_lineno = 0;
55
    ste->ste_opt_col_offset = 0;
56
    ste->ste_tmpname = 0;
57
    ste->ste_lineno = lineno;
58
    ste->ste_col_offset = col_offset;
59 60 61 62 63 64 65 66

    if (st->st_cur != NULL &&
        (st->st_cur->ste_nested ||
         st->st_cur->ste_type == FunctionBlock))
        ste->ste_nested = 1;
    ste->ste_child_free = 0;
    ste->ste_generator = 0;
    ste->ste_returns_value = 0;
67
    ste->ste_needs_class_closure = 0;
68

69 70 71 72 73 74 75 76
    ste->ste_symbols = PyDict_New();
    ste->ste_varnames = PyList_New(0);
    ste->ste_children = PyList_New(0);
    if (ste->ste_symbols == NULL
        || ste->ste_varnames == NULL
        || ste->ste_children == NULL)
        goto fail;

77 78 79 80
    if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0)
        goto fail;

    return ste;
81
 fail:
82 83
    Py_XDECREF(ste);
    return NULL;
84 85 86
}

static PyObject *
Jeremy Hylton's avatar
Jeremy Hylton committed
87
ste_repr(PySTEntryObject *ste)
88
{
89 90 91
    return PyUnicode_FromFormat("<symtable entry %U(%ld), line %d>",
                                ste->ste_name,
                                PyLong_AS_LONG(ste->ste_id), ste->ste_lineno);
92 93 94
}

static void
Jeremy Hylton's avatar
Jeremy Hylton committed
95
ste_dealloc(PySTEntryObject *ste)
96
{
97 98 99 100 101 102
    ste->ste_table = NULL;
    Py_XDECREF(ste->ste_id);
    Py_XDECREF(ste->ste_name);
    Py_XDECREF(ste->ste_symbols);
    Py_XDECREF(ste->ste_varnames);
    Py_XDECREF(ste->ste_children);
103
    Py_XDECREF(ste->ste_directives);
104
    PyObject_Del(ste);
105 106
}

Jeremy Hylton's avatar
Jeremy Hylton committed
107
#define OFF(x) offsetof(PySTEntryObject, x)
108

109
static PyMemberDef ste_memberlist[] = {
110 111 112 113 114 115 116 117 118
    {"id",       T_OBJECT, OFF(ste_id), READONLY},
    {"name",     T_OBJECT, OFF(ste_name), READONLY},
    {"symbols",  T_OBJECT, OFF(ste_symbols), READONLY},
    {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
    {"children", T_OBJECT, OFF(ste_children), READONLY},
    {"nested",   T_INT,    OFF(ste_nested), READONLY},
    {"type",     T_INT,    OFF(ste_type), READONLY},
    {"lineno",   T_INT,    OFF(ste_lineno), READONLY},
    {NULL}
119 120
};

Jeremy Hylton's avatar
Jeremy Hylton committed
121
PyTypeObject PySTEntry_Type = {
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "symtable entry",
    sizeof(PySTEntryObject),
    0,
    (destructor)ste_dealloc,                /* tp_dealloc */
    0,                                      /* tp_print */
    0,                                         /* tp_getattr */
    0,                                          /* tp_setattr */
    0,                                          /* tp_reserved */
    (reprfunc)ste_repr,                         /* tp_repr */
    0,                                          /* tp_as_number */
    0,                                          /* tp_as_sequence */
    0,                                          /* tp_as_mapping */
    0,                                          /* tp_hash */
    0,                                          /* tp_call */
    0,                                          /* tp_str */
    PyObject_GenericGetAttr,                    /* tp_getattro */
    0,                                          /* tp_setattro */
    0,                                          /* tp_as_buffer */
    Py_TPFLAGS_DEFAULT,                         /* tp_flags */
    0,                                          /* tp_doc */
    0,                                          /* tp_traverse */
    0,                                          /* tp_clear */
    0,                                          /* tp_richcompare */
    0,                                          /* tp_weaklistoffset */
    0,                                          /* tp_iter */
    0,                                          /* tp_iternext */
    0,                                          /* tp_methods */
    ste_memberlist,                             /* tp_members */
    0,                                          /* tp_getset */
    0,                                          /* tp_base */
    0,                                          /* tp_dict */
    0,                                          /* tp_descr_get */
    0,                                          /* tp_descr_set */
    0,                                          /* tp_dictoffset */
    0,                                          /* tp_init */
    0,                                          /* tp_alloc */
    0,                                          /* tp_new */
160
};
Jeremy Hylton's avatar
Jeremy Hylton committed
161 162

static int symtable_analyze(struct symtable *st);
163
static int symtable_warn(struct symtable *st, const char *msg, int lineno);
164
static int symtable_enter_block(struct symtable *st, identifier name,
165 166
                                _Py_block_ty block, void *ast, int lineno,
                                int col_offset);
Jeremy Hylton's avatar
Jeremy Hylton committed
167 168 169 170
static int symtable_exit_block(struct symtable *st, void *ast);
static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
static int symtable_visit_expr(struct symtable *st, expr_ty s);
static int symtable_visit_genexp(struct symtable *st, expr_ty s);
171 172
static int symtable_visit_listcomp(struct symtable *st, expr_ty s);
static int symtable_visit_setcomp(struct symtable *st, expr_ty s);
173
static int symtable_visit_dictcomp(struct symtable *st, expr_ty s);
Jeremy Hylton's avatar
Jeremy Hylton committed
174 175 176 177 178 179
static int symtable_visit_arguments(struct symtable *st, arguments_ty);
static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
static int symtable_visit_alias(struct symtable *st, alias_ty);
static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
static int symtable_visit_keyword(struct symtable *st, keyword_ty);
static int symtable_visit_slice(struct symtable *st, slice_ty);
180 181
static int symtable_visit_params(struct symtable *st, asdl_seq *args);
static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);
Jeremy Hylton's avatar
Jeremy Hylton committed
182
static int symtable_implicit_arg(struct symtable *st, int pos);
183
static int symtable_visit_annotations(struct symtable *st, stmt_ty s, arguments_ty, expr_ty);
184
static int symtable_visit_withitem(struct symtable *st, withitem_ty item);
Jeremy Hylton's avatar
Jeremy Hylton committed
185 186


187
static identifier top = NULL, lambda = NULL, genexpr = NULL,
188
    listcomp = NULL, setcomp = NULL, dictcomp = NULL,
189
    __class__ = NULL;
Jeremy Hylton's avatar
Jeremy Hylton committed
190 191

#define GET_IDENTIFIER(VAR) \
192
    ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR)))
Jeremy Hylton's avatar
Jeremy Hylton committed
193 194

#define DUPLICATE_ARGUMENT \
195
"duplicate argument '%U' in function definition"
Jeremy Hylton's avatar
Jeremy Hylton committed
196 197 198 199

static struct symtable *
symtable_new(void)
{
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
    struct symtable *st;

    st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
    if (st == NULL)
        return NULL;

    st->st_filename = NULL;
    st->st_blocks = NULL;

    if ((st->st_stack = PyList_New(0)) == NULL)
        goto fail;
    if ((st->st_blocks = PyDict_New()) == NULL)
        goto fail;
    st->st_cur = NULL;
    st->st_private = NULL;
    return st;
Jeremy Hylton's avatar
Jeremy Hylton committed
216
 fail:
217 218
    PySymtable_Free(st);
    return NULL;
Jeremy Hylton's avatar
Jeremy Hylton committed
219 220
}

221 222 223 224 225 226 227 228 229 230 231 232
/* When compiling the use of C stack is probably going to be a lot
   lighter than when executing Python code but still can overflow
   and causing a Python crash if not checked (e.g. eval("()"*300000)).
   Using the current recursion limit for the compiler seems too
   restrictive (it caused at least one test to fail) so a factor is
   used to allow deeper recursion when compiling an expression.

   Using a scaling factor means this should automatically adjust when
   the recursion limit is adjusted for small or large C stack allocations.
*/
#define COMPILER_STACK_FRAME_SCALE 3

Jeremy Hylton's avatar
Jeremy Hylton committed
233
struct symtable *
234
PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
Jeremy Hylton's avatar
Jeremy Hylton committed
235
{
236
    struct symtable *st = symtable_new();
237 238
    asdl_seq *seq;
    int i;
239
    PyThreadState *tstate;
240
    int recursion_limit = Py_GetRecursionLimit();
241 242

    if (st == NULL)
243 244 245 246 247 248
        return NULL;
    if (filename == NULL) {
        PySymtable_Free(st);
        return NULL;
    }
    Py_INCREF(filename);
249 250
    st->st_filename = filename;
    st->st_future = future;
251 252 253 254 255 256 257

    /* Setup recursion depth check counters */
    tstate = PyThreadState_GET();
    if (!tstate) {
        PySymtable_Free(st);
        return NULL;
    }
258 259 260 261 262
    /* Be careful here to prevent overflow. */
    st->recursion_depth = (tstate->recursion_depth < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
        tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE : tstate->recursion_depth;
    st->recursion_limit = (recursion_limit < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
        recursion_limit * COMPILER_STACK_FRAME_SCALE : recursion_limit;
263

264 265
    /* Make the initial symbol information gathering pass */
    if (!GET_IDENTIFIER(top) ||
266
        !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) {
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
        PySymtable_Free(st);
        return NULL;
    }

    st->st_top = st->st_cur;
    switch (mod->kind) {
    case Module_kind:
        seq = mod->v.Module.body;
        for (i = 0; i < asdl_seq_LEN(seq); i++)
            if (!symtable_visit_stmt(st,
                        (stmt_ty)asdl_seq_GET(seq, i)))
                goto error;
        break;
    case Expression_kind:
        if (!symtable_visit_expr(st, mod->v.Expression.body))
            goto error;
        break;
    case Interactive_kind:
        seq = mod->v.Interactive.body;
        for (i = 0; i < asdl_seq_LEN(seq); i++)
            if (!symtable_visit_stmt(st,
                        (stmt_ty)asdl_seq_GET(seq, i)))
                goto error;
        break;
    case Suite_kind:
        PyErr_SetString(PyExc_RuntimeError,
                        "this compiler does not handle Suites");
        goto error;
    }
    if (!symtable_exit_block(st, (void *)mod)) {
        PySymtable_Free(st);
        return NULL;
    }
    /* Make the second symbol analysis pass */
    if (symtable_analyze(st))
        return st;
    PySymtable_Free(st);
    return NULL;
Jeremy Hylton's avatar
Jeremy Hylton committed
305
 error:
306 307 308
    (void) symtable_exit_block(st, (void *)mod);
    PySymtable_Free(st);
    return NULL;
Jeremy Hylton's avatar
Jeremy Hylton committed
309 310
}

311 312 313 314 315 316 317 318 319 320 321 322 323
struct symtable *
PySymtable_Build(mod_ty mod, const char *filename_str, PyFutureFeatures *future)
{
    PyObject *filename;
    struct symtable *st;
    filename = PyUnicode_DecodeFSDefault(filename_str);
    if (filename == NULL)
        return NULL;
    st = PySymtable_BuildObject(mod, filename, future);
    Py_DECREF(filename);
    return st;
}

Jeremy Hylton's avatar
Jeremy Hylton committed
324 325 326
void
PySymtable_Free(struct symtable *st)
{
327
    Py_XDECREF(st->st_filename);
328 329 330
    Py_XDECREF(st->st_blocks);
    Py_XDECREF(st->st_stack);
    PyMem_Free((void *)st);
Jeremy Hylton's avatar
Jeremy Hylton committed
331 332 333 334 335
}

PySTEntryObject *
PySymtable_Lookup(struct symtable *st, void *key)
{
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
    PyObject *k, *v;

    k = PyLong_FromVoidPtr(key);
    if (k == NULL)
        return NULL;
    v = PyDict_GetItem(st->st_blocks, k);
    if (v) {
        assert(PySTEntry_Check(v));
        Py_INCREF(v);
    }
    else {
        PyErr_SetString(PyExc_KeyError,
                        "unknown symbol table entry");
    }

    Py_DECREF(k);
    return (PySTEntryObject *)v;
Jeremy Hylton's avatar
Jeremy Hylton committed
353 354
}

355
int
Jeremy Hylton's avatar
Jeremy Hylton committed
356 357
PyST_GetScope(PySTEntryObject *ste, PyObject *name)
{
358 359 360 361 362
    PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
    if (!v)
        return 0;
    assert(PyLong_Check(v));
    return (PyLong_AS_LONG(v) >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton's avatar
Jeremy Hylton committed
363 364
}

365 366 367 368 369 370
static int
error_at_directive(PySTEntryObject *ste, PyObject *name)
{
    Py_ssize_t i;
    PyObject *data;
    assert(ste->ste_directives);
371
    for (i = 0; i < PyList_GET_SIZE(ste->ste_directives); i++) {
372 373
        data = PyList_GET_ITEM(ste->ste_directives, i);
        assert(PyTuple_CheckExact(data));
374 375 376 377 378 379 380 381
        assert(PyUnicode_CheckExact(PyTuple_GET_ITEM(data, 0)));
        if (PyUnicode_Compare(PyTuple_GET_ITEM(data, 0), name) == 0) {
            PyErr_SyntaxLocationObject(ste->ste_table->st_filename,
                                       PyLong_AsLong(PyTuple_GET_ITEM(data, 1)),
                                       PyLong_AsLong(PyTuple_GET_ITEM(data, 2)));

            return 0;
        }   
382
    }
383 384
    PyErr_SetString(PyExc_RuntimeError,
                    "BUG: internal directive bookkeeping broken");
385 386 387
    return 0;
}

Jeremy Hylton's avatar
Jeremy Hylton committed
388 389 390

/* Analyze raw symbol information to determine scope of each name.

391
   The next several functions are helpers for symtable_analyze(),
392
   which determines whether a name is local, global, or free.  In addition,
Jeremy Hylton's avatar
Jeremy Hylton committed
393
   it determines which local variables are cell variables; they provide
394
   bindings that are used for free variables in enclosed blocks.
Jeremy Hylton's avatar
Jeremy Hylton committed
395

396
   There are also two kinds of global variables, implicit and explicit.  An
Jeremy Hylton's avatar
Jeremy Hylton committed
397 398 399 400 401 402 403 404 405
   explicit global is declared with the global statement.  An implicit
   global is a free variable for which the compiler has found no binding
   in an enclosing function scope.  The implicit global is either a global
   or a builtin.  Python's module and class blocks use the xxx_NAME opcodes
   to handle these names to implement slightly odd semantics.  In such a
   block, the name is treated as global until it is assigned to; then it
   is treated as a local.

   The symbol table requires two passes to determine the scope of each name.
406 407 408 409
   The first pass collects raw facts from the AST via the symtable_visit_*
   functions: the name is a parameter here, the name is used but not defined
   here, etc.  The second pass analyzes these facts during a pass over the
   PySTEntryObjects created during pass 1.
Jeremy Hylton's avatar
Jeremy Hylton committed
410 411

   When a function is entered during the second pass, the parent passes
412
   the set of all name bindings visible to its children.  These bindings
413
   are used to determine if non-local variables are free or implicit globals.
414 415 416 417
   Names which are explicitly declared nonlocal must exist in this set of
   visible names - if they do not, a syntax error is raised. After doing
   the local analysis, it analyzes each of its child blocks using an
   updated set of name bindings.
Jeremy Hylton's avatar
Jeremy Hylton committed
418

419 420 421 422 423
   The children update the free variable set.  If a local variable is added to
   the free variable set by the child, the variable is marked as a cell.  The
   function object being defined must provide runtime storage for the variable
   that may outlive the function's frame.  Cell variables are removed from the
   free set before the analyze function returns to its parent.
424

425 426 427 428 429 430 431
   During analysis, the names are:
      symbols: dict mapping from symbol names to flag values (including offset scope values)
      scopes: dict mapping from symbol names to scope values (no offset)
      local: set of all symbol names local to the current scope
      bound: set of all symbol names local to a containing function scope
      free: set of all symbol names referenced but not bound in child scopes
      global: set of all symbol names explicitly declared as global
Jeremy Hylton's avatar
Jeremy Hylton committed
432 433 434
*/

#define SET_SCOPE(DICT, NAME, I) { \
435 436 437 438 439 440 441 442
    PyObject *o = PyLong_FromLong(I); \
    if (!o) \
        return 0; \
    if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
        Py_DECREF(o); \
        return 0; \
    } \
    Py_DECREF(o); \
Jeremy Hylton's avatar
Jeremy Hylton committed
443 444 445 446
}

/* Decide on scope of name, given flags.

447 448 449
   The namespace dictionaries may be modified to record information
   about the new name.  For example, a new global will add an entry to
   global.  A name that was global can be changed to local.
Jeremy Hylton's avatar
Jeremy Hylton committed
450 451
*/

452
static int
453
analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
454 455
             PyObject *bound, PyObject *local, PyObject *free,
             PyObject *global)
Jeremy Hylton's avatar
Jeremy Hylton committed
456
{
457 458 459 460 461
    if (flags & DEF_GLOBAL) {
        if (flags & DEF_PARAM) {
            PyErr_Format(PyExc_SyntaxError,
                        "name '%U' is parameter and global",
                        name);
462
            return error_at_directive(ste, name);
463
        }
464
        if (flags & DEF_NONLOCAL) {
465 466 467
            PyErr_Format(PyExc_SyntaxError,
                         "name '%U' is nonlocal and global",
                         name);
468
            return error_at_directive(ste, name);
469 470 471 472 473 474 475 476 477 478 479 480 481
        }
        SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
        if (PySet_Add(global, name) < 0)
            return 0;
        if (bound && (PySet_Discard(bound, name) < 0))
            return 0;
        return 1;
    }
    if (flags & DEF_NONLOCAL) {
        if (flags & DEF_PARAM) {
            PyErr_Format(PyExc_SyntaxError,
                         "name '%U' is parameter and nonlocal",
                         name);
482
            return error_at_directive(ste, name);
483
        }
484 485 486
        if (!bound) {
            PyErr_Format(PyExc_SyntaxError,
                         "nonlocal declaration not allowed at module level");
487
            return error_at_directive(ste, name);
488 489 490 491 492 493
        }
        if (!PySet_Contains(bound, name)) {
            PyErr_Format(PyExc_SyntaxError,
                         "no binding for nonlocal '%U' found",
                         name);

494
            return error_at_directive(ste, name);
495 496 497 498 499 500
        }
        SET_SCOPE(scopes, name, FREE);
        ste->ste_free = 1;
        return PySet_Add(free, name) >= 0;
    }
    if (flags & DEF_BOUND) {
501
        SET_SCOPE(scopes, name, LOCAL);
502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
        if (PySet_Add(local, name) < 0)
            return 0;
        if (PySet_Discard(global, name) < 0)
            return 0;
        return 1;
    }
    /* If an enclosing block has a binding for this name, it
       is a free variable rather than a global variable.
       Note that having a non-NULL bound implies that the block
       is nested.
    */
    if (bound && PySet_Contains(bound, name)) {
        SET_SCOPE(scopes, name, FREE);
        ste->ste_free = 1;
        return PySet_Add(free, name) >= 0;
    }
    /* If a parent has a global statement, then call it global
       explicit?  It could also be global implicit.
     */
    if (global && PySet_Contains(global, name)) {
        SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
        return 1;
    }
    if (ste->ste_nested)
        ste->ste_free = 1;
    SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
529 530 531 532 533 534 535 536 537 538 539 540 541
}

#undef SET_SCOPE

/* If a name is defined in free and also in locals, then this block
   provides the binding for the free variable.  The name should be
   marked CELL in this block and removed from the free list.

   Note that the current block's free variables are included in free.
   That's safe because no name can be free and local in the same scope.
*/

static int
542
analyze_cells(PyObject *scopes, PyObject *free)
Jeremy Hylton's avatar
Jeremy Hylton committed
543
{
544 545 546 547 548 549 550 551 552 553 554
    PyObject *name, *v, *v_cell;
    int success = 0;
    Py_ssize_t pos = 0;

    v_cell = PyLong_FromLong(CELL);
    if (!v_cell)
        return 0;
    while (PyDict_Next(scopes, &pos, &name, &v)) {
        long scope;
        assert(PyLong_Check(v));
        scope = PyLong_AS_LONG(v);
555
        if (scope != LOCAL)
556 557 558 559 560 561 562 563 564 565 566 567 568
            continue;
        if (!PySet_Contains(free, name))
            continue;
        /* Replace LOCAL with CELL for this name, and remove
           from free. It is safe to replace the value of name
           in the dict, because it will not cause a resize.
         */
        if (PyDict_SetItem(scopes, name, v_cell) < 0)
            goto error;
        if (PySet_Discard(free, name) < 0)
            goto error;
    }
    success = 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
569
 error:
570 571
    Py_DECREF(v_cell);
    return success;
Jeremy Hylton's avatar
Jeremy Hylton committed
572 573
}

574 575 576 577 578 579 580 581 582 583 584 585 586 587
static int
drop_class_free(PySTEntryObject *ste, PyObject *free)
{
    int res;
    if (!GET_IDENTIFIER(__class__))
        return 0;
    res = PySet_Discard(free, __class__);
    if (res < 0)
        return 0;
    if (res)
        ste->ste_needs_class_closure = 1;
    return 1;
}

588 589
/* Enter the final scope information into the ste_symbols dict.
 *
Jeremy Hylton's avatar
Jeremy Hylton committed
590 591 592
 * All arguments are dicts.  Modifies symbols, others are read-only.
*/
static int
593
update_symbols(PyObject *symbols, PyObject *scopes,
594
               PyObject *bound, PyObject *free, int classflag)
Jeremy Hylton's avatar
Jeremy Hylton committed
595
{
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614
    PyObject *name = NULL, *itr = NULL;
    PyObject *v = NULL, *v_scope = NULL, *v_new = NULL, *v_free = NULL;
    Py_ssize_t pos = 0;

    /* Update scope information for all symbols in this scope */
    while (PyDict_Next(symbols, &pos, &name, &v)) {
        long scope, flags;
        assert(PyLong_Check(v));
        flags = PyLong_AS_LONG(v);
        v_scope = PyDict_GetItem(scopes, name);
        assert(v_scope && PyLong_Check(v_scope));
        scope = PyLong_AS_LONG(v_scope);
        flags |= (scope << SCOPE_OFFSET);
        v_new = PyLong_FromLong(flags);
        if (!v_new)
            return 0;
        if (PyDict_SetItem(symbols, name, v_new) < 0) {
            Py_DECREF(v_new);
            return 0;
Jeremy Hylton's avatar
Jeremy Hylton committed
615
        }
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667
        Py_DECREF(v_new);
    }

    /* Record not yet resolved free variables from children (if any) */
    v_free = PyLong_FromLong(FREE << SCOPE_OFFSET);
    if (!v_free)
        return 0;

    itr = PyObject_GetIter(free);
    if (!itr)
        goto error;

    while ((name = PyIter_Next(itr))) {
        v = PyDict_GetItem(symbols, name);

        /* Handle symbol that already exists in this scope */
        if (v) {
            /* Handle a free variable in a method of
               the class that has the same name as a local
               or global in the class scope.
            */
            if  (classflag &&
                 PyLong_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) {
                long flags = PyLong_AS_LONG(v) | DEF_FREE_CLASS;
                v_new = PyLong_FromLong(flags);
                if (!v_new) {
                    goto error;
                }
                if (PyDict_SetItem(symbols, name, v_new) < 0) {
                    Py_DECREF(v_new);
                    goto error;
                }
                Py_DECREF(v_new);
            }
            /* It's a cell, or already free in this scope */
            Py_DECREF(name);
            continue;
        }
        /* Handle global symbol */
        if (!PySet_Contains(bound, name)) {
            Py_DECREF(name);
            continue;       /* it's a global */
        }
        /* Propagate new free symbol up the lexical stack */
        if (PyDict_SetItem(symbols, name, v_free) < 0) {
            goto error;
        }
        Py_DECREF(name);
    }
    Py_DECREF(itr);
    Py_DECREF(v_free);
    return 1;
668
error:
669 670 671 672 673
    Py_XDECREF(v_free);
    Py_XDECREF(itr);
    Py_XDECREF(name);
    return 0;
}
Jeremy Hylton's avatar
Jeremy Hylton committed
674 675

/* Make final symbol table decisions for block of ste.
676

Jeremy Hylton's avatar
Jeremy Hylton committed
677 678
   Arguments:
   ste -- current symtable entry (input/output)
679 680
   bound -- set of variables bound in enclosing scopes (input).  bound
       is NULL for module blocks.
Jeremy Hylton's avatar
Jeremy Hylton committed
681 682
   free -- set of free variables in enclosed scopes (output)
   globals -- set of declared global variables in enclosing scopes (input)
683 684 685 686 687 688 689 690 691 692

   The implementation uses two mutually recursive functions,
   analyze_block() and analyze_child_block().  analyze_block() is
   responsible for analyzing the individual names defined in a block.
   analyze_child_block() prepares temporary namespace dictionaries
   used to evaluated nested blocks.

   The two functions exist because a child block should see the name
   bindings of its enclosing blocks, but those bindings should not
   propagate back to a parent block.
Jeremy Hylton's avatar
Jeremy Hylton committed
693 694
*/

695
static int
696 697
analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
                    PyObject *global, PyObject* child_free);
698

Jeremy Hylton's avatar
Jeremy Hylton committed
699
static int
700 701
analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
              PyObject *global)
Jeremy Hylton's avatar
Jeremy Hylton committed
702
{
703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787
    PyObject *name, *v, *local = NULL, *scopes = NULL, *newbound = NULL;
    PyObject *newglobal = NULL, *newfree = NULL, *allfree = NULL;
    PyObject *temp;
    int i, success = 0;
    Py_ssize_t pos = 0;

    local = PySet_New(NULL);  /* collect new names bound in block */
    if (!local)
        goto error;
    scopes = PyDict_New();  /* collect scopes defined for each name */
    if (!scopes)
        goto error;

    /* Allocate new global and bound variable dictionaries.  These
       dictionaries hold the names visible in nested blocks.  For
       ClassBlocks, the bound and global names are initialized
       before analyzing names, because class bindings aren't
       visible in methods.  For other blocks, they are initialized
       after names are analyzed.
     */

    /* TODO(jhylton): Package these dicts in a struct so that we
       can write reasonable helper functions?
    */
    newglobal = PySet_New(NULL);
    if (!newglobal)
        goto error;
    newfree = PySet_New(NULL);
    if (!newfree)
        goto error;
    newbound = PySet_New(NULL);
    if (!newbound)
        goto error;

    /* Class namespace has no effect on names visible in
       nested functions, so populate the global and bound
       sets to be passed to child blocks before analyzing
       this one.
     */
    if (ste->ste_type == ClassBlock) {
        /* Pass down known globals */
        temp = PyNumber_InPlaceOr(newglobal, global);
        if (!temp)
            goto error;
        Py_DECREF(temp);
        /* Pass down previously bound symbols */
        if (bound) {
            temp = PyNumber_InPlaceOr(newbound, bound);
            if (!temp)
                goto error;
            Py_DECREF(temp);
        }
    }

    while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
        long flags = PyLong_AS_LONG(v);
        if (!analyze_name(ste, scopes, name, flags,
                          bound, local, free, global))
            goto error;
    }

    /* Populate global and bound sets to be passed to children. */
    if (ste->ste_type != ClassBlock) {
        /* Add function locals to bound set */
        if (ste->ste_type == FunctionBlock) {
            temp = PyNumber_InPlaceOr(newbound, local);
            if (!temp)
                goto error;
            Py_DECREF(temp);
        }
        /* Pass down previously bound symbols */
        if (bound) {
            temp = PyNumber_InPlaceOr(newbound, bound);
            if (!temp)
                goto error;
            Py_DECREF(temp);
        }
        /* Pass down known globals */
        temp = PyNumber_InPlaceOr(newglobal, global);
        if (!temp)
            goto error;
        Py_DECREF(temp);
    }
    else {
        /* Special-case __class__ */
788 789
        if (!GET_IDENTIFIER(__class__))
            goto error;
790 791 792 793
        if (PySet_Add(newbound, __class__) < 0)
            goto error;
    }

794
    /* Recursively call analyze_child_block() on each child block.
795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821

       newbound, newglobal now contain the names visible in
       nested blocks.  The free variables in the children will
       be collected in allfree.
    */
    allfree = PySet_New(NULL);
    if (!allfree)
        goto error;
    for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
        PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
        PySTEntryObject* entry;
        assert(c && PySTEntry_Check(c));
        entry = (PySTEntryObject*)c;
        if (!analyze_child_block(entry, newbound, newfree, newglobal,
                                 allfree))
            goto error;
        /* Check if any children have free variables */
        if (entry->ste_free || entry->ste_child_free)
            ste->ste_child_free = 1;
    }

    temp = PyNumber_InPlaceOr(newfree, allfree);
    if (!temp)
        goto error;
    Py_DECREF(temp);

    /* Check if any local variables must be converted to cell variables */
822
    if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree))
823
        goto error;
824
    else if (ste->ste_type == ClassBlock && !drop_class_free(ste, newfree))
825 826 827 828 829 830 831 832 833 834 835
        goto error;
    /* Records the results of the analysis in the symbol table entry */
    if (!update_symbols(ste->ste_symbols, scopes, bound, newfree,
                        ste->ste_type == ClassBlock))
        goto error;

    temp = PyNumber_InPlaceOr(free, newfree);
    if (!temp)
        goto error;
    Py_DECREF(temp);
    success = 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
836
 error:
837 838 839 840 841 842 843 844 845
    Py_XDECREF(scopes);
    Py_XDECREF(local);
    Py_XDECREF(newbound);
    Py_XDECREF(newglobal);
    Py_XDECREF(newfree);
    Py_XDECREF(allfree);
    if (!success)
        assert(PyErr_Occurred());
    return success;
Jeremy Hylton's avatar
Jeremy Hylton committed
846 847
}

848
static int
849 850
analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
                    PyObject *global, PyObject* child_free)
851
{
852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881
    PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
    PyObject *temp;

    /* Copy the bound and global dictionaries.

       These dictionary are used by all blocks enclosed by the
       current block.  The analyze_block() call modifies these
       dictionaries.

    */
    temp_bound = PySet_New(bound);
    if (!temp_bound)
        goto error;
    temp_free = PySet_New(free);
    if (!temp_free)
        goto error;
    temp_global = PySet_New(global);
    if (!temp_global)
        goto error;

    if (!analyze_block(entry, temp_bound, temp_free, temp_global))
        goto error;
    temp = PyNumber_InPlaceOr(child_free, temp_free);
    if (!temp)
        goto error;
    Py_DECREF(temp);
    Py_DECREF(temp_bound);
    Py_DECREF(temp_free);
    Py_DECREF(temp_global);
    return 1;
882
 error:
883 884 885 886
    Py_XDECREF(temp_bound);
    Py_XDECREF(temp_free);
    Py_XDECREF(temp_global);
    return 0;
887 888
}

Jeremy Hylton's avatar
Jeremy Hylton committed
889 890 891
static int
symtable_analyze(struct symtable *st)
{
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906
    PyObject *free, *global;
    int r;

    free = PySet_New(NULL);
    if (!free)
        return 0;
    global = PySet_New(NULL);
    if (!global) {
        Py_DECREF(free);
        return 0;
    }
    r = analyze_block(st->st_top, NULL, free, global);
    Py_DECREF(free);
    Py_DECREF(global);
    return r;
Jeremy Hylton's avatar
Jeremy Hylton committed
907 908 909 910
}


static int
911
symtable_warn(struct symtable *st, const char *msg, int lineno)
Jeremy Hylton's avatar
Jeremy Hylton committed
912
{
913 914 915 916 917 918
    PyObject *message = PyUnicode_FromString(msg);
    if (message == NULL)
        return 0;
    if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, message, st->st_filename,
                                 lineno, NULL, NULL) < 0)     {
        Py_DECREF(message);
919 920
        if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
            PyErr_SetString(PyExc_SyntaxError, msg);
921 922
            PyErr_SyntaxLocationObject(st->st_filename, st->st_cur->ste_lineno,
                                       st->st_cur->ste_col_offset);
923 924 925
        }
        return 0;
    }
926
    Py_DECREF(message);
927
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
928 929
}

930
/* symtable_enter_block() gets a reference via ste_new.
Jeremy Hylton's avatar
Jeremy Hylton committed
931 932 933 934 935 936 937
   This reference is released when the block is exited, via the DECREF
   in symtable_exit_block().
*/

static int
symtable_exit_block(struct symtable *st, void *ast)
{
938
    Py_ssize_t size;
939

940 941 942 943
    st->st_cur = NULL;
    size = PyList_GET_SIZE(st->st_stack);
    if (size) {
        if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)
944
            return 0;
945 946
        if (--size)
            st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, size - 1);
947 948
    }
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
949 950 951
}

static int
952
symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
953
                     void *ast, int lineno, int col_offset)
Jeremy Hylton's avatar
Jeremy Hylton committed
954
{
955
    PySTEntryObject *prev = NULL, *ste;
956

957 958
    ste = ste_new(st, name, block, ast, lineno, col_offset);
    if (ste == NULL)
959
        return 0;
960 961 962 963 964 965 966 967
    if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) {
        Py_DECREF(ste);
        return 0;
    }
    prev = st->st_cur;
    /* The entry is owned by the stack. Borrow it for st_cur. */
    Py_DECREF(ste);
    st->st_cur = ste;
968
    if (block == ModuleBlock)
969 970
        st->st_global = st->st_cur->ste_symbols;
    if (prev) {
971
        if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {
972 973 974 975
            return 0;
        }
    }
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
976 977
}

978
static long
Jeremy Hylton's avatar
Jeremy Hylton committed
979 980
symtable_lookup(struct symtable *st, PyObject *name)
{
981 982 983 984 985 986 987 988 989
    PyObject *o;
    PyObject *mangled = _Py_Mangle(st->st_private, name);
    if (!mangled)
        return 0;
    o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
    Py_DECREF(mangled);
    if (!o)
        return 0;
    return PyLong_AsLong(o);
Jeremy Hylton's avatar
Jeremy Hylton committed
990 991 992
}

static int
993
symtable_add_def(struct symtable *st, PyObject *name, int flag)
Jeremy Hylton's avatar
Jeremy Hylton committed
994
{
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008
    PyObject *o;
    PyObject *dict;
    long val;
    PyObject *mangled = _Py_Mangle(st->st_private, name);


    if (!mangled)
        return 0;
    dict = st->st_cur->ste_symbols;
    if ((o = PyDict_GetItem(dict, mangled))) {
        val = PyLong_AS_LONG(o);
        if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
            /* Is it better to use 'mangled' or 'name' here? */
            PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, name);
1009 1010 1011
            PyErr_SyntaxLocationObject(st->st_filename,
                                       st->st_cur->ste_lineno,
                                       st->st_cur->ste_col_offset);
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
            goto error;
        }
        val |= flag;
    } else
        val = flag;
    o = PyLong_FromLong(val);
    if (o == NULL)
        goto error;
    if (PyDict_SetItem(dict, mangled, o) < 0) {
        Py_DECREF(o);
        goto error;
    }
    Py_DECREF(o);

    if (flag & DEF_PARAM) {
        if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
            goto error;
    } else      if (flag & DEF_GLOBAL) {
        /* XXX need to update DEF_GLOBAL for other flags too;
           perhaps only DEF_FREE_GLOBAL */
        val = flag;
        if ((o = PyDict_GetItem(st->st_global, mangled))) {
            val |= PyLong_AS_LONG(o);
        }
        o = PyLong_FromLong(val);
Jeremy Hylton's avatar
Jeremy Hylton committed
1037
        if (o == NULL)
1038 1039 1040 1041 1042 1043 1044 1045 1046
            goto error;
        if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
            Py_DECREF(o);
            goto error;
        }
        Py_DECREF(o);
    }
    Py_DECREF(mangled);
    return 1;
1047 1048

error:
1049 1050
    Py_DECREF(mangled);
    return 0;
Jeremy Hylton's avatar
Jeremy Hylton committed
1051 1052 1053 1054
}

/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
   They use the ASDL name to synthesize the name of the C type and the visit
1055 1056
   function.

Jeremy Hylton's avatar
Jeremy Hylton committed
1057 1058
   VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
   useful if the first node in the sequence requires special treatment.
1059 1060 1061

   VISIT_QUIT macro returns the specified value exiting from the function but
   first adjusts current recursion counter depth.
Jeremy Hylton's avatar
Jeremy Hylton committed
1062 1063
*/

1064 1065 1066
#define VISIT_QUIT(ST, X) \
    return --(ST)->recursion_depth,(X)

Jeremy Hylton's avatar
Jeremy Hylton committed
1067
#define VISIT(ST, TYPE, V) \
1068
    if (!symtable_visit_ ## TYPE((ST), (V))) \
1069
        VISIT_QUIT((ST), 0);
1070

Jeremy Hylton's avatar
Jeremy Hylton committed
1071
#define VISIT_SEQ(ST, TYPE, SEQ) { \
1072 1073 1074 1075 1076
    int i; \
    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
    for (i = 0; i < asdl_seq_LEN(seq); i++) { \
        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
        if (!symtable_visit_ ## TYPE((ST), elt)) \
1077
            VISIT_QUIT((ST), 0);                 \
1078
    } \
Jeremy Hylton's avatar
Jeremy Hylton committed
1079
}
1080

Jeremy Hylton's avatar
Jeremy Hylton committed
1081
#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
1082 1083 1084 1085 1086
    int i; \
    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
    for (i = (START); i < asdl_seq_LEN(seq); i++) { \
        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
        if (!symtable_visit_ ## TYPE((ST), elt)) \
1087
            VISIT_QUIT((ST), 0);                 \
1088
    } \
Jeremy Hylton's avatar
Jeremy Hylton committed
1089
}
1090

1091
#define VISIT_SEQ_WITH_NULL(ST, TYPE, SEQ) {     \
1092
    int i = 0; \
1093
    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1094
    for (i = 0; i < asdl_seq_LEN(seq); i++) { \
1095
        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1096
        if (!elt) continue; /* can be NULL */ \
1097
        if (!symtable_visit_ ## TYPE((ST), elt)) \
1098
            VISIT_QUIT((ST), 0);             \
1099
    } \
1100 1101
}

1102 1103 1104
static int
symtable_new_tmpname(struct symtable *st)
{
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
    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;
1117 1118
}

1119

1120 1121 1122
static int
symtable_record_directive(struct symtable *st, identifier name, stmt_ty s)
{
1123
    PyObject *data, *mangled;
1124 1125 1126 1127 1128 1129
    int res;
    if (!st->st_cur->ste_directives) {
        st->st_cur->ste_directives = PyList_New(0);
        if (!st->st_cur->ste_directives)
            return 0;
    }
1130 1131 1132 1133
    mangled = _Py_Mangle(st->st_private, name);
    if (!mangled)
        return 0;
    data = Py_BuildValue("(Nii)", mangled, s->lineno, s->col_offset);
1134 1135 1136 1137 1138 1139 1140 1141
    if (!data)
        return 0;
    res = PyList_Append(st->st_cur->ste_directives, data);
    Py_DECREF(data);
    return res == 0;
}


Jeremy Hylton's avatar
Jeremy Hylton committed
1142 1143 1144
static int
symtable_visit_stmt(struct symtable *st, stmt_ty s)
{
1145
    if (++st->recursion_depth > st->recursion_limit) {
1146
        PyErr_SetString(PyExc_RecursionError,
1147 1148 1149
                        "maximum recursion depth exceeded during compilation");
        VISIT_QUIT(st, 0);
    }
1150 1151 1152
    switch (s->kind) {
    case FunctionDef_kind:
        if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
1153
            VISIT_QUIT(st, 0);
1154 1155 1156
        if (s->v.FunctionDef.args->defaults)
            VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
        if (s->v.FunctionDef.args->kw_defaults)
1157
            VISIT_SEQ_WITH_NULL(st, expr, s->v.FunctionDef.args->kw_defaults);
1158 1159
        if (!symtable_visit_annotations(st, s, s->v.FunctionDef.args,
                                        s->v.FunctionDef.returns))
1160
            VISIT_QUIT(st, 0);
1161 1162 1163
        if (s->v.FunctionDef.decorator_list)
            VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
        if (!symtable_enter_block(st, s->v.FunctionDef.name,
1164 1165
                                  FunctionBlock, (void *)s, s->lineno,
                                  s->col_offset))
1166
            VISIT_QUIT(st, 0);
1167 1168
        VISIT(st, arguments, s->v.FunctionDef.args);
        VISIT_SEQ(st, stmt, s->v.FunctionDef.body);
1169
        if (!symtable_exit_block(st, s))
1170
            VISIT_QUIT(st, 0);
1171 1172 1173 1174
        break;
    case ClassDef_kind: {
        PyObject *tmp;
        if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
1175
            VISIT_QUIT(st, 0);
1176 1177 1178 1179 1180
        VISIT_SEQ(st, expr, s->v.ClassDef.bases);
        VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
        if (s->v.ClassDef.decorator_list)
            VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
        if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
1181
                                  (void *)s, s->lineno, s->col_offset))
1182
            VISIT_QUIT(st, 0);
1183 1184
        tmp = st->st_private;
        st->st_private = s->v.ClassDef.name;
1185
        VISIT_SEQ(st, stmt, s->v.ClassDef.body);
1186 1187
        st->st_private = tmp;
        if (!symtable_exit_block(st, s))
1188
            VISIT_QUIT(st, 0);
1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230
        break;
    }
    case Return_kind:
        if (s->v.Return.value) {
            VISIT(st, expr, s->v.Return.value);
            st->st_cur->ste_returns_value = 1;
        }
        break;
    case Delete_kind:
        VISIT_SEQ(st, expr, s->v.Delete.targets);
        break;
    case Assign_kind:
        VISIT_SEQ(st, expr, s->v.Assign.targets);
        VISIT(st, expr, s->v.Assign.value);
        break;
    case AugAssign_kind:
        VISIT(st, expr, s->v.AugAssign.target);
        VISIT(st, expr, s->v.AugAssign.value);
        break;
    case For_kind:
        VISIT(st, expr, s->v.For.target);
        VISIT(st, expr, s->v.For.iter);
        VISIT_SEQ(st, stmt, s->v.For.body);
        if (s->v.For.orelse)
            VISIT_SEQ(st, stmt, s->v.For.orelse);
        break;
    case While_kind:
        VISIT(st, expr, s->v.While.test);
        VISIT_SEQ(st, stmt, s->v.While.body);
        if (s->v.While.orelse)
            VISIT_SEQ(st, stmt, s->v.While.orelse);
        break;
    case If_kind:
        /* XXX if 0: and lookup_yield() hacks */
        VISIT(st, expr, s->v.If.test);
        VISIT_SEQ(st, stmt, s->v.If.body);
        if (s->v.If.orelse)
            VISIT_SEQ(st, stmt, s->v.If.orelse);
        break;
    case Raise_kind:
        if (s->v.Raise.exc) {
            VISIT(st, expr, s->v.Raise.exc);
1231 1232 1233
            if (s->v.Raise.cause) {
                VISIT(st, expr, s->v.Raise.cause);
            }
1234 1235
        }
        break;
1236 1237 1238 1239 1240
    case Try_kind:
        VISIT_SEQ(st, stmt, s->v.Try.body);
        VISIT_SEQ(st, stmt, s->v.Try.orelse);
        VISIT_SEQ(st, excepthandler, s->v.Try.handlers);
        VISIT_SEQ(st, stmt, s->v.Try.finalbody);
1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
        break;
    case Assert_kind:
        VISIT(st, expr, s->v.Assert.test);
        if (s->v.Assert.msg)
            VISIT(st, expr, s->v.Assert.msg);
        break;
    case Import_kind:
        VISIT_SEQ(st, alias, s->v.Import.names);
        break;
    case ImportFrom_kind:
        VISIT_SEQ(st, alias, s->v.ImportFrom.names);
        break;
    case Global_kind: {
        int i;
        asdl_seq *seq = s->v.Global.names;
        for (i = 0; i < asdl_seq_LEN(seq); i++) {
            identifier name = (identifier)asdl_seq_GET(seq, i);
            long cur = symtable_lookup(st, name);
            if (cur < 0)
1260
                VISIT_QUIT(st, 0);
1261 1262
            if (cur & (DEF_LOCAL | USE)) {
                char buf[256];
1263 1264 1265
                char *c_name = _PyUnicode_AsString(name);
                if (!c_name)
                    return 0;
1266 1267 1268 1269 1270 1271 1272 1273 1274
                if (cur & DEF_LOCAL)
                    PyOS_snprintf(buf, sizeof(buf),
                                  GLOBAL_AFTER_ASSIGN,
                                  c_name);
                else
                    PyOS_snprintf(buf, sizeof(buf),
                                  GLOBAL_AFTER_USE,
                                  c_name);
                if (!symtable_warn(st, buf, s->lineno))
1275
                    VISIT_QUIT(st, 0);
1276 1277
            }
            if (!symtable_add_def(st, name, DEF_GLOBAL))
1278
                VISIT_QUIT(st, 0);
1279
            if (!symtable_record_directive(st, name, s))
1280
                VISIT_QUIT(st, 0);
1281 1282 1283 1284 1285 1286 1287 1288 1289 1290
        }
        break;
    }
    case Nonlocal_kind: {
        int i;
        asdl_seq *seq = s->v.Nonlocal.names;
        for (i = 0; i < asdl_seq_LEN(seq); i++) {
            identifier name = (identifier)asdl_seq_GET(seq, i);
            long cur = symtable_lookup(st, name);
            if (cur < 0)
1291
                VISIT_QUIT(st, 0);
1292 1293
            if (cur & (DEF_LOCAL | USE)) {
                char buf[256];
1294 1295 1296
                char *c_name = _PyUnicode_AsString(name);
                if (!c_name)
                    return 0;
1297 1298 1299 1300 1301 1302 1303 1304 1305
                if (cur & DEF_LOCAL)
                    PyOS_snprintf(buf, sizeof(buf),
                                  NONLOCAL_AFTER_ASSIGN,
                                  c_name);
                else
                    PyOS_snprintf(buf, sizeof(buf),
                                  NONLOCAL_AFTER_USE,
                                  c_name);
                if (!symtable_warn(st, buf, s->lineno))
1306
                    VISIT_QUIT(st, 0);
1307 1308
            }
            if (!symtable_add_def(st, name, DEF_NONLOCAL))
1309
                VISIT_QUIT(st, 0);
1310
            if (!symtable_record_directive(st, name, s))
1311
                VISIT_QUIT(st, 0);
1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323
        }
        break;
    }
    case Expr_kind:
        VISIT(st, expr, s->v.Expr.value);
        break;
    case Pass_kind:
    case Break_kind:
    case Continue_kind:
        /* nothing to do here */
        break;
    case With_kind:
1324
        VISIT_SEQ(st, withitem, s->v.With.items);
1325 1326
        VISIT_SEQ(st, stmt, s->v.With.body);
        break;
1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359
    case AsyncFunctionDef_kind:
        if (!symtable_add_def(st, s->v.AsyncFunctionDef.name, DEF_LOCAL))
            VISIT_QUIT(st, 0);
        if (s->v.AsyncFunctionDef.args->defaults)
            VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.args->defaults);
        if (s->v.AsyncFunctionDef.args->kw_defaults)
            VISIT_SEQ_WITH_NULL(st, expr,
                                s->v.AsyncFunctionDef.args->kw_defaults);
        if (!symtable_visit_annotations(st, s, s->v.AsyncFunctionDef.args,
                                        s->v.AsyncFunctionDef.returns))
            VISIT_QUIT(st, 0);
        if (s->v.AsyncFunctionDef.decorator_list)
            VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.decorator_list);
        if (!symtable_enter_block(st, s->v.AsyncFunctionDef.name,
                                  FunctionBlock, (void *)s, s->lineno,
                                  s->col_offset))
            VISIT_QUIT(st, 0);
        VISIT(st, arguments, s->v.AsyncFunctionDef.args);
        VISIT_SEQ(st, stmt, s->v.AsyncFunctionDef.body);
        if (!symtable_exit_block(st, s))
            VISIT_QUIT(st, 0);
        break;
    case AsyncWith_kind:
        VISIT_SEQ(st, withitem, s->v.AsyncWith.items);
        VISIT_SEQ(st, stmt, s->v.AsyncWith.body);
        break;
    case AsyncFor_kind:
        VISIT(st, expr, s->v.AsyncFor.target);
        VISIT(st, expr, s->v.AsyncFor.iter);
        VISIT_SEQ(st, stmt, s->v.AsyncFor.body);
        if (s->v.AsyncFor.orelse)
            VISIT_SEQ(st, stmt, s->v.AsyncFor.orelse);
        break;
1360
    }
1361
    VISIT_QUIT(st, 1);
Jeremy Hylton's avatar
Jeremy Hylton committed
1362 1363
}

1364
static int
Jeremy Hylton's avatar
Jeremy Hylton committed
1365 1366
symtable_visit_expr(struct symtable *st, expr_ty e)
{
1367
    if (++st->recursion_depth > st->recursion_limit) {
1368
        PyErr_SetString(PyExc_RecursionError,
1369 1370 1371
                        "maximum recursion depth exceeded during compilation");
        VISIT_QUIT(st, 0);
    }
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384
    switch (e->kind) {
    case BoolOp_kind:
        VISIT_SEQ(st, expr, e->v.BoolOp.values);
        break;
    case BinOp_kind:
        VISIT(st, expr, e->v.BinOp.left);
        VISIT(st, expr, e->v.BinOp.right);
        break;
    case UnaryOp_kind:
        VISIT(st, expr, e->v.UnaryOp.operand);
        break;
    case Lambda_kind: {
        if (!GET_IDENTIFIER(lambda))
1385
            VISIT_QUIT(st, 0);
1386 1387
        if (e->v.Lambda.args->defaults)
            VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
1388
        if (e->v.Lambda.args->kw_defaults)
1389
            VISIT_SEQ_WITH_NULL(st, expr, e->v.Lambda.args->kw_defaults);
1390
        if (!symtable_enter_block(st, lambda,
1391 1392
                                  FunctionBlock, (void *)e, e->lineno,
                                  e->col_offset))
1393
            VISIT_QUIT(st, 0);
1394 1395
        VISIT(st, arguments, e->v.Lambda.args);
        VISIT(st, expr, e->v.Lambda.body);
1396
        if (!symtable_exit_block(st, (void *)e))
1397
            VISIT_QUIT(st, 0);
1398 1399 1400 1401 1402 1403 1404 1405
        break;
    }
    case IfExp_kind:
        VISIT(st, expr, e->v.IfExp.test);
        VISIT(st, expr, e->v.IfExp.body);
        VISIT(st, expr, e->v.IfExp.orelse);
        break;
    case Dict_kind:
1406
        VISIT_SEQ_WITH_NULL(st, expr, e->v.Dict.keys);
1407 1408 1409 1410 1411 1412 1413
        VISIT_SEQ(st, expr, e->v.Dict.values);
        break;
    case Set_kind:
        VISIT_SEQ(st, expr, e->v.Set.elts);
        break;
    case GeneratorExp_kind:
        if (!symtable_visit_genexp(st, e))
1414
            VISIT_QUIT(st, 0);
1415 1416 1417
        break;
    case ListComp_kind:
        if (!symtable_visit_listcomp(st, e))
1418
            VISIT_QUIT(st, 0);
1419 1420 1421
        break;
    case SetComp_kind:
        if (!symtable_visit_setcomp(st, e))
1422
            VISIT_QUIT(st, 0);
1423 1424 1425
        break;
    case DictComp_kind:
        if (!symtable_visit_dictcomp(st, e))
1426
            VISIT_QUIT(st, 0);
1427 1428
        break;
    case Yield_kind:
1429 1430 1431 1432 1433 1434
        if (e->v.Yield.value)
            VISIT(st, expr, e->v.Yield.value);
        st->st_cur->ste_generator = 1;
        break;
    case YieldFrom_kind:
        VISIT(st, expr, e->v.YieldFrom.value);
1435 1436
        st->st_cur->ste_generator = 1;
        break;
1437 1438 1439 1440
    case Await_kind:
        VISIT(st, expr, e->v.Await.value);
        st->st_cur->ste_generator = 1;
        break;
1441 1442 1443 1444 1445 1446 1447
    case Compare_kind:
        VISIT(st, expr, e->v.Compare.left);
        VISIT_SEQ(st, expr, e->v.Compare.comparators);
        break;
    case Call_kind:
        VISIT(st, expr, e->v.Call.func);
        VISIT_SEQ(st, expr, e->v.Call.args);
1448
        VISIT_SEQ_WITH_NULL(st, keyword, e->v.Call.keywords);
1449
        break;
1450 1451 1452 1453 1454 1455 1456 1457
    case FormattedValue_kind:
        VISIT(st, expr, e->v.FormattedValue.value);
        if (e->v.FormattedValue.format_spec)
            VISIT(st, expr, e->v.FormattedValue.format_spec);
        break;
    case JoinedStr_kind:
        VISIT_SEQ(st, expr, e->v.JoinedStr.values);
        break;
Victor Stinner's avatar
Victor Stinner committed
1458
    case Constant_kind:
1459 1460 1461 1462
    case Num_kind:
    case Str_kind:
    case Bytes_kind:
    case Ellipsis_kind:
1463
    case NameConstant_kind:
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479
        /* Nothing to do here. */
        break;
    /* The following exprs can be assignment targets. */
    case Attribute_kind:
        VISIT(st, expr, e->v.Attribute.value);
        break;
    case Subscript_kind:
        VISIT(st, expr, e->v.Subscript.value);
        VISIT(st, slice, e->v.Subscript.slice);
        break;
    case Starred_kind:
        VISIT(st, expr, e->v.Starred.value);
        break;
    case Name_kind:
        if (!symtable_add_def(st, e->v.Name.id,
                              e->v.Name.ctx == Load ? USE : DEF_LOCAL))
1480
            VISIT_QUIT(st, 0);
1481 1482 1483 1484
        /* Special-case super: it counts as a use of __class__ */
        if (e->v.Name.ctx == Load &&
            st->st_cur->ste_type == FunctionBlock &&
            !PyUnicode_CompareWithASCIIString(e->v.Name.id, "super")) {
1485 1486
            if (!GET_IDENTIFIER(__class__) ||
                !symtable_add_def(st, __class__, USE))
1487
                VISIT_QUIT(st, 0);
1488 1489 1490 1491 1492 1493 1494 1495 1496 1497
        }
        break;
    /* child nodes of List and Tuple will have expr_context set */
    case List_kind:
        VISIT_SEQ(st, expr, e->v.List.elts);
        break;
    case Tuple_kind:
        VISIT_SEQ(st, expr, e->v.Tuple.elts);
        break;
    }
1498
    VISIT_QUIT(st, 1);
Jeremy Hylton's avatar
Jeremy Hylton committed
1499 1500 1501 1502 1503
}

static int
symtable_implicit_arg(struct symtable *st, int pos)
{
1504 1505 1506 1507 1508 1509 1510 1511 1512
    PyObject *id = PyUnicode_FromFormat(".%d", pos);
    if (id == NULL)
        return 0;
    if (!symtable_add_def(st, id, DEF_PARAM)) {
        Py_DECREF(id);
        return 0;
    }
    Py_DECREF(id);
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
1513 1514
}

1515
static int
1516
symtable_visit_params(struct symtable *st, asdl_seq *args)
Jeremy Hylton's avatar
Jeremy Hylton committed
1517
{
1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
    int i;

    if (!args)
        return -1;

    for (i = 0; i < asdl_seq_LEN(args); i++) {
        arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
        if (!symtable_add_def(st, arg->arg, DEF_PARAM))
            return 0;
    }

    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
1530 1531
}

1532
static int
1533
symtable_visit_argannotations(struct symtable *st, asdl_seq *args)
Jeremy Hylton's avatar
Jeremy Hylton committed
1534
{
1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546
    int i;

    if (!args)
        return -1;

    for (i = 0; i < asdl_seq_LEN(args); i++) {
        arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
        if (arg->annotation)
            VISIT(st, expr, arg->annotation);
    }

    return 1;
1547 1548 1549
}

static int
1550 1551
symtable_visit_annotations(struct symtable *st, stmt_ty s,
                           arguments_ty a, expr_ty returns)
1552
{
1553 1554
    if (a->args && !symtable_visit_argannotations(st, a->args))
        return 0;
1555 1556 1557 1558
    if (a->vararg && a->vararg->annotation)
        VISIT(st, expr, a->vararg->annotation);
    if (a->kwarg && a->kwarg->annotation)
        VISIT(st, expr, a->kwarg->annotation);
1559 1560
    if (a->kwonlyargs && !symtable_visit_argannotations(st, a->kwonlyargs))
        return 0;
1561
    if (returns)
1562
        VISIT(st, expr, returns);
1563
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
1564 1565
}

1566
static int
Jeremy Hylton's avatar
Jeremy Hylton committed
1567 1568
symtable_visit_arguments(struct symtable *st, arguments_ty a)
{
1569 1570 1571 1572 1573 1574 1575 1576
    /* skip default arguments inside function block
       XXX should ast be different?
    */
    if (a->args && !symtable_visit_params(st, a->args))
        return 0;
    if (a->kwonlyargs && !symtable_visit_params(st, a->kwonlyargs))
        return 0;
    if (a->vararg) {
1577
        if (!symtable_add_def(st, a->vararg->arg, DEF_PARAM))
1578 1579 1580 1581
            return 0;
        st->st_cur->ste_varargs = 1;
    }
    if (a->kwarg) {
1582
        if (!symtable_add_def(st, a->kwarg->arg, DEF_PARAM))
1583 1584 1585 1586
            return 0;
        st->st_cur->ste_varkeywords = 1;
    }
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
1587 1588 1589
}


1590
static int
Jeremy Hylton's avatar
Jeremy Hylton committed
1591 1592
symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
{
1593 1594 1595 1596 1597 1598 1599
    if (eh->v.ExceptHandler.type)
        VISIT(st, expr, eh->v.ExceptHandler.type);
    if (eh->v.ExceptHandler.name)
        if (!symtable_add_def(st, eh->v.ExceptHandler.name, DEF_LOCAL))
            return 0;
    VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
1600 1601
}

1602 1603 1604 1605 1606 1607 1608 1609 1610 1611
static int
symtable_visit_withitem(struct symtable *st, withitem_ty item)
{
    VISIT(st, expr, item->context_expr);
    if (item->optional_vars) {
        VISIT(st, expr, item->optional_vars);
    }
    return 1;
}

Jeremy Hylton's avatar
Jeremy Hylton committed
1612

1613
static int
Jeremy Hylton's avatar
Jeremy Hylton committed
1614 1615
symtable_visit_alias(struct symtable *st, alias_ty a)
{
1616
    /* Compute store_name, the name actually bound by the import
1617
       operation.  It is different than a->name when a->name is a
1618 1619 1620 1621
       dotted package name (e.g. spam.eggs)
    */
    PyObject *store_name;
    PyObject *name = (a->asname == NULL) ? a->name : a->asname;
Martin v. Löwis's avatar
Martin v. Löwis committed
1622 1623 1624 1625
    Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
                                        PyUnicode_GET_LENGTH(name), 1);
    if (dot != -1) {
        store_name = PyUnicode_Substring(name, 0, dot);
1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639
        if (!store_name)
            return 0;
    }
    else {
        store_name = name;
        Py_INCREF(store_name);
    }
    if (PyUnicode_CompareWithASCIIString(name, "*")) {
        int r = symtable_add_def(st, store_name, DEF_IMPORT);
        Py_DECREF(store_name);
        return r;
    }
    else {
        if (st->st_cur->ste_type != ModuleBlock) {
Benjamin Peterson's avatar
Benjamin Peterson committed
1640 1641 1642
            int lineno = st->st_cur->ste_lineno;
            int col_offset = st->st_cur->ste_col_offset;
            PyErr_SetString(PyExc_SyntaxError, IMPORT_STAR_WARNING);
1643
            PyErr_SyntaxLocationObject(st->st_filename, lineno, col_offset);
Benjamin Peterson's avatar
Benjamin Peterson committed
1644 1645
            Py_DECREF(store_name);
            return 0;
1646 1647 1648 1649
        }
        Py_DECREF(store_name);
        return 1;
    }
Jeremy Hylton's avatar
Jeremy Hylton committed
1650 1651 1652
}


1653
static int
Jeremy Hylton's avatar
Jeremy Hylton committed
1654 1655
symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
{
1656 1657 1658 1659
    VISIT(st, expr, lc->target);
    VISIT(st, expr, lc->iter);
    VISIT_SEQ(st, expr, lc->ifs);
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
1660 1661 1662
}


1663
static int
Jeremy Hylton's avatar
Jeremy Hylton committed
1664 1665
symtable_visit_keyword(struct symtable *st, keyword_ty k)
{
1666 1667
    VISIT(st, expr, k->value);
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
1668 1669 1670
}


1671
static int
Jeremy Hylton's avatar
Jeremy Hylton committed
1672 1673
symtable_visit_slice(struct symtable *st, slice_ty s)
{
1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690
    switch (s->kind) {
    case Slice_kind:
        if (s->v.Slice.lower)
            VISIT(st, expr, s->v.Slice.lower)
        if (s->v.Slice.upper)
            VISIT(st, expr, s->v.Slice.upper)
        if (s->v.Slice.step)
            VISIT(st, expr, s->v.Slice.step)
        break;
    case ExtSlice_kind:
        VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
        break;
    case Index_kind:
        VISIT(st, expr, s->v.Index.value)
        break;
    }
    return 1;
Jeremy Hylton's avatar
Jeremy Hylton committed
1691 1692
}

1693
static int
1694
symtable_handle_comprehension(struct symtable *st, expr_ty e,
1695 1696
                              identifier scope_name, asdl_seq *generators,
                              expr_ty elt, expr_ty value)
Jeremy Hylton's avatar
Jeremy Hylton committed
1697
{
1698 1699 1700 1701 1702 1703 1704 1705
    int is_generator = (e->kind == GeneratorExp_kind);
    int needs_tmp = !is_generator;
    comprehension_ty outermost = ((comprehension_ty)
                                    asdl_seq_GET(generators, 0));
    /* Outermost iterator is evaluated in current scope */
    VISIT(st, expr, outermost->iter);
    /* Create comprehension scope for the rest */
    if (!scope_name ||
1706 1707
        !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e,
                              e->lineno, e->col_offset)) {
1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720
        return 0;
    }
    st->st_cur->ste_generator = is_generator;
    /* Outermost iter is received as an argument */
    if (!symtable_implicit_arg(st, 0)) {
        symtable_exit_block(st, (void *)e);
        return 0;
    }
    /* Allocate temporary name if needed */
    if (needs_tmp && !symtable_new_tmpname(st)) {
        symtable_exit_block(st, (void *)e);
        return 0;
    }
1721 1722 1723
    VISIT(st, expr, outermost->target);
    VISIT_SEQ(st, expr, outermost->ifs);
    VISIT_SEQ_TAIL(st, comprehension, generators, 1);
1724
    if (value)
1725 1726
        VISIT(st, expr, value);
    VISIT(st, expr, elt);
1727
    return symtable_exit_block(st, (void *)e);
Jeremy Hylton's avatar
Jeremy Hylton committed
1728
}
1729

1730
static int
1731 1732
symtable_visit_genexp(struct symtable *st, expr_ty e)
{
1733 1734 1735
    return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
                                         e->v.GeneratorExp.generators,
                                         e->v.GeneratorExp.elt, NULL);
1736 1737
}

1738
static int
1739 1740
symtable_visit_listcomp(struct symtable *st, expr_ty e)
{
1741 1742 1743
    return symtable_handle_comprehension(st, e, GET_IDENTIFIER(listcomp),
                                         e->v.ListComp.generators,
                                         e->v.ListComp.elt, NULL);
1744 1745 1746 1747 1748
}

static int
symtable_visit_setcomp(struct symtable *st, expr_ty e)
{
1749 1750 1751
    return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
                                         e->v.SetComp.generators,
                                         e->v.SetComp.elt, NULL);
1752 1753 1754 1755 1756
}

static int
symtable_visit_dictcomp(struct symtable *st, expr_ty e)
{
1757 1758 1759 1760
    return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp),
                                         e->v.DictComp.generators,
                                         e->v.DictComp.key,
                                         e->v.DictComp.value);
1761
}