• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Python.h"
2 #include "Python-ast.h"
3 #include "code.h"
4 #include "symtable.h"
5 #include "structmember.h"
6 
7 /* error strings used for warnings */
8 #define GLOBAL_AFTER_ASSIGN \
9 "name '%.400s' is assigned to before global declaration"
10 
11 #define GLOBAL_AFTER_USE \
12 "name '%.400s' is used prior to global declaration"
13 
14 #define IMPORT_STAR_WARNING "import * only allowed at module level"
15 
16 #define RETURN_VAL_IN_GENERATOR \
17     "'return' with argument inside generator"
18 
19 
20 static PySTEntryObject *
ste_new(struct symtable * st,identifier name,_Py_block_ty block,void * key,int lineno)21 ste_new(struct symtable *st, identifier name, _Py_block_ty block,
22               void *key, int lineno)
23 {
24     PySTEntryObject *ste = NULL;
25     PyObject *k = NULL;
26 
27     k = PyLong_FromVoidPtr(key);
28     if (k == NULL)
29         goto fail;
30     ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
31     if (ste == NULL) {
32         Py_DECREF(k);
33         goto fail;
34     }
35     ste->ste_table = st;
36     ste->ste_id = k; /* ste owns reference to k */
37 
38     ste->ste_name = name;
39     Py_INCREF(name);
40 
41     ste->ste_symbols = NULL;
42     ste->ste_varnames = NULL;
43     ste->ste_children = NULL;
44 
45     ste->ste_symbols = PyDict_New();
46     if (ste->ste_symbols == NULL)
47         goto fail;
48 
49     ste->ste_varnames = PyList_New(0);
50     if (ste->ste_varnames == NULL)
51         goto fail;
52 
53     ste->ste_children = PyList_New(0);
54     if (ste->ste_children == NULL)
55         goto fail;
56 
57     ste->ste_type = block;
58     ste->ste_unoptimized = 0;
59     ste->ste_nested = 0;
60     ste->ste_free = 0;
61     ste->ste_varargs = 0;
62     ste->ste_varkeywords = 0;
63     ste->ste_opt_lineno = 0;
64     ste->ste_tmpname = 0;
65     ste->ste_lineno = lineno;
66 
67     if (st->st_cur != NULL &&
68         (st->st_cur->ste_nested ||
69          st->st_cur->ste_type == FunctionBlock))
70         ste->ste_nested = 1;
71     ste->ste_child_free = 0;
72     ste->ste_generator = 0;
73     ste->ste_returns_value = 0;
74 
75     if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0)
76         goto fail;
77 
78     return ste;
79  fail:
80     Py_XDECREF(ste);
81     return NULL;
82 }
83 
84 static PyObject *
ste_repr(PySTEntryObject * ste)85 ste_repr(PySTEntryObject *ste)
86 {
87     char buf[256];
88 
89     PyOS_snprintf(buf, sizeof(buf),
90                   "<symtable entry %.100s(%ld), line %d>",
91                   PyString_AS_STRING(ste->ste_name),
92                   PyInt_AS_LONG(ste->ste_id), ste->ste_lineno);
93     return PyString_FromString(buf);
94 }
95 
96 static void
ste_dealloc(PySTEntryObject * ste)97 ste_dealloc(PySTEntryObject *ste)
98 {
99     ste->ste_table = NULL;
100     Py_XDECREF(ste->ste_id);
101     Py_XDECREF(ste->ste_name);
102     Py_XDECREF(ste->ste_symbols);
103     Py_XDECREF(ste->ste_varnames);
104     Py_XDECREF(ste->ste_children);
105     PyObject_Del(ste);
106 }
107 
108 #define OFF(x) offsetof(PySTEntryObject, x)
109 
110 static PyMemberDef ste_memberlist[] = {
111     {"id",       T_OBJECT, OFF(ste_id), READONLY},
112     {"name",     T_OBJECT, OFF(ste_name), READONLY},
113     {"symbols",  T_OBJECT, OFF(ste_symbols), READONLY},
114     {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
115     {"children", T_OBJECT, OFF(ste_children), READONLY},
116     {"optimized",T_INT,    OFF(ste_unoptimized), READONLY},
117     {"nested",   T_INT,    OFF(ste_nested), READONLY},
118     {"type",     T_INT,    OFF(ste_type), READONLY},
119     {"lineno",   T_INT,    OFF(ste_lineno), READONLY},
120     {NULL}
121 };
122 
123 PyTypeObject PySTEntry_Type = {
124     PyVarObject_HEAD_INIT(&PyType_Type, 0)
125     "symtable entry",
126     sizeof(PySTEntryObject),
127     0,
128     (destructor)ste_dealloc,                /* tp_dealloc */
129     0,                                      /* tp_print */
130     0,                                         /* tp_getattr */
131     0,                                          /* tp_setattr */
132     0,                                          /* tp_compare */
133     (reprfunc)ste_repr,                         /* tp_repr */
134     0,                                          /* tp_as_number */
135     0,                                          /* tp_as_sequence */
136     0,                                          /* tp_as_mapping */
137     0,                                          /* tp_hash */
138     0,                                          /* tp_call */
139     0,                                          /* tp_str */
140     PyObject_GenericGetAttr,                    /* tp_getattro */
141     0,                                          /* tp_setattro */
142     0,                                          /* tp_as_buffer */
143     Py_TPFLAGS_DEFAULT,                         /* tp_flags */
144     0,                                          /* tp_doc */
145     0,                                          /* tp_traverse */
146     0,                                          /* tp_clear */
147     0,                                          /* tp_richcompare */
148     0,                                          /* tp_weaklistoffset */
149     0,                                          /* tp_iter */
150     0,                                          /* tp_iternext */
151     0,                                          /* tp_methods */
152     ste_memberlist,                             /* tp_members */
153     0,                                          /* tp_getset */
154     0,                                          /* tp_base */
155     0,                                          /* tp_dict */
156     0,                                          /* tp_descr_get */
157     0,                                          /* tp_descr_set */
158     0,                                          /* tp_dictoffset */
159     0,                                          /* tp_init */
160     0,                                          /* tp_alloc */
161     0,                                          /* tp_new */
162 };
163 
164 static int symtable_analyze(struct symtable *st);
165 static int symtable_warn(struct symtable *st, char *msg, int lineno);
166 static int symtable_enter_block(struct symtable *st, identifier name,
167                                 _Py_block_ty block, void *ast, int lineno);
168 static int symtable_exit_block(struct symtable *st, void *ast);
169 static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
170 static int symtable_visit_expr(struct symtable *st, expr_ty s);
171 static int symtable_visit_genexp(struct symtable *st, expr_ty s);
172 static int symtable_visit_setcomp(struct symtable *st, expr_ty e);
173 static int symtable_visit_dictcomp(struct symtable *st, expr_ty e);
174 static int symtable_visit_arguments(struct symtable *st, arguments_ty);
175 static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
176 static int symtable_visit_alias(struct symtable *st, alias_ty);
177 static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
178 static int symtable_visit_keyword(struct symtable *st, keyword_ty);
179 static int symtable_visit_slice(struct symtable *st, slice_ty);
180 static int symtable_visit_params(struct symtable *st, asdl_seq *args, int top);
181 static int symtable_visit_params_nested(struct symtable *st, asdl_seq *args);
182 static int symtable_implicit_arg(struct symtable *st, int pos);
183 
184 
185 static identifier top = NULL, lambda = NULL, genexpr = NULL, setcomp = NULL,
186     dictcomp = NULL;
187 
188 #define GET_IDENTIFIER(VAR) \
189     ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
190 
191 #define DUPLICATE_ARGUMENT \
192 "duplicate argument '%s' in function definition"
193 
194 static struct symtable *
symtable_new(void)195 symtable_new(void)
196 {
197     struct symtable *st;
198 
199     st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
200     if (st == NULL)
201         return NULL;
202 
203     st->st_filename = NULL;
204     st->st_symbols = NULL;
205 
206     if ((st->st_stack = PyList_New(0)) == NULL)
207         goto fail;
208     if ((st->st_symbols = PyDict_New()) == NULL)
209         goto fail;
210     st->st_cur = NULL;
211     st->st_private = NULL;
212     return st;
213  fail:
214     PySymtable_Free(st);
215     return NULL;
216 }
217 
218 struct symtable *
PySymtable_Build(mod_ty mod,const char * filename,PyFutureFeatures * future)219 PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
220 {
221     struct symtable *st = symtable_new();
222     asdl_seq *seq;
223     int i;
224 
225     if (st == NULL)
226         return st;
227     st->st_filename = filename;
228     st->st_future = future;
229     if (!GET_IDENTIFIER(top) ||
230         !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
231         PySymtable_Free(st);
232         return NULL;
233     }
234 
235     st->st_top = st->st_cur;
236     st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
237     /* Any other top-level initialization? */
238     switch (mod->kind) {
239     case Module_kind:
240         seq = mod->v.Module.body;
241         for (i = 0; i < asdl_seq_LEN(seq); i++)
242             if (!symtable_visit_stmt(st,
243                         (stmt_ty)asdl_seq_GET(seq, i)))
244                 goto error;
245         break;
246     case Expression_kind:
247         if (!symtable_visit_expr(st, mod->v.Expression.body))
248             goto error;
249         break;
250     case Interactive_kind:
251         seq = mod->v.Interactive.body;
252         for (i = 0; i < asdl_seq_LEN(seq); i++)
253             if (!symtable_visit_stmt(st,
254                         (stmt_ty)asdl_seq_GET(seq, i)))
255                 goto error;
256         break;
257     case Suite_kind:
258         PyErr_SetString(PyExc_RuntimeError,
259                         "this compiler does not handle Suites");
260         goto error;
261     }
262     if (!symtable_exit_block(st, (void *)mod)) {
263         PySymtable_Free(st);
264         return NULL;
265     }
266     if (symtable_analyze(st))
267         return st;
268     PySymtable_Free(st);
269     return NULL;
270  error:
271     (void) symtable_exit_block(st, (void *)mod);
272     PySymtable_Free(st);
273     return NULL;
274 }
275 
276 void
PySymtable_Free(struct symtable * st)277 PySymtable_Free(struct symtable *st)
278 {
279     Py_XDECREF(st->st_symbols);
280     Py_XDECREF(st->st_stack);
281     PyMem_Free((void *)st);
282 }
283 
284 PySTEntryObject *
PySymtable_Lookup(struct symtable * st,void * key)285 PySymtable_Lookup(struct symtable *st, void *key)
286 {
287     PyObject *k, *v;
288 
289     k = PyLong_FromVoidPtr(key);
290     if (k == NULL)
291         return NULL;
292     v = PyDict_GetItem(st->st_symbols, k);
293     if (v) {
294         assert(PySTEntry_Check(v));
295         Py_INCREF(v);
296     }
297     else {
298         PyErr_SetString(PyExc_KeyError,
299                         "unknown symbol table entry");
300     }
301 
302     Py_DECREF(k);
303     return (PySTEntryObject *)v;
304 }
305 
306 int
PyST_GetScope(PySTEntryObject * ste,PyObject * name)307 PyST_GetScope(PySTEntryObject *ste, PyObject *name)
308 {
309     PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
310     if (!v)
311         return 0;
312     assert(PyInt_Check(v));
313     return (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
314 }
315 
316 
317 /* Analyze raw symbol information to determine scope of each name.
318 
319    The next several functions are helpers for PySymtable_Analyze(),
320    which determines whether a name is local, global, or free.  In addition,
321    it determines which local variables are cell variables; they provide
322    bindings that are used for free variables in enclosed blocks.
323 
324    There are also two kinds of free variables, implicit and explicit.  An
325    explicit global is declared with the global statement.  An implicit
326    global is a free variable for which the compiler has found no binding
327    in an enclosing function scope.  The implicit global is either a global
328    or a builtin.  Python's module and class blocks use the xxx_NAME opcodes
329    to handle these names to implement slightly odd semantics.  In such a
330    block, the name is treated as global until it is assigned to; then it
331    is treated as a local.
332 
333    The symbol table requires two passes to determine the scope of each name.
334    The first pass collects raw facts from the AST: the name is a parameter
335    here, the name is used by not defined here, etc.  The second pass analyzes
336    these facts during a pass over the PySTEntryObjects created during pass 1.
337 
338    When a function is entered during the second pass, the parent passes
339    the set of all name bindings visible to its children.  These bindings
340    are used to determine if the variable is free or an implicit global.
341    After doing the local analysis, it analyzes each of its child blocks
342    using an updated set of name bindings.
343 
344    The children update the free variable set.  If a local variable is free
345    in a child, the variable is marked as a cell.  The current function must
346    provide runtime storage for the variable that may outlive the function's
347    frame.  Cell variables are removed from the free set before the analyze
348    function returns to its parent.
349 
350    The sets of bound and free variables are implemented as dictionaries
351    mapping strings to None.
352 */
353 
354 #define SET_SCOPE(DICT, NAME, I) { \
355     PyObject *o = PyInt_FromLong(I); \
356     if (!o) \
357         return 0; \
358     if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
359         Py_DECREF(o); \
360         return 0; \
361     } \
362     Py_DECREF(o); \
363 }
364 
365 /* Decide on scope of name, given flags.
366 
367    The namespace dictionaries may be modified to record information
368    about the new name.  For example, a new global will add an entry to
369    global.  A name that was global can be changed to local.
370 */
371 
372 static int
analyze_name(PySTEntryObject * ste,PyObject * dict,PyObject * name,long flags,PyObject * bound,PyObject * local,PyObject * free,PyObject * global)373 analyze_name(PySTEntryObject *ste, PyObject *dict, PyObject *name, long flags,
374              PyObject *bound, PyObject *local, PyObject *free,
375              PyObject *global)
376 {
377     if (flags & DEF_GLOBAL) {
378         if (flags & DEF_PARAM) {
379             PyErr_Format(PyExc_SyntaxError,
380                          "name '%s' is local and global",
381                          PyString_AS_STRING(name));
382             PyErr_SyntaxLocation(ste->ste_table->st_filename,
383                                  ste->ste_lineno);
384 
385             return 0;
386         }
387         SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
388         if (PyDict_SetItem(global, name, Py_None) < 0)
389             return 0;
390         if (bound && PyDict_GetItem(bound, name)) {
391             if (PyDict_DelItem(bound, name) < 0)
392                 return 0;
393         }
394         return 1;
395     }
396     if (flags & DEF_BOUND) {
397         SET_SCOPE(dict, name, LOCAL);
398         if (PyDict_SetItem(local, name, Py_None) < 0)
399             return 0;
400         if (PyDict_GetItem(global, name)) {
401             if (PyDict_DelItem(global, name) < 0)
402                 return 0;
403         }
404         return 1;
405     }
406     /* If an enclosing block has a binding for this name, it
407        is a free variable rather than a global variable.
408        Note that having a non-NULL bound implies that the block
409        is nested.
410     */
411     if (bound && PyDict_GetItem(bound, name)) {
412         SET_SCOPE(dict, name, FREE);
413         ste->ste_free = 1;
414         if (PyDict_SetItem(free, name, Py_None) < 0)
415             return 0;
416         return 1;
417     }
418     /* If a parent has a global statement, then call it global
419        explicit?  It could also be global implicit.
420      */
421     else if (global && PyDict_GetItem(global, name)) {
422         SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
423         return 1;
424     }
425     else {
426         if (ste->ste_nested)
427             ste->ste_free = 1;
428         SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
429         return 1;
430     }
431     /* Should never get here. */
432     PyErr_Format(PyExc_SystemError, "failed to set scope for %s",
433                  PyString_AS_STRING(name));
434     return 0;
435 }
436 
437 #undef SET_SCOPE
438 
439 /* If a name is defined in free and also in locals, then this block
440    provides the binding for the free variable.  The name should be
441    marked CELL in this block and removed from the free list.
442 
443    Note that the current block's free variables are included in free.
444    That's safe because no name can be free and local in the same scope.
445 */
446 
447 static int
analyze_cells(PyObject * scope,PyObject * free)448 analyze_cells(PyObject *scope, PyObject *free)
449 {
450     PyObject *name, *v, *w;
451     int success = 0;
452     Py_ssize_t pos = 0;
453 
454     w = PyInt_FromLong(CELL);
455     if (!w)
456         return 0;
457     while (PyDict_Next(scope, &pos, &name, &v)) {
458         long flags;
459         assert(PyInt_Check(v));
460         flags = PyInt_AS_LONG(v);
461         if (flags != LOCAL)
462             continue;
463         if (!PyDict_GetItem(free, name))
464             continue;
465         /* Replace LOCAL with CELL for this name, and remove
466            from free. It is safe to replace the value of name
467            in the dict, because it will not cause a resize.
468          */
469         if (PyDict_SetItem(scope, name, w) < 0)
470             goto error;
471         if (PyDict_DelItem(free, name) < 0)
472             goto error;
473     }
474     success = 1;
475  error:
476     Py_DECREF(w);
477     return success;
478 }
479 
480 /* Check for illegal statements in unoptimized namespaces */
481 static int
check_unoptimized(const PySTEntryObject * ste)482 check_unoptimized(const PySTEntryObject* ste) {
483     char buf[300];
484     const char* trailer;
485 
486     if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
487         || !(ste->ste_free || ste->ste_child_free))
488         return 1;
489 
490     trailer = (ste->ste_child_free ?
491                    "contains a nested function with free variables" :
492                    "is a nested function");
493 
494     switch (ste->ste_unoptimized) {
495     case OPT_TOPLEVEL: /* exec / import * at top-level is fine */
496     case OPT_EXEC: /* qualified exec is fine */
497         return 1;
498     case OPT_IMPORT_STAR:
499         PyOS_snprintf(buf, sizeof(buf),
500                       "import * is not allowed in function '%.100s' "
501                       "because it %s",
502                       PyString_AS_STRING(ste->ste_name), trailer);
503         break;
504     case OPT_BARE_EXEC:
505         PyOS_snprintf(buf, sizeof(buf),
506                       "unqualified exec is not allowed in function "
507                       "'%.100s' because it %s",
508                       PyString_AS_STRING(ste->ste_name), trailer);
509         break;
510     default:
511         PyOS_snprintf(buf, sizeof(buf),
512                       "function '%.100s' uses import * and bare exec, "
513                       "which are illegal because it %s",
514                       PyString_AS_STRING(ste->ste_name), trailer);
515         break;
516     }
517 
518     PyErr_SetString(PyExc_SyntaxError, buf);
519     PyErr_SyntaxLocation(ste->ste_table->st_filename,
520                          ste->ste_opt_lineno);
521     return 0;
522 }
523 
524 /* Enter the final scope information into the st_symbols dict.
525  *
526  * All arguments are dicts.  Modifies symbols, others are read-only.
527 */
528 static int
update_symbols(PyObject * symbols,PyObject * scope,PyObject * bound,PyObject * free,int classflag)529 update_symbols(PyObject *symbols, PyObject *scope,
530                PyObject *bound, PyObject *free, int classflag)
531 {
532     PyObject *name, *v, *u, *w, *free_value = NULL;
533     Py_ssize_t pos = 0;
534 
535     while (PyDict_Next(symbols, &pos, &name, &v)) {
536         long i, flags;
537         assert(PyInt_Check(v));
538         flags = PyInt_AS_LONG(v);
539         w = PyDict_GetItem(scope, name);
540         assert(w && PyInt_Check(w));
541         i = PyInt_AS_LONG(w);
542         flags |= (i << SCOPE_OFF);
543         u = PyInt_FromLong(flags);
544         if (!u)
545             return 0;
546         if (PyDict_SetItem(symbols, name, u) < 0) {
547             Py_DECREF(u);
548             return 0;
549         }
550         Py_DECREF(u);
551     }
552 
553     free_value = PyInt_FromLong(FREE << SCOPE_OFF);
554     if (!free_value)
555         return 0;
556 
557     /* add a free variable when it's only use is for creating a closure */
558     pos = 0;
559     while (PyDict_Next(free, &pos, &name, &v)) {
560         PyObject *o = PyDict_GetItem(symbols, name);
561 
562         if (o) {
563             /* It could be a free variable in a method of
564                the class that has the same name as a local
565                or global in the class scope.
566             */
567             if  (classflag &&
568                  PyInt_AS_LONG(o) & (DEF_BOUND | DEF_GLOBAL)) {
569                 long i = PyInt_AS_LONG(o) | DEF_FREE_CLASS;
570                 o = PyInt_FromLong(i);
571                 if (!o) {
572                     Py_DECREF(free_value);
573                     return 0;
574                 }
575                 if (PyDict_SetItem(symbols, name, o) < 0) {
576                     Py_DECREF(o);
577                     Py_DECREF(free_value);
578                     return 0;
579                 }
580                 Py_DECREF(o);
581             }
582             /* else it's not free, probably a cell */
583             continue;
584         }
585         if (!PyDict_GetItem(bound, name))
586             continue;       /* it's a global */
587 
588         if (PyDict_SetItem(symbols, name, free_value) < 0) {
589             Py_DECREF(free_value);
590             return 0;
591         }
592     }
593     Py_DECREF(free_value);
594     return 1;
595 }
596 
597 /* Make final symbol table decisions for block of ste.
598 
599    Arguments:
600    ste -- current symtable entry (input/output)
601    bound -- set of variables bound in enclosing scopes (input).  bound
602        is NULL for module blocks.
603    free -- set of free variables in enclosed scopes (output)
604    globals -- set of declared global variables in enclosing scopes (input)
605 
606    The implementation uses two mutually recursive functions,
607    analyze_block() and analyze_child_block().  analyze_block() is
608    responsible for analyzing the individual names defined in a block.
609    analyze_child_block() prepares temporary namespace dictionaries
610    used to evaluated nested blocks.
611 
612    The two functions exist because a child block should see the name
613    bindings of its enclosing blocks, but those bindings should not
614    propagate back to a parent block.
615 */
616 
617 static int
618 analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
619                     PyObject *global, PyObject* child_free);
620 
621 static int
analyze_block(PySTEntryObject * ste,PyObject * bound,PyObject * free,PyObject * global)622 analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
623               PyObject *global)
624 {
625     PyObject *name, *v, *local = NULL, *scope = NULL;
626     PyObject *newbound = NULL, *newglobal = NULL;
627     PyObject *newfree = NULL, *allfree = NULL;
628     int i, success = 0;
629     Py_ssize_t pos = 0;
630 
631     local = PyDict_New();  /* collect new names bound in block */
632     if (!local)
633         goto error;
634     scope = PyDict_New(); /* collect scopes defined for each name */
635     if (!scope)
636         goto error;
637 
638     /* Allocate new global and bound variable dictionaries.  These
639        dictionaries hold the names visible in nested blocks.  For
640        ClassBlocks, the bound and global names are initialized
641        before analyzing names, because class bindings aren't
642        visible in methods.  For other blocks, they are initialized
643        after names are analyzed.
644      */
645 
646     /* TODO(jhylton): Package these dicts in a struct so that we
647        can write reasonable helper functions?
648     */
649     newglobal = PyDict_New();
650     if (!newglobal)
651         goto error;
652     newbound = PyDict_New();
653     if (!newbound)
654         goto error;
655     newfree = PyDict_New();
656     if (!newfree)
657         goto error;
658 
659     if (ste->ste_type == ClassBlock) {
660         if (PyDict_Update(newglobal, global) < 0)
661             goto error;
662         if (bound)
663             if (PyDict_Update(newbound, bound) < 0)
664                 goto error;
665     }
666 
667     while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
668         long flags = PyInt_AS_LONG(v);
669         if (!analyze_name(ste, scope, name, flags,
670                           bound, local, free, global))
671             goto error;
672     }
673 
674     if (ste->ste_type != ClassBlock) {
675         if (ste->ste_type == FunctionBlock) {
676             if (PyDict_Update(newbound, local) < 0)
677                 goto error;
678         }
679         if (bound) {
680             if (PyDict_Update(newbound, bound) < 0)
681                 goto error;
682         }
683         if (PyDict_Update(newglobal, global) < 0)
684             goto error;
685     }
686 
687     /* Recursively call analyze_block() on each child block.
688 
689        newbound, newglobal now contain the names visible in
690        nested blocks.  The free variables in the children will
691        be collected in allfree.
692     */
693     allfree = PyDict_New();
694     if (!allfree)
695         goto error;
696     for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
697         PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
698         PySTEntryObject* entry;
699         assert(c && PySTEntry_Check(c));
700         entry = (PySTEntryObject*)c;
701         if (!analyze_child_block(entry, newbound, newfree, newglobal,
702                                  allfree))
703             goto error;
704         if (entry->ste_free || entry->ste_child_free)
705             ste->ste_child_free = 1;
706     }
707 
708     if (PyDict_Update(newfree, allfree) < 0)
709         goto error;
710     if (ste->ste_type == FunctionBlock && !analyze_cells(scope, newfree))
711         goto error;
712     if (!update_symbols(ste->ste_symbols, scope, bound, newfree,
713                         ste->ste_type == ClassBlock))
714         goto error;
715     if (!check_unoptimized(ste))
716         goto error;
717 
718     if (PyDict_Update(free, newfree) < 0)
719         goto error;
720     success = 1;
721  error:
722     Py_XDECREF(local);
723     Py_XDECREF(scope);
724     Py_XDECREF(newbound);
725     Py_XDECREF(newglobal);
726     Py_XDECREF(newfree);
727     Py_XDECREF(allfree);
728     if (!success)
729         assert(PyErr_Occurred());
730     return success;
731 }
732 
733 static int
analyze_child_block(PySTEntryObject * entry,PyObject * bound,PyObject * free,PyObject * global,PyObject * child_free)734 analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
735                     PyObject *global, PyObject* child_free)
736 {
737     PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
738 
739     /* Copy the bound and global dictionaries.
740 
741        These dictionaries are used by all blocks enclosed by the
742        current block.  The analyze_block() call modifies these
743        dictionaries.
744 
745     */
746     temp_bound = PyDict_New();
747     if (!temp_bound)
748         goto error;
749     if (PyDict_Update(temp_bound, bound) < 0)
750         goto error;
751     temp_free = PyDict_New();
752     if (!temp_free)
753         goto error;
754     if (PyDict_Update(temp_free, free) < 0)
755         goto error;
756     temp_global = PyDict_New();
757     if (!temp_global)
758         goto error;
759     if (PyDict_Update(temp_global, global) < 0)
760         goto error;
761 
762     if (!analyze_block(entry, temp_bound, temp_free, temp_global))
763         goto error;
764     if (PyDict_Update(child_free, temp_free) < 0)
765         goto error;
766     Py_DECREF(temp_bound);
767     Py_DECREF(temp_free);
768     Py_DECREF(temp_global);
769     return 1;
770  error:
771     Py_XDECREF(temp_bound);
772     Py_XDECREF(temp_free);
773     Py_XDECREF(temp_global);
774     return 0;
775 }
776 
777 static int
symtable_analyze(struct symtable * st)778 symtable_analyze(struct symtable *st)
779 {
780     PyObject *free, *global;
781     int r;
782 
783     free = PyDict_New();
784     if (!free)
785         return 0;
786     global = PyDict_New();
787     if (!global) {
788         Py_DECREF(free);
789         return 0;
790     }
791     r = analyze_block(st->st_top, NULL, free, global);
792     Py_DECREF(free);
793     Py_DECREF(global);
794     return r;
795 }
796 
797 
798 static int
symtable_warn(struct symtable * st,char * msg,int lineno)799 symtable_warn(struct symtable *st, char *msg, int lineno)
800 {
801     if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
802                            lineno, NULL, NULL) < 0)     {
803         if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
804             PyErr_SetString(PyExc_SyntaxError, msg);
805             PyErr_SyntaxLocation(st->st_filename,
806                                  st->st_cur->ste_lineno);
807         }
808         return 0;
809     }
810     return 1;
811 }
812 
813 /* symtable_enter_block() gets a reference via ste_new.
814    This reference is released when the block is exited, via the DECREF
815    in symtable_exit_block().
816 */
817 
818 static int
symtable_exit_block(struct symtable * st,void * ast)819 symtable_exit_block(struct symtable *st, void *ast)
820 {
821     Py_ssize_t end;
822 
823     Py_CLEAR(st->st_cur);
824     end = PyList_GET_SIZE(st->st_stack) - 1;
825     if (end >= 0) {
826         st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
827                                                         end);
828         if (st->st_cur == NULL)
829             return 0;
830         Py_INCREF(st->st_cur);
831         if (PySequence_DelItem(st->st_stack, end) < 0)
832             return 0;
833     }
834     return 1;
835 }
836 
837 static int
symtable_enter_block(struct symtable * st,identifier name,_Py_block_ty block,void * ast,int lineno)838 symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
839                      void *ast, int lineno)
840 {
841     PySTEntryObject *prev = NULL;
842 
843     if (st->st_cur) {
844         prev = st->st_cur;
845         if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
846             return 0;
847         }
848         Py_DECREF(st->st_cur);
849     }
850     st->st_cur = ste_new(st, name, block, ast, lineno);
851     if (st->st_cur == NULL)
852         return 0;
853     if (block == ModuleBlock)
854         st->st_global = st->st_cur->ste_symbols;
855     if (prev) {
856         if (PyList_Append(prev->ste_children,
857                           (PyObject *)st->st_cur) < 0) {
858             return 0;
859         }
860     }
861     return 1;
862 }
863 
864 static long
symtable_lookup(struct symtable * st,PyObject * name)865 symtable_lookup(struct symtable *st, PyObject *name)
866 {
867     PyObject *o;
868     PyObject *mangled = _Py_Mangle(st->st_private, name);
869     if (!mangled)
870         return 0;
871     o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
872     Py_DECREF(mangled);
873     if (!o)
874         return 0;
875     return PyInt_AsLong(o);
876 }
877 
878 static int
symtable_add_def(struct symtable * st,PyObject * name,int flag)879 symtable_add_def(struct symtable *st, PyObject *name, int flag)
880 {
881     PyObject *o;
882     PyObject *dict;
883     long val;
884     PyObject *mangled = _Py_Mangle(st->st_private, name);
885 
886     if (!mangled)
887         return 0;
888     dict = st->st_cur->ste_symbols;
889     if ((o = PyDict_GetItem(dict, mangled))) {
890         val = PyInt_AS_LONG(o);
891         if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
892             /* Is it better to use 'mangled' or 'name' here? */
893             PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
894                          PyString_AsString(name));
895             PyErr_SyntaxLocation(st->st_filename,
896                                st->st_cur->ste_lineno);
897             goto error;
898         }
899         val |= flag;
900     } else
901         val = flag;
902     o = PyInt_FromLong(val);
903     if (o == NULL)
904         goto error;
905     if (PyDict_SetItem(dict, mangled, o) < 0) {
906         Py_DECREF(o);
907         goto error;
908     }
909     Py_DECREF(o);
910 
911     if (flag & DEF_PARAM) {
912         if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
913             goto error;
914     } else      if (flag & DEF_GLOBAL) {
915         /* XXX need to update DEF_GLOBAL for other flags too;
916            perhaps only DEF_FREE_GLOBAL */
917         val = flag;
918         if ((o = PyDict_GetItem(st->st_global, mangled))) {
919             val |= PyInt_AS_LONG(o);
920         }
921         o = PyInt_FromLong(val);
922         if (o == NULL)
923             goto error;
924         if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
925             Py_DECREF(o);
926             goto error;
927         }
928         Py_DECREF(o);
929     }
930     Py_DECREF(mangled);
931     return 1;
932 
933 error:
934     Py_DECREF(mangled);
935     return 0;
936 }
937 
938 /* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
939    They use the ASDL name to synthesize the name of the C type and the visit
940    function.
941 
942    VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
943    useful if the first node in the sequence requires special treatment.
944 */
945 
946 #define VISIT(ST, TYPE, V) \
947     if (!symtable_visit_ ## TYPE((ST), (V))) \
948         return 0;
949 
950 #define VISIT_IN_BLOCK(ST, TYPE, V, S) \
951     if (!symtable_visit_ ## TYPE((ST), (V))) { \
952         symtable_exit_block((ST), (S)); \
953         return 0; \
954     }
955 
956 #define VISIT_SEQ(ST, TYPE, SEQ) { \
957     int i; \
958     asdl_seq *seq = (SEQ); /* avoid variable capture */ \
959     for (i = 0; i < asdl_seq_LEN(seq); i++) { \
960         TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
961         if (!symtable_visit_ ## TYPE((ST), elt)) \
962             return 0; \
963     } \
964 }
965 
966 #define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
967     int i; \
968     asdl_seq *seq = (SEQ); /* avoid variable capture */ \
969     for (i = 0; i < asdl_seq_LEN(seq); i++) { \
970         TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
971         if (!symtable_visit_ ## TYPE((ST), elt)) { \
972             symtable_exit_block((ST), (S)); \
973             return 0; \
974         } \
975     } \
976 }
977 
978 #define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
979     int i; \
980     asdl_seq *seq = (SEQ); /* avoid variable capture */ \
981     for (i = (START); i < asdl_seq_LEN(seq); i++) { \
982         TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
983         if (!symtable_visit_ ## TYPE((ST), elt)) \
984             return 0; \
985     } \
986 }
987 
988 #define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
989     int i; \
990     asdl_seq *seq = (SEQ); /* avoid variable capture */ \
991     for (i = (START); i < asdl_seq_LEN(seq); i++) { \
992         TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
993         if (!symtable_visit_ ## TYPE((ST), elt)) { \
994             symtable_exit_block((ST), (S)); \
995             return 0; \
996         } \
997     } \
998 }
999 
1000 static int
symtable_visit_stmt(struct symtable * st,stmt_ty s)1001 symtable_visit_stmt(struct symtable *st, stmt_ty s)
1002 {
1003     switch (s->kind) {
1004     case FunctionDef_kind:
1005         if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
1006             return 0;
1007         if (s->v.FunctionDef.args->defaults)
1008             VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
1009         if (s->v.FunctionDef.decorator_list)
1010             VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
1011         if (!symtable_enter_block(st, s->v.FunctionDef.name,
1012                                   FunctionBlock, (void *)s, s->lineno))
1013             return 0;
1014         VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
1015         VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
1016         if (!symtable_exit_block(st, s))
1017             return 0;
1018         break;
1019     case ClassDef_kind: {
1020         PyObject *tmp;
1021         if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
1022             return 0;
1023         VISIT_SEQ(st, expr, s->v.ClassDef.bases);
1024         if (s->v.ClassDef.decorator_list)
1025             VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
1026         if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
1027                                   (void *)s, s->lineno))
1028             return 0;
1029         tmp = st->st_private;
1030         st->st_private = s->v.ClassDef.name;
1031         VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
1032         st->st_private = tmp;
1033         if (!symtable_exit_block(st, s))
1034             return 0;
1035         break;
1036     }
1037     case Return_kind:
1038         if (s->v.Return.value) {
1039             VISIT(st, expr, s->v.Return.value);
1040             st->st_cur->ste_returns_value = 1;
1041             if (st->st_cur->ste_generator) {
1042                 PyErr_SetString(PyExc_SyntaxError,
1043                     RETURN_VAL_IN_GENERATOR);
1044                 PyErr_SyntaxLocation(st->st_filename,
1045                              s->lineno);
1046                 return 0;
1047             }
1048         }
1049         break;
1050     case Delete_kind:
1051         VISIT_SEQ(st, expr, s->v.Delete.targets);
1052         break;
1053     case Assign_kind:
1054         VISIT_SEQ(st, expr, s->v.Assign.targets);
1055         VISIT(st, expr, s->v.Assign.value);
1056         break;
1057     case AugAssign_kind:
1058         VISIT(st, expr, s->v.AugAssign.target);
1059         VISIT(st, expr, s->v.AugAssign.value);
1060         break;
1061     case Print_kind:
1062         if (s->v.Print.dest)
1063             VISIT(st, expr, s->v.Print.dest);
1064         VISIT_SEQ(st, expr, s->v.Print.values);
1065         break;
1066     case For_kind:
1067         VISIT(st, expr, s->v.For.target);
1068         VISIT(st, expr, s->v.For.iter);
1069         VISIT_SEQ(st, stmt, s->v.For.body);
1070         if (s->v.For.orelse)
1071             VISIT_SEQ(st, stmt, s->v.For.orelse);
1072         break;
1073     case While_kind:
1074         VISIT(st, expr, s->v.While.test);
1075         VISIT_SEQ(st, stmt, s->v.While.body);
1076         if (s->v.While.orelse)
1077             VISIT_SEQ(st, stmt, s->v.While.orelse);
1078         break;
1079     case If_kind:
1080         /* XXX if 0: and lookup_yield() hacks */
1081         VISIT(st, expr, s->v.If.test);
1082         VISIT_SEQ(st, stmt, s->v.If.body);
1083         if (s->v.If.orelse)
1084             VISIT_SEQ(st, stmt, s->v.If.orelse);
1085         break;
1086     case Raise_kind:
1087         if (s->v.Raise.type) {
1088             VISIT(st, expr, s->v.Raise.type);
1089             if (s->v.Raise.inst) {
1090                 VISIT(st, expr, s->v.Raise.inst);
1091                 if (s->v.Raise.tback)
1092                     VISIT(st, expr, s->v.Raise.tback);
1093             }
1094         }
1095         break;
1096     case TryExcept_kind:
1097         VISIT_SEQ(st, stmt, s->v.TryExcept.body);
1098         VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
1099         VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
1100         break;
1101     case TryFinally_kind:
1102         VISIT_SEQ(st, stmt, s->v.TryFinally.body);
1103         VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
1104         break;
1105     case Assert_kind:
1106         VISIT(st, expr, s->v.Assert.test);
1107         if (s->v.Assert.msg)
1108             VISIT(st, expr, s->v.Assert.msg);
1109         break;
1110     case Import_kind:
1111         VISIT_SEQ(st, alias, s->v.Import.names);
1112         /* XXX Don't have the lineno available inside
1113            visit_alias */
1114         if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1115             st->st_cur->ste_opt_lineno = s->lineno;
1116         break;
1117     case ImportFrom_kind:
1118         VISIT_SEQ(st, alias, s->v.ImportFrom.names);
1119         /* XXX Don't have the lineno available inside
1120            visit_alias */
1121         if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1122             st->st_cur->ste_opt_lineno = s->lineno;
1123         break;
1124     case Exec_kind:
1125         VISIT(st, expr, s->v.Exec.body);
1126         if (!st->st_cur->ste_opt_lineno)
1127             st->st_cur->ste_opt_lineno = s->lineno;
1128         if (s->v.Exec.globals) {
1129             st->st_cur->ste_unoptimized |= OPT_EXEC;
1130             VISIT(st, expr, s->v.Exec.globals);
1131             if (s->v.Exec.locals)
1132                 VISIT(st, expr, s->v.Exec.locals);
1133         } else {
1134             st->st_cur->ste_unoptimized |= OPT_BARE_EXEC;
1135         }
1136         break;
1137     case Global_kind: {
1138         int i;
1139         asdl_seq *seq = s->v.Global.names;
1140         for (i = 0; i < asdl_seq_LEN(seq); i++) {
1141             identifier name = (identifier)asdl_seq_GET(seq, i);
1142             char *c_name = PyString_AS_STRING(name);
1143             long cur = symtable_lookup(st, name);
1144             if (cur < 0)
1145                 return 0;
1146             if (cur & (DEF_LOCAL | USE)) {
1147                 char buf[256];
1148                 if (cur & DEF_LOCAL)
1149                     PyOS_snprintf(buf, sizeof(buf),
1150                                   GLOBAL_AFTER_ASSIGN,
1151                                   c_name);
1152                 else
1153                     PyOS_snprintf(buf, sizeof(buf),
1154                                   GLOBAL_AFTER_USE,
1155                                   c_name);
1156                 if (!symtable_warn(st, buf, s->lineno))
1157                     return 0;
1158             }
1159             if (!symtable_add_def(st, name, DEF_GLOBAL))
1160                 return 0;
1161         }
1162         break;
1163     }
1164     case Expr_kind:
1165         VISIT(st, expr, s->v.Expr.value);
1166         break;
1167     case Pass_kind:
1168     case Break_kind:
1169     case Continue_kind:
1170         /* nothing to do here */
1171         break;
1172     case With_kind:
1173         VISIT(st, expr, s->v.With.context_expr);
1174         if (s->v.With.optional_vars) {
1175             VISIT(st, expr, s->v.With.optional_vars);
1176         }
1177         VISIT_SEQ(st, stmt, s->v.With.body);
1178         break;
1179     }
1180     return 1;
1181 }
1182 
1183 static int
symtable_visit_expr(struct symtable * st,expr_ty e)1184 symtable_visit_expr(struct symtable *st, expr_ty e)
1185 {
1186     switch (e->kind) {
1187     case BoolOp_kind:
1188         VISIT_SEQ(st, expr, e->v.BoolOp.values);
1189         break;
1190     case BinOp_kind:
1191         VISIT(st, expr, e->v.BinOp.left);
1192         VISIT(st, expr, e->v.BinOp.right);
1193         break;
1194     case UnaryOp_kind:
1195         VISIT(st, expr, e->v.UnaryOp.operand);
1196         break;
1197     case Lambda_kind: {
1198         if (!GET_IDENTIFIER(lambda))
1199             return 0;
1200         if (e->v.Lambda.args->defaults)
1201             VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
1202         if (!symtable_enter_block(st, lambda,
1203                                   FunctionBlock, (void *)e, e->lineno))
1204             return 0;
1205         VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
1206         VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
1207         if (!symtable_exit_block(st, (void *)e))
1208             return 0;
1209         break;
1210     }
1211     case IfExp_kind:
1212         VISIT(st, expr, e->v.IfExp.test);
1213         VISIT(st, expr, e->v.IfExp.body);
1214         VISIT(st, expr, e->v.IfExp.orelse);
1215         break;
1216     case Dict_kind:
1217         VISIT_SEQ(st, expr, e->v.Dict.keys);
1218         VISIT_SEQ(st, expr, e->v.Dict.values);
1219         break;
1220     case Set_kind:
1221         VISIT_SEQ(st, expr, e->v.Set.elts);
1222         break;
1223     case ListComp_kind:
1224         VISIT(st, expr, e->v.ListComp.elt);
1225         VISIT_SEQ(st, comprehension, e->v.ListComp.generators);
1226         break;
1227     case GeneratorExp_kind:
1228         if (!symtable_visit_genexp(st, e))
1229             return 0;
1230         break;
1231     case SetComp_kind:
1232         if (!symtable_visit_setcomp(st, e))
1233             return 0;
1234         break;
1235     case DictComp_kind:
1236         if (!symtable_visit_dictcomp(st, e))
1237             return 0;
1238         break;
1239     case Yield_kind:
1240         if (e->v.Yield.value)
1241             VISIT(st, expr, e->v.Yield.value);
1242         st->st_cur->ste_generator = 1;
1243         if (st->st_cur->ste_returns_value) {
1244             PyErr_SetString(PyExc_SyntaxError,
1245                 RETURN_VAL_IN_GENERATOR);
1246             PyErr_SyntaxLocation(st->st_filename,
1247                          e->lineno);
1248             return 0;
1249         }
1250         break;
1251     case Compare_kind:
1252         VISIT(st, expr, e->v.Compare.left);
1253         VISIT_SEQ(st, expr, e->v.Compare.comparators);
1254         break;
1255     case Call_kind:
1256         VISIT(st, expr, e->v.Call.func);
1257         VISIT_SEQ(st, expr, e->v.Call.args);
1258         VISIT_SEQ(st, keyword, e->v.Call.keywords);
1259         if (e->v.Call.starargs)
1260             VISIT(st, expr, e->v.Call.starargs);
1261         if (e->v.Call.kwargs)
1262             VISIT(st, expr, e->v.Call.kwargs);
1263         break;
1264     case Repr_kind:
1265         VISIT(st, expr, e->v.Repr.value);
1266         break;
1267     case Num_kind:
1268     case Str_kind:
1269         /* Nothing to do here. */
1270         break;
1271     /* The following exprs can be assignment targets. */
1272     case Attribute_kind:
1273         VISIT(st, expr, e->v.Attribute.value);
1274         break;
1275     case Subscript_kind:
1276         VISIT(st, expr, e->v.Subscript.value);
1277         VISIT(st, slice, e->v.Subscript.slice);
1278         break;
1279     case Name_kind:
1280         if (!symtable_add_def(st, e->v.Name.id,
1281                               e->v.Name.ctx == Load ? USE : DEF_LOCAL))
1282             return 0;
1283         break;
1284     /* child nodes of List and Tuple will have expr_context set */
1285     case List_kind:
1286         VISIT_SEQ(st, expr, e->v.List.elts);
1287         break;
1288     case Tuple_kind:
1289         VISIT_SEQ(st, expr, e->v.Tuple.elts);
1290         break;
1291     }
1292     return 1;
1293 }
1294 
1295 static int
symtable_implicit_arg(struct symtable * st,int pos)1296 symtable_implicit_arg(struct symtable *st, int pos)
1297 {
1298     PyObject *id = PyString_FromFormat(".%d", pos);
1299     if (id == NULL)
1300         return 0;
1301     if (!symtable_add_def(st, id, DEF_PARAM)) {
1302         Py_DECREF(id);
1303         return 0;
1304     }
1305     Py_DECREF(id);
1306     return 1;
1307 }
1308 
1309 static int
symtable_visit_params(struct symtable * st,asdl_seq * args,int toplevel)1310 symtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
1311 {
1312     int i;
1313 
1314     /* go through all the toplevel arguments first */
1315     for (i = 0; i < asdl_seq_LEN(args); i++) {
1316         expr_ty arg = (expr_ty)asdl_seq_GET(args, i);
1317         if (arg->kind == Name_kind) {
1318             assert(arg->v.Name.ctx == Param ||
1319                    (arg->v.Name.ctx == Store && !toplevel));
1320             if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
1321                 return 0;
1322         }
1323         else if (arg->kind == Tuple_kind) {
1324             assert(arg->v.Tuple.ctx == Store);
1325             if (toplevel) {
1326                 if (!symtable_implicit_arg(st, i))
1327                     return 0;
1328             }
1329         }
1330         else {
1331             PyErr_SetString(PyExc_SyntaxError,
1332                             "invalid expression in parameter list");
1333             PyErr_SyntaxLocation(st->st_filename,
1334                                  st->st_cur->ste_lineno);
1335             return 0;
1336         }
1337     }
1338 
1339     if (!toplevel) {
1340         if (!symtable_visit_params_nested(st, args))
1341             return 0;
1342     }
1343 
1344     return 1;
1345 }
1346 
1347 static int
symtable_visit_params_nested(struct symtable * st,asdl_seq * args)1348 symtable_visit_params_nested(struct symtable *st, asdl_seq *args)
1349 {
1350     int i;
1351     for (i = 0; i < asdl_seq_LEN(args); i++) {
1352         expr_ty arg = (expr_ty)asdl_seq_GET(args, i);
1353         if (arg->kind == Tuple_kind &&
1354             !symtable_visit_params(st, arg->v.Tuple.elts, 0))
1355             return 0;
1356     }
1357 
1358     return 1;
1359 }
1360 
1361 static int
symtable_visit_arguments(struct symtable * st,arguments_ty a)1362 symtable_visit_arguments(struct symtable *st, arguments_ty a)
1363 {
1364     /* skip default arguments inside function block
1365        XXX should ast be different?
1366     */
1367     if (a->args && !symtable_visit_params(st, a->args, 1))
1368         return 0;
1369     if (a->vararg) {
1370         if (!symtable_add_def(st, a->vararg, DEF_PARAM))
1371             return 0;
1372         st->st_cur->ste_varargs = 1;
1373     }
1374     if (a->kwarg) {
1375         if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
1376             return 0;
1377         st->st_cur->ste_varkeywords = 1;
1378     }
1379     if (a->args && !symtable_visit_params_nested(st, a->args))
1380         return 0;
1381     return 1;
1382 }
1383 
1384 
1385 static int
symtable_visit_excepthandler(struct symtable * st,excepthandler_ty eh)1386 symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1387 {
1388     if (eh->v.ExceptHandler.type)
1389         VISIT(st, expr, eh->v.ExceptHandler.type);
1390     if (eh->v.ExceptHandler.name)
1391         VISIT(st, expr, eh->v.ExceptHandler.name);
1392     VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
1393     return 1;
1394 }
1395 
1396 
1397 static int
symtable_visit_alias(struct symtable * st,alias_ty a)1398 symtable_visit_alias(struct symtable *st, alias_ty a)
1399 {
1400     /* Compute store_name, the name actually bound by the import
1401        operation.  It is different than a->name when a->name is a
1402        dotted package name (e.g. spam.eggs)
1403     */
1404     PyObject *store_name;
1405     PyObject *name = (a->asname == NULL) ? a->name : a->asname;
1406     const char *base = PyString_AS_STRING(name);
1407     char *dot = strchr(base, '.');
1408     if (dot) {
1409         store_name = PyString_FromStringAndSize(base, dot - base);
1410         if (!store_name)
1411             return 0;
1412     }
1413     else {
1414         store_name = name;
1415         Py_INCREF(store_name);
1416     }
1417     if (strcmp(PyString_AS_STRING(name), "*")) {
1418         int r = symtable_add_def(st, store_name, DEF_IMPORT);
1419         Py_DECREF(store_name);
1420         return r;
1421     }
1422     else {
1423         if (st->st_cur->ste_type != ModuleBlock) {
1424             int lineno = st->st_cur->ste_lineno;
1425             if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
1426                 Py_DECREF(store_name);
1427                 return 0;
1428             }
1429         }
1430         st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
1431         Py_DECREF(store_name);
1432         return 1;
1433     }
1434 }
1435 
1436 
1437 static int
symtable_visit_comprehension(struct symtable * st,comprehension_ty lc)1438 symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1439 {
1440     VISIT(st, expr, lc->target);
1441     VISIT(st, expr, lc->iter);
1442     VISIT_SEQ(st, expr, lc->ifs);
1443     return 1;
1444 }
1445 
1446 
1447 static int
symtable_visit_keyword(struct symtable * st,keyword_ty k)1448 symtable_visit_keyword(struct symtable *st, keyword_ty k)
1449 {
1450     VISIT(st, expr, k->value);
1451     return 1;
1452 }
1453 
1454 
1455 static int
symtable_visit_slice(struct symtable * st,slice_ty s)1456 symtable_visit_slice(struct symtable *st, slice_ty s)
1457 {
1458     switch (s->kind) {
1459     case Slice_kind:
1460         if (s->v.Slice.lower)
1461             VISIT(st, expr, s->v.Slice.lower)
1462         if (s->v.Slice.upper)
1463             VISIT(st, expr, s->v.Slice.upper)
1464         if (s->v.Slice.step)
1465             VISIT(st, expr, s->v.Slice.step)
1466         break;
1467     case ExtSlice_kind:
1468         VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
1469         break;
1470     case Index_kind:
1471         VISIT(st, expr, s->v.Index.value)
1472         break;
1473     case Ellipsis_kind:
1474         break;
1475     }
1476     return 1;
1477 }
1478 
1479 static int
symtable_new_tmpname(struct symtable * st)1480 symtable_new_tmpname(struct symtable *st)
1481 {
1482     char tmpname[256];
1483     identifier tmp;
1484 
1485     PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
1486                   ++st->st_cur->ste_tmpname);
1487     tmp = PyString_InternFromString(tmpname);
1488     if (!tmp)
1489         return 0;
1490     if (!symtable_add_def(st, tmp, DEF_LOCAL))
1491         return 0;
1492     Py_DECREF(tmp);
1493     return 1;
1494 }
1495 
1496 static int
symtable_handle_comprehension(struct symtable * st,expr_ty e,identifier scope_name,asdl_seq * generators,expr_ty elt,expr_ty value)1497 symtable_handle_comprehension(struct symtable *st, expr_ty e,
1498                               identifier scope_name, asdl_seq *generators,
1499                               expr_ty elt, expr_ty value)
1500 {
1501     int is_generator = (e->kind == GeneratorExp_kind);
1502     int needs_tmp = !is_generator;
1503     comprehension_ty outermost = ((comprehension_ty)
1504                                     asdl_seq_GET(generators, 0));
1505     /* Outermost iterator is evaluated in current scope */
1506     VISIT(st, expr, outermost->iter);
1507     /* Create comprehension scope for the rest */
1508     if (!scope_name ||
1509         !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e, 0)) {
1510         return 0;
1511     }
1512     st->st_cur->ste_generator = is_generator;
1513     /* Outermost iter is received as an argument */
1514     if (!symtable_implicit_arg(st, 0)) {
1515         symtable_exit_block(st, (void *)e);
1516         return 0;
1517     }
1518     /* Allocate temporary name if needed */
1519     if (needs_tmp && !symtable_new_tmpname(st)) {
1520         symtable_exit_block(st, (void *)e);
1521         return 0;
1522     }
1523     VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
1524     VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
1525     VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
1526                             generators, 1, (void*)e);
1527     if (value)
1528         VISIT_IN_BLOCK(st, expr, value, (void*)e);
1529     VISIT_IN_BLOCK(st, expr, elt, (void*)e);
1530     return symtable_exit_block(st, (void *)e);
1531 }
1532 
1533 static int
symtable_visit_genexp(struct symtable * st,expr_ty e)1534 symtable_visit_genexp(struct symtable *st, expr_ty e)
1535 {
1536     return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
1537                                          e->v.GeneratorExp.generators,
1538                                          e->v.GeneratorExp.elt, NULL);
1539 }
1540 
1541 static int
symtable_visit_setcomp(struct symtable * st,expr_ty e)1542 symtable_visit_setcomp(struct symtable *st, expr_ty e)
1543 {
1544     return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
1545                                          e->v.SetComp.generators,
1546                                          e->v.SetComp.elt, NULL);
1547 }
1548 
1549 static int
symtable_visit_dictcomp(struct symtable * st,expr_ty e)1550 symtable_visit_dictcomp(struct symtable *st, expr_ty e)
1551 {
1552     return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp),
1553                                          e->v.DictComp.generators,
1554                                          e->v.DictComp.key,
1555                                          e->v.DictComp.value);
1556 }
1557