blob: 9619f75edfb58650afce4f10cc1874a658c21a16 [file] [log] [blame]
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001#include "Python.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002#include "Python-ast.h"
3#include "code.h"
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004#include "symtable.h"
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005#include "structmember.h"
6
Neal Norwitz5d0ad502005-12-19 04:27:42 +00007/* error strings used for warnings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#define GLOBAL_AFTER_ASSIGN \
9"name '%.400s' is assigned to before global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000010
Jeremy Hylton81e95022007-02-27 06:50:52 +000011#define NONLOCAL_AFTER_ASSIGN \
12"name '%.400s' is assigned to before nonlocal declaration"
13
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#define GLOBAL_AFTER_USE \
15"name '%.400s' is used prior to global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000016
Jeremy Hylton81e95022007-02-27 06:50:52 +000017#define NONLOCAL_AFTER_USE \
18"name '%.400s' is used prior to nonlocal declaration"
19
Neal Norwitz5d0ad502005-12-19 04:27:42 +000020#define IMPORT_STAR_WARNING "import * only allowed at module level"
21
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000022#define RETURN_VAL_IN_GENERATOR \
23 "'return' with argument inside generator"
Neal Norwitz5d0ad502005-12-19 04:27:42 +000024
Benjamin Peterson55e00f22008-08-17 18:02:44 +000025
Neal Norwitz090b3dd2006-02-28 22:36:46 +000026static PySTEntryObject *
Benjamin Peterson55e00f22008-08-17 18:02:44 +000027ste_new(struct symtable *st, identifier name, _Py_block_ty block,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028 void *key, int lineno)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000029{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000030 PySTEntryObject *ste = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000031 PyObject *k;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000032
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033 k = PyLong_FromVoidPtr(key);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000034 if (k == NULL)
35 goto fail;
Christian Heimes08976cb2008-03-16 00:32:36 +000036 ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
37 if (ste == NULL)
38 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000039 ste->ste_table = st;
40 ste->ste_id = k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041 ste->ste_tmpname = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000042
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043 ste->ste_name = name;
44 Py_INCREF(name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000045
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000046 ste->ste_symbols = NULL;
47 ste->ste_varnames = NULL;
48 ste->ste_children = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000049
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000050 ste->ste_symbols = PyDict_New();
51 if (ste->ste_symbols == NULL)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000052 goto fail;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000053
54 ste->ste_varnames = PyList_New(0);
55 if (ste->ste_varnames == NULL)
56 goto fail;
57
58 ste->ste_children = PyList_New(0);
59 if (ste->ste_children == NULL)
60 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000061
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000062 ste->ste_type = block;
63 ste->ste_unoptimized = 0;
64 ste->ste_nested = 0;
65 ste->ste_free = 0;
66 ste->ste_varargs = 0;
67 ste->ste_varkeywords = 0;
Jeremy Hylton86424e32001-12-04 02:41:46 +000068 ste->ste_opt_lineno = 0;
Jeremy Hylton4d508ad2003-05-21 17:34:50 +000069 ste->ste_tmpname = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000070 ste->ste_lineno = lineno;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000071
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000072 if (st->st_cur != NULL &&
73 (st->st_cur->ste_nested ||
74 st->st_cur->ste_type == FunctionBlock))
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000075 ste->ste_nested = 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000076 ste->ste_child_free = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +000077 ste->ste_generator = 0;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000078 ste->ste_returns_value = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000079
Nick Coghlan650f0d02007-04-15 12:05:43 +000080 if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000081 goto fail;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +000082
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000083 return ste;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000084 fail:
85 Py_XDECREF(ste);
86 return NULL;
87}
88
89static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000090ste_repr(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000091{
Walter Dörwald5d4ede12007-06-11 16:03:16 +000092 return PyUnicode_FromFormat("<symtable entry %U(%ld), line %d>",
93 ste->ste_name,
Christian Heimes217cfd12007-12-02 14:31:20 +000094 PyLong_AS_LONG(ste->ste_id), ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000095}
96
97static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000098ste_dealloc(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000099{
100 ste->ste_table = NULL;
101 Py_XDECREF(ste->ste_id);
102 Py_XDECREF(ste->ste_name);
103 Py_XDECREF(ste->ste_symbols);
104 Py_XDECREF(ste->ste_varnames);
105 Py_XDECREF(ste->ste_children);
106 PyObject_Del(ste);
107}
108
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000109#define OFF(x) offsetof(PySTEntryObject, x)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000110
Guido van Rossum6f799372001-09-20 20:46:19 +0000111static PyMemberDef ste_memberlist[] = {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000112 {"id", T_OBJECT, OFF(ste_id), READONLY},
113 {"name", T_OBJECT, OFF(ste_name), READONLY},
114 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
115 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
116 {"children", T_OBJECT, OFF(ste_children), READONLY},
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000117 {"optimized",T_INT, OFF(ste_unoptimized), READONLY},
118 {"nested", T_INT, OFF(ste_nested), READONLY},
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000119 {"type", T_INT, OFF(ste_type), READONLY},
120 {"lineno", T_INT, OFF(ste_lineno), READONLY},
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000121 {NULL}
122};
123
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000124PyTypeObject PySTEntry_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000125 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000126 "symtable entry",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 sizeof(PySTEntryObject),
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000128 0,
129 (destructor)ste_dealloc, /* tp_dealloc */
130 0, /* tp_print */
Guido van Rossum6f799372001-09-20 20:46:19 +0000131 0, /* tp_getattr */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000132 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000133 0, /* tp_reserved */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000134 (reprfunc)ste_repr, /* tp_repr */
135 0, /* tp_as_number */
136 0, /* tp_as_sequence */
137 0, /* tp_as_mapping */
138 0, /* tp_hash */
139 0, /* tp_call */
140 0, /* tp_str */
Guido van Rossum6f799372001-09-20 20:46:19 +0000141 PyObject_GenericGetAttr, /* tp_getattro */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000142 0, /* tp_setattro */
143 0, /* tp_as_buffer */
144 Py_TPFLAGS_DEFAULT, /* tp_flags */
145 0, /* tp_doc */
Guido van Rossum6f799372001-09-20 20:46:19 +0000146 0, /* tp_traverse */
147 0, /* tp_clear */
148 0, /* tp_richcompare */
149 0, /* tp_weaklistoffset */
150 0, /* tp_iter */
151 0, /* tp_iternext */
152 0, /* tp_methods */
153 ste_memberlist, /* tp_members */
154 0, /* tp_getset */
155 0, /* tp_base */
156 0, /* tp_dict */
157 0, /* tp_descr_get */
158 0, /* tp_descr_set */
159 0, /* tp_dictoffset */
160 0, /* tp_init */
161 0, /* tp_alloc */
162 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000163};
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000164
165static int symtable_analyze(struct symtable *st);
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000166static int symtable_warn(struct symtable *st, char *msg, int lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000167static int symtable_enter_block(struct symtable *st, identifier name,
Neal Norwitz62c2fac2005-10-24 00:30:44 +0000168 _Py_block_ty block, void *ast, int lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000169static int symtable_exit_block(struct symtable *st, void *ast);
170static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
171static int symtable_visit_expr(struct symtable *st, expr_ty s);
172static int symtable_visit_genexp(struct symtable *st, expr_ty s);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000173static int symtable_visit_listcomp(struct symtable *st, expr_ty s);
174static int symtable_visit_setcomp(struct symtable *st, expr_ty s);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000175static int symtable_visit_dictcomp(struct symtable *st, expr_ty s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000176static int symtable_visit_arguments(struct symtable *st, arguments_ty);
177static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
178static int symtable_visit_alias(struct symtable *st, alias_ty);
179static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
180static int symtable_visit_keyword(struct symtable *st, keyword_ty);
181static int symtable_visit_slice(struct symtable *st, slice_ty);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000182static int symtable_visit_params(struct symtable *st, asdl_seq *args);
183static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000184static int symtable_implicit_arg(struct symtable *st, int pos);
Neal Norwitzc1505362006-12-28 06:47:50 +0000185static int symtable_visit_annotations(struct symtable *st, stmt_ty s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186
187
Nick Coghlan650f0d02007-04-15 12:05:43 +0000188static identifier top = NULL, lambda = NULL, genexpr = NULL,
Benjamin Petersondcaf3292009-03-03 00:54:05 +0000189 listcomp = NULL, setcomp = NULL, dictcomp = NULL,
190 __class__ = NULL, __locals__ = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000191
192#define GET_IDENTIFIER(VAR) \
Martin v. Löwis5b222132007-06-10 09:51:05 +0000193 ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000194
195#define DUPLICATE_ARGUMENT \
Neal Norwitza5d16a32007-08-24 22:53:58 +0000196"duplicate argument '%U' in function definition"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000197
198static struct symtable *
199symtable_new(void)
200{
201 struct symtable *st;
202
203 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
204 if (st == NULL)
205 return NULL;
206
207 st->st_filename = NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000208 st->st_blocks = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000209
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210 if ((st->st_stack = PyList_New(0)) == NULL)
211 goto fail;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000212 if ((st->st_blocks = PyDict_New()) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000213 goto fail;
214 st->st_cur = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000215 st->st_private = NULL;
216 return st;
217 fail:
218 PySymtable_Free(st);
219 return NULL;
220}
221
222struct symtable *
223PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
224{
225 struct symtable *st = symtable_new();
226 asdl_seq *seq;
227 int i;
228
229 if (st == NULL)
230 return st;
231 st->st_filename = filename;
232 st->st_future = future;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000233 /* Make the initial symbol information gathering pass */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000234 if (!GET_IDENTIFIER(top) ||
235 !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000236 PySymtable_Free(st);
237 return NULL;
238 }
239
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000240 st->st_top = st->st_cur;
241 st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000242 switch (mod->kind) {
243 case Module_kind:
244 seq = mod->v.Module.body;
245 for (i = 0; i < asdl_seq_LEN(seq); i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000246 if (!symtable_visit_stmt(st,
247 (stmt_ty)asdl_seq_GET(seq, i)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 goto error;
249 break;
250 case Expression_kind:
251 if (!symtable_visit_expr(st, mod->v.Expression.body))
252 goto error;
253 break;
254 case Interactive_kind:
255 seq = mod->v.Interactive.body;
256 for (i = 0; i < asdl_seq_LEN(seq); i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000257 if (!symtable_visit_stmt(st,
258 (stmt_ty)asdl_seq_GET(seq, i)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259 goto error;
260 break;
261 case Suite_kind:
262 PyErr_SetString(PyExc_RuntimeError,
263 "this compiler does not handle Suites");
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000264 goto error;
265 }
266 if (!symtable_exit_block(st, (void *)mod)) {
267 PySymtable_Free(st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000268 return NULL;
269 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000270 /* Make the second symbol analysis pass */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271 if (symtable_analyze(st))
272 return st;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000273 PySymtable_Free(st);
274 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 error:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000276 (void) symtable_exit_block(st, (void *)mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277 PySymtable_Free(st);
278 return NULL;
279}
280
281void
282PySymtable_Free(struct symtable *st)
283{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000284 Py_XDECREF(st->st_blocks);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000285 Py_XDECREF(st->st_stack);
286 PyMem_Free((void *)st);
287}
288
289PySTEntryObject *
290PySymtable_Lookup(struct symtable *st, void *key)
291{
292 PyObject *k, *v;
293
294 k = PyLong_FromVoidPtr(key);
295 if (k == NULL)
296 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000297 v = PyDict_GetItem(st->st_blocks, k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 if (v) {
299 assert(PySTEntry_Check(v));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000300 Py_INCREF(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 }
302 else {
303 PyErr_SetString(PyExc_KeyError,
304 "unknown symbol table entry");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000305 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000306
307 Py_DECREF(k);
308 return (PySTEntryObject *)v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000309}
310
311int
312PyST_GetScope(PySTEntryObject *ste, PyObject *name)
313{
314 PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
315 if (!v)
316 return 0;
Christian Heimes217cfd12007-12-02 14:31:20 +0000317 assert(PyLong_Check(v));
318 return (PyLong_AS_LONG(v) >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319}
320
321
322/* Analyze raw symbol information to determine scope of each name.
323
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000324 The next several functions are helpers for symtable_analyze(),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 which determines whether a name is local, global, or free. In addition,
326 it determines which local variables are cell variables; they provide
327 bindings that are used for free variables in enclosed blocks.
328
Nick Coghlan650f0d02007-04-15 12:05:43 +0000329 There are also two kinds of global variables, implicit and explicit. An
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000330 explicit global is declared with the global statement. An implicit
331 global is a free variable for which the compiler has found no binding
332 in an enclosing function scope. The implicit global is either a global
333 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
334 to handle these names to implement slightly odd semantics. In such a
335 block, the name is treated as global until it is assigned to; then it
336 is treated as a local.
337
338 The symbol table requires two passes to determine the scope of each name.
Nick Coghlan650f0d02007-04-15 12:05:43 +0000339 The first pass collects raw facts from the AST via the symtable_visit_*
340 functions: the name is a parameter here, the name is used but not defined
341 here, etc. The second pass analyzes these facts during a pass over the
342 PySTEntryObjects created during pass 1.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000343
344 When a function is entered during the second pass, the parent passes
345 the set of all name bindings visible to its children. These bindings
Nick Coghlan650f0d02007-04-15 12:05:43 +0000346 are used to determine if non-local variables are free or implicit globals.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000347 Names which are explicitly declared nonlocal must exist in this set of
348 visible names - if they do not, a syntax error is raised. After doing
349 the local analysis, it analyzes each of its child blocks using an
350 updated set of name bindings.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000351
Nick Coghlan650f0d02007-04-15 12:05:43 +0000352 The children update the free variable set. If a local variable is added to
353 the free variable set by the child, the variable is marked as a cell. The
354 function object being defined must provide runtime storage for the variable
355 that may outlive the function's frame. Cell variables are removed from the
356 free set before the analyze function returns to its parent.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000357
Nick Coghlan650f0d02007-04-15 12:05:43 +0000358 During analysis, the names are:
359 symbols: dict mapping from symbol names to flag values (including offset scope values)
360 scopes: dict mapping from symbol names to scope values (no offset)
361 local: set of all symbol names local to the current scope
362 bound: set of all symbol names local to a containing function scope
363 free: set of all symbol names referenced but not bound in child scopes
364 global: set of all symbol names explicitly declared as global
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000365*/
366
367#define SET_SCOPE(DICT, NAME, I) { \
Christian Heimes217cfd12007-12-02 14:31:20 +0000368 PyObject *o = PyLong_FromLong(I); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000369 if (!o) \
370 return 0; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000371 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
372 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000373 return 0; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000374 } \
375 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000376}
377
378/* Decide on scope of name, given flags.
379
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000380 The namespace dictionaries may be modified to record information
381 about the new name. For example, a new global will add an entry to
382 global. A name that was global can be changed to local.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383*/
384
385static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000386analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387 PyObject *bound, PyObject *local, PyObject *free,
388 PyObject *global)
389{
390 if (flags & DEF_GLOBAL) {
391 if (flags & DEF_PARAM) {
392 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000393 "name '%U' is parameter and global",
394 name);
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000395 PyErr_SyntaxLocation(ste->ste_table->st_filename,
396 ste->ste_lineno);
397
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398 return 0;
399 }
Jeremy Hylton81e95022007-02-27 06:50:52 +0000400 if (flags & DEF_NONLOCAL) {
401 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000402 "name '%U' is nonlocal and global",
403 name);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000404 return 0;
405 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000406 SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
407 if (PySet_Add(global, name) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000408 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000409 if (bound && (PySet_Discard(bound, name) < 0))
410 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411 return 1;
412 }
Jeremy Hylton81e95022007-02-27 06:50:52 +0000413 if (flags & DEF_NONLOCAL) {
414 if (flags & DEF_PARAM) {
415 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000416 "name '%U' is parameter and nonlocal",
417 name);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000418 return 0;
419 }
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000420 if (!bound) {
421 PyErr_Format(PyExc_SyntaxError,
422 "nonlocal declaration not allowed at module level");
423 return 0;
424 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000425 if (!PySet_Contains(bound, name)) {
Jeremy Hylton81e95022007-02-27 06:50:52 +0000426 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000427 "no binding for nonlocal '%U' found",
428 name);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000429
430 return 0;
431 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000432 SET_SCOPE(scopes, name, FREE);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000433 ste->ste_free = 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000434 return PySet_Add(free, name) >= 0;
Jeremy Hylton81e95022007-02-27 06:50:52 +0000435 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436 if (flags & DEF_BOUND) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000437 SET_SCOPE(scopes, name, LOCAL);
438 if (PySet_Add(local, name) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000440 if (PySet_Discard(global, name) < 0)
441 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000442 return 1;
443 }
444 /* If an enclosing block has a binding for this name, it
445 is a free variable rather than a global variable.
446 Note that having a non-NULL bound implies that the block
447 is nested.
448 */
Nick Coghlan650f0d02007-04-15 12:05:43 +0000449 if (bound && PySet_Contains(bound, name)) {
450 SET_SCOPE(scopes, name, FREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000451 ste->ste_free = 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000452 return PySet_Add(free, name) >= 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 }
454 /* If a parent has a global statement, then call it global
455 explicit? It could also be global implicit.
456 */
Nick Coghlan650f0d02007-04-15 12:05:43 +0000457 if (global && PySet_Contains(global, name)) {
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000458 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000459 return 1;
460 }
Jeremy Hylton81e95022007-02-27 06:50:52 +0000461 if (ste->ste_nested)
462 ste->ste_free = 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000463 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000464 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000465}
466
467#undef SET_SCOPE
468
469/* If a name is defined in free and also in locals, then this block
470 provides the binding for the free variable. The name should be
471 marked CELL in this block and removed from the free list.
472
473 Note that the current block's free variables are included in free.
474 That's safe because no name can be free and local in the same scope.
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000475
Martin v. Löwis2673a572007-10-29 19:54:24 +0000476 The 'restricted' argument may be set to a string to restrict the analysis
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000477 to the one variable whose name equals that string (e.g. "__class__").
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478*/
479
480static int
Martin v. Löwis2673a572007-10-29 19:54:24 +0000481analyze_cells(PyObject *scopes, PyObject *free, const char *restricted)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000482{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000483 PyObject *name, *v, *v_cell;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000484 int success = 0;
485 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000486
Christian Heimes217cfd12007-12-02 14:31:20 +0000487 v_cell = PyLong_FromLong(CELL);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000488 if (!v_cell)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000490 while (PyDict_Next(scopes, &pos, &name, &v)) {
491 long scope;
Christian Heimes217cfd12007-12-02 14:31:20 +0000492 assert(PyLong_Check(v));
493 scope = PyLong_AS_LONG(v);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000494 if (scope != LOCAL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495 continue;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000496 if (!PySet_Contains(free, name))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497 continue;
Martin v. Löwis2673a572007-10-29 19:54:24 +0000498 if (restricted != NULL &&
499 PyUnicode_CompareWithASCIIString(name, restricted))
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000500 continue;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501 /* Replace LOCAL with CELL for this name, and remove
502 from free. It is safe to replace the value of name
503 in the dict, because it will not cause a resize.
504 */
Nick Coghlan650f0d02007-04-15 12:05:43 +0000505 if (PyDict_SetItem(scopes, name, v_cell) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000507 if (PySet_Discard(free, name) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000508 goto error;
509 }
510 success = 1;
511 error:
Nick Coghlan650f0d02007-04-15 12:05:43 +0000512 Py_DECREF(v_cell);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 return success;
514}
515
516/* Check for illegal statements in unoptimized namespaces */
517static int
518check_unoptimized(const PySTEntryObject* ste) {
Armin Rigo31441302005-10-21 12:57:31 +0000519 const char* trailer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520
Neil Schemenauer2dfcef52005-10-23 18:50:36 +0000521 if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522 || !(ste->ste_free || ste->ste_child_free))
523 return 1;
524
Armin Rigo31441302005-10-21 12:57:31 +0000525 trailer = (ste->ste_child_free ?
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526 "contains a nested function with free variables" :
527 "is a nested function");
528
529 switch (ste->ste_unoptimized) {
Georg Brandl7cae87c2006-09-06 06:51:57 +0000530 case OPT_TOPLEVEL: /* import * at top-level is fine */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000531 return 1;
532 case OPT_IMPORT_STAR:
Walter Dörwald3ef72bb2007-06-11 16:12:10 +0000533 PyErr_Format(PyExc_SyntaxError,
534 "import * is not allowed in function '%U' because it %s",
Walter Dörwalde42109d2007-06-11 16:08:41 +0000535 ste->ste_name, trailer);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000536 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000537 }
538
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000539 PyErr_SyntaxLocation(ste->ste_table->st_filename,
540 ste->ste_opt_lineno);
541 return 0;
542}
543
Nick Coghlan650f0d02007-04-15 12:05:43 +0000544/* Enter the final scope information into the ste_symbols dict.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 *
546 * All arguments are dicts. Modifies symbols, others are read-only.
547*/
548static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000549update_symbols(PyObject *symbols, PyObject *scopes,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000550 PyObject *bound, PyObject *free, int classflag)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000551{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000552 PyObject *name = NULL, *itr = NULL;
553 PyObject *v = NULL, *v_scope = NULL, *v_new = NULL, *v_free = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000554 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555
Nick Coghlan650f0d02007-04-15 12:05:43 +0000556 /* Update scope information for all symbols in this scope */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000557 while (PyDict_Next(symbols, &pos, &name, &v)) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000558 long scope, flags;
Christian Heimes217cfd12007-12-02 14:31:20 +0000559 assert(PyLong_Check(v));
560 flags = PyLong_AS_LONG(v);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000561 v_scope = PyDict_GetItem(scopes, name);
Christian Heimes217cfd12007-12-02 14:31:20 +0000562 assert(v_scope && PyLong_Check(v_scope));
563 scope = PyLong_AS_LONG(v_scope);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000564 flags |= (scope << SCOPE_OFFSET);
Christian Heimes217cfd12007-12-02 14:31:20 +0000565 v_new = PyLong_FromLong(flags);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000566 if (!v_new)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000567 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000568 if (PyDict_SetItem(symbols, name, v_new) < 0) {
569 Py_DECREF(v_new);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 return 0;
571 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000572 Py_DECREF(v_new);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 }
574
Nick Coghlan650f0d02007-04-15 12:05:43 +0000575 /* Record not yet resolved free variables from children (if any) */
Christian Heimes217cfd12007-12-02 14:31:20 +0000576 v_free = PyLong_FromLong(FREE << SCOPE_OFFSET);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000577 if (!v_free)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 return 0;
579
Nick Coghlan650f0d02007-04-15 12:05:43 +0000580 itr = PyObject_GetIter(free);
581 if (!itr)
582 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
Nick Coghlan650f0d02007-04-15 12:05:43 +0000584 while ((name = PyIter_Next(itr))) {
585 v = PyDict_GetItem(symbols, name);
586
587 /* Handle symbol that already exists in this scope */
588 if (v) {
589 /* Handle a free variable in a method of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590 the class that has the same name as a local
591 or global in the class scope.
592 */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000593 if (classflag &&
Christian Heimes217cfd12007-12-02 14:31:20 +0000594 PyLong_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) {
595 long flags = PyLong_AS_LONG(v) | DEF_FREE_CLASS;
596 v_new = PyLong_FromLong(flags);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000597 if (!v_new) {
598 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000600 if (PyDict_SetItem(symbols, name, v_new) < 0) {
601 Py_DECREF(v_new);
602 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000604 Py_DECREF(v_new);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000605 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000606 /* It's a cell, or already free in this scope */
Nick Coghlan650f0d02007-04-15 12:05:43 +0000607 Py_DECREF(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608 continue;
609 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000610 /* Handle global symbol */
611 if (!PySet_Contains(bound, name)) {
612 Py_DECREF(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613 continue; /* it's a global */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000615 /* Propagate new free symbol up the lexical stack */
616 if (PyDict_SetItem(symbols, name, v_free) < 0) {
617 goto error;
618 }
619 Py_DECREF(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000621 Py_DECREF(itr);
622 Py_DECREF(v_free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000623 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000624error:
625 Py_XDECREF(v_free);
626 Py_XDECREF(itr);
627 Py_XDECREF(name);
628 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629}
630
631/* Make final symbol table decisions for block of ste.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000632
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633 Arguments:
634 ste -- current symtable entry (input/output)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000635 bound -- set of variables bound in enclosing scopes (input). bound
636 is NULL for module blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000637 free -- set of free variables in enclosed scopes (output)
638 globals -- set of declared global variables in enclosing scopes (input)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000639
640 The implementation uses two mutually recursive functions,
641 analyze_block() and analyze_child_block(). analyze_block() is
642 responsible for analyzing the individual names defined in a block.
643 analyze_child_block() prepares temporary namespace dictionaries
644 used to evaluated nested blocks.
645
646 The two functions exist because a child block should see the name
647 bindings of its enclosing blocks, but those bindings should not
648 propagate back to a parent block.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649*/
650
651static int
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000652analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
653 PyObject *global, PyObject* child_free);
654
655static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000656analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
657 PyObject *global)
658{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000659 PyObject *name, *v, *local = NULL, *scopes = NULL, *newbound = NULL;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000660 PyObject *newglobal = NULL, *newfree = NULL, *allfree = NULL;
Benjamin Peterson57512582009-05-12 20:39:25 +0000661 PyObject *temp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000662 int i, success = 0;
663 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000664
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000665 local = PySet_New(NULL); /* collect new names bound in block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000666 if (!local)
667 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000668 scopes = PyDict_New(); /* collect scopes defined for each name */
669 if (!scopes)
670 goto error;
671
672 /* Allocate new global and bound variable dictionaries. These
673 dictionaries hold the names visible in nested blocks. For
674 ClassBlocks, the bound and global names are initialized
675 before analyzing names, because class bindings aren't
676 visible in methods. For other blocks, they are initialized
677 after names are analyzed.
678 */
679
680 /* TODO(jhylton): Package these dicts in a struct so that we
681 can write reasonable helper functions?
682 */
Nick Coghlan650f0d02007-04-15 12:05:43 +0000683 newglobal = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000684 if (!newglobal)
685 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000686 newfree = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000687 if (!newfree)
688 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000689 newbound = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000690 if (!newbound)
691 goto error;
692
Nick Coghlan650f0d02007-04-15 12:05:43 +0000693 /* Class namespace has no effect on names visible in
694 nested functions, so populate the global and bound
695 sets to be passed to child blocks before analyzing
696 this one.
697 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698 if (ste->ste_type == ClassBlock) {
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000699 /* Pass down known globals */
Benjamin Peterson57512582009-05-12 20:39:25 +0000700 temp = PyNumber_InPlaceOr(newglobal, global);
701 if (!temp)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000702 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000703 Py_DECREF(temp);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000704 /* Pass down previously bound symbols */
705 if (bound) {
Benjamin Peterson57512582009-05-12 20:39:25 +0000706 temp = PyNumber_InPlaceOr(newbound, bound);
707 if (!temp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000708 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000709 Py_DECREF(temp);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000710 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711 }
712
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000714 long flags = PyLong_AS_LONG(v);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000715 if (!analyze_name(ste, scopes, name, flags,
716 bound, local, free, global))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000717 goto error;
718 }
719
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000720 /* Populate global and bound sets to be passed to children. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000721 if (ste->ste_type != ClassBlock) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000722 /* Add function locals to bound set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson57512582009-05-12 20:39:25 +0000724 temp = PyNumber_InPlaceOr(newbound, local);
725 if (!temp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000727 Py_DECREF(temp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000729 /* Pass down previously bound symbols */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730 if (bound) {
Benjamin Peterson57512582009-05-12 20:39:25 +0000731 temp = PyNumber_InPlaceOr(newbound, bound);
732 if (!temp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000734 Py_DECREF(temp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000736 /* Pass down known globals */
Benjamin Peterson57512582009-05-12 20:39:25 +0000737 temp = PyNumber_InPlaceOr(newglobal, global);
738 if (!temp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000740 Py_DECREF(temp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000742 else {
743 /* Special-case __class__ */
744 if (!GET_IDENTIFIER(__class__))
745 goto error;
746 assert(PySet_Contains(local, __class__) == 1);
747 if (PySet_Add(newbound, __class__) < 0)
748 goto error;
749 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000751 /* Recursively call analyze_block() on each child block.
752
753 newbound, newglobal now contain the names visible in
754 nested blocks. The free variables in the children will
755 be collected in allfree.
756 */
757 allfree = PySet_New(NULL);
758 if (!allfree)
759 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
761 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
Armin Rigo31441302005-10-21 12:57:31 +0000762 PySTEntryObject* entry;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000763 assert(c && PySTEntry_Check(c));
Armin Rigo31441302005-10-21 12:57:31 +0000764 entry = (PySTEntryObject*)c;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000765 if (!analyze_child_block(entry, newbound, newfree, newglobal,
766 allfree))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000768 /* Check if any children have free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 if (entry->ste_free || entry->ste_child_free)
770 ste->ste_child_free = 1;
771 }
772
Benjamin Peterson57512582009-05-12 20:39:25 +0000773 temp = PyNumber_InPlaceOr(newfree, allfree);
774 if (!temp)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000775 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000776 Py_DECREF(temp);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000777
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000778 /* Check if any local variables must be converted to cell variables */
779 if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree,
780 NULL))
781 goto error;
782 else if (ste->ste_type == ClassBlock && !analyze_cells(scopes, newfree,
783 "__class__"))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000785 /* Records the results of the analysis in the symbol table entry */
786 if (!update_symbols(ste->ste_symbols, scopes, bound, newfree,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 ste->ste_type == ClassBlock))
788 goto error;
789 if (!check_unoptimized(ste))
790 goto error;
791
Benjamin Peterson57512582009-05-12 20:39:25 +0000792 temp = PyNumber_InPlaceOr(free, newfree);
793 if (!temp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000794 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000795 Py_DECREF(temp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796 success = 1;
797 error:
Nick Coghlan650f0d02007-04-15 12:05:43 +0000798 Py_XDECREF(scopes);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799 Py_XDECREF(local);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 Py_XDECREF(newbound);
801 Py_XDECREF(newglobal);
802 Py_XDECREF(newfree);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000803 Py_XDECREF(allfree);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 if (!success)
805 assert(PyErr_Occurred());
806 return success;
807}
808
809static int
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000810analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
811 PyObject *global, PyObject* child_free)
812{
813 PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
Benjamin Peterson57512582009-05-12 20:39:25 +0000814 PyObject *temp;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000815
816 /* Copy the bound and global dictionaries.
817
818 These dictionary are used by all blocks enclosed by the
819 current block. The analyze_block() call modifies these
820 dictionaries.
821
822 */
823 temp_bound = PySet_New(bound);
824 if (!temp_bound)
825 goto error;
826 temp_free = PySet_New(free);
827 if (!temp_free)
828 goto error;
829 temp_global = PySet_New(global);
830 if (!temp_global)
831 goto error;
832
833 if (!analyze_block(entry, temp_bound, temp_free, temp_global))
834 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000835 temp = PyNumber_InPlaceOr(child_free, temp_free);
836 if (!temp)
Benjamin Petersond1e54932009-04-02 02:27:20 +0000837 goto error;
Benjamin Peterson57512582009-05-12 20:39:25 +0000838 Py_DECREF(temp);
Benjamin Petersond1e54932009-04-02 02:27:20 +0000839 Py_DECREF(temp_bound);
840 Py_DECREF(temp_free);
841 Py_DECREF(temp_global);
842 return 1;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000843 error:
844 Py_XDECREF(temp_bound);
845 Py_XDECREF(temp_free);
846 Py_XDECREF(temp_global);
Benjamin Petersond1e54932009-04-02 02:27:20 +0000847 return 0;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000848}
849
850static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000851symtable_analyze(struct symtable *st)
852{
853 PyObject *free, *global;
854 int r;
855
Nick Coghlan650f0d02007-04-15 12:05:43 +0000856 free = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857 if (!free)
858 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000859 global = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 if (!global) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000861 Py_DECREF(free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862 return 0;
863 }
864 r = analyze_block(st->st_top, NULL, free, global);
865 Py_DECREF(free);
866 Py_DECREF(global);
867 return r;
868}
869
870
871static int
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000872symtable_warn(struct symtable *st, char *msg, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873{
874 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000875 lineno, NULL, NULL) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
877 PyErr_SetString(PyExc_SyntaxError, msg);
878 PyErr_SyntaxLocation(st->st_filename,
879 st->st_cur->ste_lineno);
880 }
881 return 0;
882 }
883 return 1;
884}
885
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000886/* symtable_enter_block() gets a reference via ste_new.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000887 This reference is released when the block is exited, via the DECREF
888 in symtable_exit_block().
889*/
890
891static int
892symtable_exit_block(struct symtable *st, void *ast)
893{
Martin v. Löwisd96ee902006-02-16 14:37:16 +0000894 Py_ssize_t end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000896 Py_CLEAR(st->st_cur);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 end = PyList_GET_SIZE(st->st_stack) - 1;
898 if (end >= 0) {
899 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
900 end);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000901 if (st->st_cur == NULL)
902 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 Py_INCREF(st->st_cur);
904 if (PySequence_DelItem(st->st_stack, end) < 0)
905 return 0;
906 }
907 return 1;
908}
909
910static int
Neal Norwitz62c2fac2005-10-24 00:30:44 +0000911symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 void *ast, int lineno)
913{
914 PySTEntryObject *prev = NULL;
915
916 if (st->st_cur) {
917 prev = st->st_cur;
918 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919 return 0;
920 }
921 Py_DECREF(st->st_cur);
922 }
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000923 st->st_cur = ste_new(st, name, block, ast, lineno);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000924 if (st->st_cur == NULL)
925 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 if (name == GET_IDENTIFIER(top))
927 st->st_global = st->st_cur->ste_symbols;
928 if (prev) {
929 if (PyList_Append(prev->ste_children,
930 (PyObject *)st->st_cur) < 0) {
931 return 0;
932 }
933 }
934 return 1;
935}
936
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000937static long
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938symtable_lookup(struct symtable *st, PyObject *name)
939{
940 PyObject *o;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000941 PyObject *mangled = _Py_Mangle(st->st_private, name);
942 if (!mangled)
943 return 0;
944 o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
945 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946 if (!o)
947 return 0;
Christian Heimes217cfd12007-12-02 14:31:20 +0000948 return PyLong_AsLong(o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949}
950
951static int
952symtable_add_def(struct symtable *st, PyObject *name, int flag)
953{
954 PyObject *o;
955 PyObject *dict;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000956 long val;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000957 PyObject *mangled = _Py_Mangle(st->st_private, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958
Jeremy Hylton81e95022007-02-27 06:50:52 +0000959
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000960 if (!mangled)
961 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 dict = st->st_cur->ste_symbols;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000963 if ((o = PyDict_GetItem(dict, mangled))) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000964 val = PyLong_AS_LONG(o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000966 /* Is it better to use 'mangled' or 'name' here? */
Neal Norwitza5d16a32007-08-24 22:53:58 +0000967 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 PyErr_SyntaxLocation(st->st_filename,
969 st->st_cur->ste_lineno);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000970 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 }
972 val |= flag;
973 } else
974 val = flag;
Christian Heimes217cfd12007-12-02 14:31:20 +0000975 o = PyLong_FromLong(val);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 if (o == NULL)
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000977 goto error;
978 if (PyDict_SetItem(dict, mangled, o) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000979 Py_DECREF(o);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000980 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 }
982 Py_DECREF(o);
983
984 if (flag & DEF_PARAM) {
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000985 if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
986 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 } else if (flag & DEF_GLOBAL) {
988 /* XXX need to update DEF_GLOBAL for other flags too;
989 perhaps only DEF_FREE_GLOBAL */
990 val = flag;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000991 if ((o = PyDict_GetItem(st->st_global, mangled))) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000992 val |= PyLong_AS_LONG(o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000994 o = PyLong_FromLong(val);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 if (o == NULL)
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000996 goto error;
997 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 Py_DECREF(o);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000999 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000 }
1001 Py_DECREF(o);
1002 }
Neal Norwitz4737b232005-11-19 23:58:29 +00001003 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 return 1;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001005
1006error:
1007 Py_DECREF(mangled);
1008 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009}
1010
1011/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
1012 They use the ASDL name to synthesize the name of the C type and the visit
1013 function.
1014
1015 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
1016 useful if the first node in the sequence requires special treatment.
1017*/
1018
1019#define VISIT(ST, TYPE, V) \
1020 if (!symtable_visit_ ## TYPE((ST), (V))) \
1021 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001022
1023#define VISIT_IN_BLOCK(ST, TYPE, V, S) \
1024 if (!symtable_visit_ ## TYPE((ST), (V))) { \
1025 symtable_exit_block((ST), (S)); \
1026 return 0; \
1027 }
1028
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029#define VISIT_SEQ(ST, TYPE, SEQ) { \
1030 int i; \
1031 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1032 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001033 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 if (!symtable_visit_ ## TYPE((ST), elt)) \
1035 return 0; \
1036 } \
1037}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001038
1039#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
1040 int i; \
1041 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1042 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001043 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001044 if (!symtable_visit_ ## TYPE((ST), elt)) { \
1045 symtable_exit_block((ST), (S)); \
1046 return 0; \
1047 } \
1048 } \
1049}
1050
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
1052 int i; \
1053 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1054 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001055 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056 if (!symtable_visit_ ## TYPE((ST), elt)) \
1057 return 0; \
1058 } \
1059}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001060
1061#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
1062 int i; \
1063 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1064 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001065 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001066 if (!symtable_visit_ ## TYPE((ST), elt)) { \
1067 symtable_exit_block((ST), (S)); \
1068 return 0; \
1069 } \
1070 } \
1071}
1072
Guido van Rossum4f72a782006-10-27 23:31:49 +00001073#define VISIT_KWONLYDEFAULTS(ST, KW_DEFAULTS) { \
1074 int i = 0; \
1075 asdl_seq *seq = (KW_DEFAULTS); /* avoid variable capture */ \
1076 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
1077 expr_ty elt = (expr_ty)asdl_seq_GET(seq, i); \
1078 if (!elt) continue; /* can be NULL */ \
1079 if (!symtable_visit_expr((ST), elt)) \
1080 return 0; \
1081 } \
1082}
1083
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084static int
Guido van Rossumc2e20742006-02-27 22:32:47 +00001085symtable_new_tmpname(struct symtable *st)
1086{
1087 char tmpname[256];
1088 identifier tmp;
1089
1090 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
1091 ++st->st_cur->ste_tmpname);
Martin v. Löwis5b222132007-06-10 09:51:05 +00001092 tmp = PyUnicode_InternFromString(tmpname);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001093 if (!tmp)
1094 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001095 if (!symtable_add_def(st, tmp, DEF_LOCAL))
1096 return 0;
1097 Py_DECREF(tmp);
1098 return 1;
1099}
1100
Guido van Rossum4f72a782006-10-27 23:31:49 +00001101
1102
Guido van Rossumc2e20742006-02-27 22:32:47 +00001103static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104symtable_visit_stmt(struct symtable *st, stmt_ty s)
1105{
1106 switch (s->kind) {
1107 case FunctionDef_kind:
1108 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
1109 return 0;
1110 if (s->v.FunctionDef.args->defaults)
1111 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001112 if (s->v.FunctionDef.args->kw_defaults)
1113 VISIT_KWONLYDEFAULTS(st,
1114 s->v.FunctionDef.args->kw_defaults);
Neal Norwitzc1505362006-12-28 06:47:50 +00001115 if (!symtable_visit_annotations(st, s))
1116 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001117 if (s->v.FunctionDef.decorator_list)
1118 VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119 if (!symtable_enter_block(st, s->v.FunctionDef.name,
1120 FunctionBlock, (void *)s, s->lineno))
1121 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001122 VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
1123 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124 if (!symtable_exit_block(st, s))
1125 return 0;
1126 break;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001127 case ClassDef_kind: {
1128 PyObject *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
1130 return 0;
1131 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001132 VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
1133 if (s->v.ClassDef.starargs)
1134 VISIT(st, expr, s->v.ClassDef.starargs);
1135 if (s->v.ClassDef.kwargs)
1136 VISIT(st, expr, s->v.ClassDef.kwargs);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001137 if (s->v.ClassDef.decorator_list)
1138 VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
1140 (void *)s, s->lineno))
1141 return 0;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001142 if (!GET_IDENTIFIER(__class__) ||
Benjamin Petersondcaf3292009-03-03 00:54:05 +00001143 !symtable_add_def(st, __class__, DEF_LOCAL) ||
1144 !GET_IDENTIFIER(__locals__) ||
1145 !symtable_add_def(st, __locals__, DEF_PARAM)) {
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001146 symtable_exit_block(st, s);
1147 return 0;
1148 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001149 tmp = st->st_private;
1150 st->st_private = s->v.ClassDef.name;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001151 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001152 st->st_private = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 if (!symtable_exit_block(st, s))
1154 return 0;
1155 break;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001156 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 case Return_kind:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001158 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159 VISIT(st, expr, s->v.Return.value);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001160 st->st_cur->ste_returns_value = 1;
1161 if (st->st_cur->ste_generator) {
1162 PyErr_SetString(PyExc_SyntaxError,
1163 RETURN_VAL_IN_GENERATOR);
1164 PyErr_SyntaxLocation(st->st_filename,
1165 s->lineno);
1166 return 0;
1167 }
1168 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169 break;
1170 case Delete_kind:
1171 VISIT_SEQ(st, expr, s->v.Delete.targets);
1172 break;
1173 case Assign_kind:
1174 VISIT_SEQ(st, expr, s->v.Assign.targets);
1175 VISIT(st, expr, s->v.Assign.value);
1176 break;
1177 case AugAssign_kind:
1178 VISIT(st, expr, s->v.AugAssign.target);
1179 VISIT(st, expr, s->v.AugAssign.value);
1180 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 case For_kind:
1182 VISIT(st, expr, s->v.For.target);
1183 VISIT(st, expr, s->v.For.iter);
1184 VISIT_SEQ(st, stmt, s->v.For.body);
1185 if (s->v.For.orelse)
1186 VISIT_SEQ(st, stmt, s->v.For.orelse);
1187 break;
1188 case While_kind:
1189 VISIT(st, expr, s->v.While.test);
1190 VISIT_SEQ(st, stmt, s->v.While.body);
1191 if (s->v.While.orelse)
1192 VISIT_SEQ(st, stmt, s->v.While.orelse);
1193 break;
1194 case If_kind:
1195 /* XXX if 0: and lookup_yield() hacks */
1196 VISIT(st, expr, s->v.If.test);
1197 VISIT_SEQ(st, stmt, s->v.If.body);
1198 if (s->v.If.orelse)
1199 VISIT_SEQ(st, stmt, s->v.If.orelse);
1200 break;
1201 case Raise_kind:
Collin Winter828f04a2007-08-31 00:04:24 +00001202 if (s->v.Raise.exc) {
1203 VISIT(st, expr, s->v.Raise.exc);
1204 if (s->v.Raise.cause) {
1205 VISIT(st, expr, s->v.Raise.cause);
1206 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 }
1208 break;
1209 case TryExcept_kind:
1210 VISIT_SEQ(st, stmt, s->v.TryExcept.body);
1211 VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
1212 VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
1213 break;
1214 case TryFinally_kind:
1215 VISIT_SEQ(st, stmt, s->v.TryFinally.body);
1216 VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
1217 break;
1218 case Assert_kind:
1219 VISIT(st, expr, s->v.Assert.test);
1220 if (s->v.Assert.msg)
1221 VISIT(st, expr, s->v.Assert.msg);
1222 break;
1223 case Import_kind:
1224 VISIT_SEQ(st, alias, s->v.Import.names);
1225 /* XXX Don't have the lineno available inside
1226 visit_alias */
1227 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1228 st->st_cur->ste_opt_lineno = s->lineno;
1229 break;
1230 case ImportFrom_kind:
1231 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
1232 /* XXX Don't have the lineno available inside
1233 visit_alias */
1234 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1235 st->st_cur->ste_opt_lineno = s->lineno;
1236 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237 case Global_kind: {
1238 int i;
1239 asdl_seq *seq = s->v.Global.names;
1240 for (i = 0; i < asdl_seq_LEN(seq); i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001241 identifier name = (identifier)asdl_seq_GET(seq, i);
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001242 char *c_name = _PyUnicode_AsString(name);
Neal Norwitz46b7bda2006-01-08 01:06:06 +00001243 long cur = symtable_lookup(st, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 if (cur < 0)
1245 return 0;
1246 if (cur & (DEF_LOCAL | USE)) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001247 char buf[256];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 if (cur & DEF_LOCAL)
1249 PyOS_snprintf(buf, sizeof(buf),
1250 GLOBAL_AFTER_ASSIGN,
1251 c_name);
1252 else
1253 PyOS_snprintf(buf, sizeof(buf),
1254 GLOBAL_AFTER_USE,
1255 c_name);
Neal Norwitz5d0ad502005-12-19 04:27:42 +00001256 if (!symtable_warn(st, buf, s->lineno))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257 return 0;
1258 }
1259 if (!symtable_add_def(st, name, DEF_GLOBAL))
1260 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262 break;
1263 }
Jeremy Hylton81e95022007-02-27 06:50:52 +00001264 case Nonlocal_kind: {
1265 int i;
1266 asdl_seq *seq = s->v.Nonlocal.names;
1267 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1268 identifier name = (identifier)asdl_seq_GET(seq, i);
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001269 char *c_name = _PyUnicode_AsString(name);
Jeremy Hylton81e95022007-02-27 06:50:52 +00001270 long cur = symtable_lookup(st, name);
1271 if (cur < 0)
1272 return 0;
1273 if (cur & (DEF_LOCAL | USE)) {
1274 char buf[256];
1275 if (cur & DEF_LOCAL)
1276 PyOS_snprintf(buf, sizeof(buf),
1277 NONLOCAL_AFTER_ASSIGN,
1278 c_name);
1279 else
1280 PyOS_snprintf(buf, sizeof(buf),
1281 NONLOCAL_AFTER_USE,
1282 c_name);
1283 if (!symtable_warn(st, buf, s->lineno))
1284 return 0;
1285 }
1286 if (!symtable_add_def(st, name, DEF_NONLOCAL))
1287 return 0;
1288 }
1289 break;
1290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 case Expr_kind:
1292 VISIT(st, expr, s->v.Expr.value);
1293 break;
1294 case Pass_kind:
1295 case Break_kind:
1296 case Continue_kind:
1297 /* nothing to do here */
1298 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001299 case With_kind:
1300 if (!symtable_new_tmpname(st))
1301 return 0;
1302 VISIT(st, expr, s->v.With.context_expr);
1303 if (s->v.With.optional_vars) {
1304 if (!symtable_new_tmpname(st))
1305 return 0;
1306 VISIT(st, expr, s->v.With.optional_vars);
1307 }
1308 VISIT_SEQ(st, stmt, s->v.With.body);
1309 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 }
1311 return 1;
1312}
1313
1314static int
1315symtable_visit_expr(struct symtable *st, expr_ty e)
1316{
1317 switch (e->kind) {
1318 case BoolOp_kind:
1319 VISIT_SEQ(st, expr, e->v.BoolOp.values);
1320 break;
1321 case BinOp_kind:
1322 VISIT(st, expr, e->v.BinOp.left);
1323 VISIT(st, expr, e->v.BinOp.right);
1324 break;
1325 case UnaryOp_kind:
1326 VISIT(st, expr, e->v.UnaryOp.operand);
1327 break;
1328 case Lambda_kind: {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001329 if (!GET_IDENTIFIER(lambda) ||
1330 !symtable_add_def(st, lambda, DEF_LOCAL))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331 return 0;
1332 if (e->v.Lambda.args->defaults)
1333 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001334 if (!symtable_enter_block(st, lambda,
Benjamin Petersondb149ac2009-11-20 01:21:35 +00001335 FunctionBlock, (void *)e, e->lineno))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001336 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001337 VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
1338 VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001339 if (!symtable_exit_block(st, (void *)e))
1340 return 0;
1341 break;
1342 }
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001343 case IfExp_kind:
1344 VISIT(st, expr, e->v.IfExp.test);
1345 VISIT(st, expr, e->v.IfExp.body);
1346 VISIT(st, expr, e->v.IfExp.orelse);
1347 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348 case Dict_kind:
1349 VISIT_SEQ(st, expr, e->v.Dict.keys);
1350 VISIT_SEQ(st, expr, e->v.Dict.values);
1351 break;
Georg Brandl17ab9a02006-08-28 16:38:22 +00001352 case Set_kind:
1353 VISIT_SEQ(st, expr, e->v.Set.elts);
1354 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001355 case GeneratorExp_kind:
1356 if (!symtable_visit_genexp(st, e))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358 break;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001359 case ListComp_kind:
1360 if (!symtable_visit_listcomp(st, e))
1361 return 0;
1362 break;
1363 case SetComp_kind:
1364 if (!symtable_visit_setcomp(st, e))
1365 return 0;
1366 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001367 case DictComp_kind:
1368 if (!symtable_visit_dictcomp(st, e))
1369 return 0;
1370 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001371 case Yield_kind:
1372 if (e->v.Yield.value)
1373 VISIT(st, expr, e->v.Yield.value);
1374 st->st_cur->ste_generator = 1;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001375 if (st->st_cur->ste_returns_value) {
1376 PyErr_SetString(PyExc_SyntaxError,
1377 RETURN_VAL_IN_GENERATOR);
1378 PyErr_SyntaxLocation(st->st_filename,
1379 e->lineno);
1380 return 0;
1381 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001382 break;
1383 case Compare_kind:
1384 VISIT(st, expr, e->v.Compare.left);
1385 VISIT_SEQ(st, expr, e->v.Compare.comparators);
1386 break;
1387 case Call_kind:
1388 VISIT(st, expr, e->v.Call.func);
1389 VISIT_SEQ(st, expr, e->v.Call.args);
1390 VISIT_SEQ(st, keyword, e->v.Call.keywords);
1391 if (e->v.Call.starargs)
1392 VISIT(st, expr, e->v.Call.starargs);
1393 if (e->v.Call.kwargs)
1394 VISIT(st, expr, e->v.Call.kwargs);
1395 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 case Num_kind:
1397 case Str_kind:
Georg Brandlee91be42007-02-24 19:41:35 +00001398 case Bytes_kind:
1399 case Ellipsis_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 /* Nothing to do here. */
1401 break;
1402 /* The following exprs can be assignment targets. */
1403 case Attribute_kind:
1404 VISIT(st, expr, e->v.Attribute.value);
1405 break;
1406 case Subscript_kind:
1407 VISIT(st, expr, e->v.Subscript.value);
1408 VISIT(st, slice, e->v.Subscript.slice);
1409 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00001410 case Starred_kind:
1411 VISIT(st, expr, e->v.Starred.value);
1412 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 case Name_kind:
1414 if (!symtable_add_def(st, e->v.Name.id,
1415 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
1416 return 0;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001417 /* Special-case super: it counts as a use of __class__ */
1418 if (e->v.Name.ctx == Load &&
1419 st->st_cur->ste_type == FunctionBlock &&
1420 !PyUnicode_CompareWithASCIIString(e->v.Name.id, "super")) {
1421 if (!GET_IDENTIFIER(__class__) ||
1422 !symtable_add_def(st, __class__, USE))
1423 return 0;
1424 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425 break;
1426 /* child nodes of List and Tuple will have expr_context set */
1427 case List_kind:
1428 VISIT_SEQ(st, expr, e->v.List.elts);
1429 break;
1430 case Tuple_kind:
1431 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1432 break;
1433 }
1434 return 1;
1435}
1436
1437static int
1438symtable_implicit_arg(struct symtable *st, int pos)
1439{
Martin v. Löwis5b222132007-06-10 09:51:05 +00001440 PyObject *id = PyUnicode_FromFormat(".%d", pos);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441 if (id == NULL)
1442 return 0;
1443 if (!symtable_add_def(st, id, DEF_PARAM)) {
1444 Py_DECREF(id);
1445 return 0;
1446 }
1447 Py_DECREF(id);
1448 return 1;
1449}
1450
1451static int
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001452symtable_visit_params(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453{
Neal Norwitzdaf595f2006-01-07 21:24:54 +00001454 int i;
Neal Norwitzc1505362006-12-28 06:47:50 +00001455
1456 if (!args)
1457 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 for (i = 0; i < asdl_seq_LEN(args); i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001460 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001461 if (!symtable_add_def(st, arg->arg, DEF_PARAM))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462 return 0;
1463 }
1464
1465 return 1;
1466}
1467
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001468static int
1469symtable_visit_argannotations(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470{
1471 int i;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001472
1473 if (!args)
1474 return -1;
1475
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476 for (i = 0; i < asdl_seq_LEN(args); i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001477 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001478 if (arg->annotation)
1479 VISIT(st, expr, arg->annotation);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001481
1482 return 1;
1483}
1484
Neal Norwitzc1505362006-12-28 06:47:50 +00001485static int
1486symtable_visit_annotations(struct symtable *st, stmt_ty s)
1487{
1488 arguments_ty a = s->v.FunctionDef.args;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001490 if (a->args && !symtable_visit_argannotations(st, a->args))
Neal Norwitzc1505362006-12-28 06:47:50 +00001491 return 0;
1492 if (a->varargannotation)
1493 VISIT(st, expr, a->varargannotation);
1494 if (a->kwargannotation)
1495 VISIT(st, expr, a->kwargannotation);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001496 if (a->kwonlyargs && !symtable_visit_argannotations(st, a->kwonlyargs))
Neal Norwitzc1505362006-12-28 06:47:50 +00001497 return 0;
1498 if (s->v.FunctionDef.returns)
1499 VISIT(st, expr, s->v.FunctionDef.returns);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 return 1;
1501}
1502
1503static int
1504symtable_visit_arguments(struct symtable *st, arguments_ty a)
1505{
1506 /* skip default arguments inside function block
1507 XXX should ast be different?
1508 */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001509 if (a->args && !symtable_visit_params(st, a->args))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 return 0;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001511 if (a->kwonlyargs && !symtable_visit_params(st, a->kwonlyargs))
Guido van Rossum4f72a782006-10-27 23:31:49 +00001512 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 if (a->vararg) {
1514 if (!symtable_add_def(st, a->vararg, DEF_PARAM))
1515 return 0;
1516 st->st_cur->ste_varargs = 1;
1517 }
1518 if (a->kwarg) {
1519 if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
1520 return 0;
1521 st->st_cur->ste_varkeywords = 1;
1522 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001523 return 1;
1524}
1525
1526
1527static int
1528symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1529{
Neal Norwitzad74aa82008-03-31 05:14:30 +00001530 if (eh->v.ExceptHandler.type)
1531 VISIT(st, expr, eh->v.ExceptHandler.type);
1532 if (eh->v.ExceptHandler.name)
1533 if (!symtable_add_def(st, eh->v.ExceptHandler.name, DEF_LOCAL))
Guido van Rossum16be03e2007-01-10 18:51:35 +00001534 return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00001535 VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001536 return 1;
1537}
1538
1539
1540static int
1541symtable_visit_alias(struct symtable *st, alias_ty a)
1542{
1543 /* Compute store_name, the name actually bound by the import
1544 operation. It is diferent than a->name when a->name is a
1545 dotted package name (e.g. spam.eggs)
1546 */
1547 PyObject *store_name;
1548 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
Martin v. Löwis5b222132007-06-10 09:51:05 +00001549 const Py_UNICODE *base = PyUnicode_AS_UNICODE(name);
1550 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001551 if (dot) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001552 store_name = PyUnicode_FromUnicode(base, dot - base);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001553 if (!store_name)
1554 return 0;
1555 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556 else {
1557 store_name = name;
1558 Py_INCREF(store_name);
1559 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00001560 if (PyUnicode_CompareWithASCIIString(name, "*")) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1562 Py_DECREF(store_name);
1563 return r;
1564 }
1565 else {
1566 if (st->st_cur->ste_type != ModuleBlock) {
Neal Norwitz5d0ad502005-12-19 04:27:42 +00001567 int lineno = st->st_cur->ste_lineno;
Guido van Rossum33d26892007-08-05 15:29:28 +00001568 PyErr_SetString(PyExc_SyntaxError, IMPORT_STAR_WARNING);
1569 PyErr_SyntaxLocation(st->st_filename, lineno);
1570 Py_DECREF(store_name);
1571 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572 }
1573 st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
Neal Norwitz4737b232005-11-19 23:58:29 +00001574 Py_DECREF(store_name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 return 1;
1576 }
1577}
1578
1579
1580static int
1581symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1582{
1583 VISIT(st, expr, lc->target);
1584 VISIT(st, expr, lc->iter);
1585 VISIT_SEQ(st, expr, lc->ifs);
1586 return 1;
1587}
1588
1589
1590static int
1591symtable_visit_keyword(struct symtable *st, keyword_ty k)
1592{
1593 VISIT(st, expr, k->value);
1594 return 1;
1595}
1596
1597
1598static int
1599symtable_visit_slice(struct symtable *st, slice_ty s)
1600{
1601 switch (s->kind) {
1602 case Slice_kind:
1603 if (s->v.Slice.lower)
1604 VISIT(st, expr, s->v.Slice.lower)
1605 if (s->v.Slice.upper)
1606 VISIT(st, expr, s->v.Slice.upper)
1607 if (s->v.Slice.step)
1608 VISIT(st, expr, s->v.Slice.step)
1609 break;
1610 case ExtSlice_kind:
1611 VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
1612 break;
1613 case Index_kind:
1614 VISIT(st, expr, s->v.Index.value)
1615 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001616 }
1617 return 1;
1618}
1619
1620static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001621symtable_handle_comprehension(struct symtable *st, expr_ty e,
Guido van Rossum992d4a32007-07-11 13:09:30 +00001622 identifier scope_name, asdl_seq *generators,
1623 expr_ty elt, expr_ty value)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001625 int is_generator = (e->kind == GeneratorExp_kind);
1626 int needs_tmp = !is_generator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001627 comprehension_ty outermost = ((comprehension_ty)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001628 asdl_seq_GET(generators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001629 /* Outermost iterator is evaluated in current scope */
1630 VISIT(st, expr, outermost->iter);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001631 /* Create comprehension scope for the rest */
1632 if (!scope_name ||
Benjamin Petersondb149ac2009-11-20 01:21:35 +00001633 !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e, e->lineno)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001634 return 0;
1635 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001636 st->st_cur->ste_generator = is_generator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637 /* Outermost iter is received as an argument */
1638 if (!symtable_implicit_arg(st, 0)) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001639 symtable_exit_block(st, (void *)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001640 return 0;
1641 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001642 /* Allocate temporary name if needed */
1643 if (needs_tmp && !symtable_new_tmpname(st)) {
1644 symtable_exit_block(st, (void *)e);
1645 return 0;
1646 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001647 VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
1648 VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
1649 VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001650 generators, 1, (void*)e);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001651 if (value)
1652 VISIT_IN_BLOCK(st, expr, value, (void*)e);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001653 VISIT_IN_BLOCK(st, expr, elt, (void*)e);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001654 return symtable_exit_block(st, (void *)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655}
Nick Coghlan650f0d02007-04-15 12:05:43 +00001656
1657static int
1658symtable_visit_genexp(struct symtable *st, expr_ty e)
1659{
1660 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
1661 e->v.GeneratorExp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00001662 e->v.GeneratorExp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001663}
1664
1665static int
1666symtable_visit_listcomp(struct symtable *st, expr_ty e)
1667{
1668 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(listcomp),
1669 e->v.ListComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00001670 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001671}
1672
1673static int
1674symtable_visit_setcomp(struct symtable *st, expr_ty e)
1675{
1676 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
1677 e->v.SetComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00001678 e->v.SetComp.elt, NULL);
1679}
1680
1681static int
1682symtable_visit_dictcomp(struct symtable *st, expr_ty e)
1683{
1684 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp),
1685 e->v.DictComp.generators,
1686 e->v.DictComp.key,
1687 e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001688}