blob: fae9208a66e8f387e6f7565c696f0120b9fd3862 [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 Hylton3e0055f2005-10-20 19:59:25 +000011#define GLOBAL_AFTER_USE \
12"name '%.400s' is used prior to global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000013
Neal Norwitz5d0ad502005-12-19 04:27:42 +000014#define IMPORT_STAR_WARNING "import * only allowed at module level"
15
Georg Brandlddbaa662006-06-04 21:56:52 +000016#define RETURN_VAL_IN_GENERATOR \
17 "'return' with argument inside generator"
Neal Norwitz5d0ad502005-12-19 04:27:42 +000018
Neal Norwitz090b3dd2006-02-28 22:36:46 +000019/* XXX(nnorwitz): change name since static? */
20static PySTEntryObject *
Neal Norwitz62c2fac2005-10-24 00:30:44 +000021PySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022 void *key, int lineno)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000023{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024 PySTEntryObject *ste = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000025 PyObject *k;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000026
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000027 k = PyLong_FromVoidPtr(key);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000028 if (k == NULL)
29 goto fail;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000030 ste = (PySTEntryObject *)PyObject_New(PySTEntryObject,
31 &PySTEntry_Type);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000032 ste->ste_table = st;
33 ste->ste_id = k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000034 ste->ste_tmpname = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000035
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000036 ste->ste_name = name;
37 Py_INCREF(name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000038
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000039 ste->ste_symbols = NULL;
40 ste->ste_varnames = NULL;
41 ste->ste_children = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000042
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000043 ste->ste_symbols = PyDict_New();
44 if (ste->ste_symbols == NULL)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000045 goto fail;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000046
47 ste->ste_varnames = PyList_New(0);
48 if (ste->ste_varnames == NULL)
49 goto fail;
50
51 ste->ste_children = PyList_New(0);
52 if (ste->ste_children == NULL)
53 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000055 ste->ste_type = block;
56 ste->ste_unoptimized = 0;
57 ste->ste_nested = 0;
58 ste->ste_free = 0;
59 ste->ste_varargs = 0;
60 ste->ste_varkeywords = 0;
Jeremy Hylton86424e32001-12-04 02:41:46 +000061 ste->ste_opt_lineno = 0;
Jeremy Hylton4d508ad2003-05-21 17:34:50 +000062 ste->ste_tmpname = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000063 ste->ste_lineno = lineno;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000064
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000065 if (st->st_cur != NULL &&
66 (st->st_cur->ste_nested ||
67 st->st_cur->ste_type == FunctionBlock))
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000068 ste->ste_nested = 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000069 ste->ste_child_free = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +000070 ste->ste_generator = 0;
Georg Brandlddbaa662006-06-04 21:56:52 +000071 ste->ste_returns_value = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000072
73 if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0)
74 goto fail;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +000075
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000076 return ste;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000077 fail:
78 Py_XDECREF(ste);
79 return NULL;
80}
81
82static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000083ste_repr(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000084{
85 char buf[256];
86
Barry Warsaw4b4ab202001-11-28 21:36:28 +000087 PyOS_snprintf(buf, sizeof(buf),
88 "<symtable entry %.100s(%ld), line %d>",
89 PyString_AS_STRING(ste->ste_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000090 PyInt_AS_LONG(ste->ste_id), ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000091 return PyString_FromString(buf);
92}
93
94static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095ste_dealloc(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000096{
97 ste->ste_table = NULL;
98 Py_XDECREF(ste->ste_id);
99 Py_XDECREF(ste->ste_name);
100 Py_XDECREF(ste->ste_symbols);
101 Py_XDECREF(ste->ste_varnames);
102 Py_XDECREF(ste->ste_children);
103 PyObject_Del(ste);
104}
105
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106#define OFF(x) offsetof(PySTEntryObject, x)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000107
Guido van Rossum6f799372001-09-20 20:46:19 +0000108static PyMemberDef ste_memberlist[] = {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000109 {"id", T_OBJECT, OFF(ste_id), READONLY},
110 {"name", T_OBJECT, OFF(ste_name), READONLY},
111 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
112 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
113 {"children", T_OBJECT, OFF(ste_children), READONLY},
114 {"type", T_INT, OFF(ste_type), READONLY},
115 {"lineno", T_INT, OFF(ste_lineno), READONLY},
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000116 {NULL}
117};
118
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000119PyTypeObject PySTEntry_Type = {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000120 PyObject_HEAD_INIT(&PyType_Type)
121 0,
122 "symtable entry",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000123 sizeof(PySTEntryObject),
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000124 0,
125 (destructor)ste_dealloc, /* tp_dealloc */
126 0, /* tp_print */
Guido van Rossum6f799372001-09-20 20:46:19 +0000127 0, /* tp_getattr */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000128 0, /* tp_setattr */
129 0, /* tp_compare */
130 (reprfunc)ste_repr, /* tp_repr */
131 0, /* tp_as_number */
132 0, /* tp_as_sequence */
133 0, /* tp_as_mapping */
134 0, /* tp_hash */
135 0, /* tp_call */
136 0, /* tp_str */
Guido van Rossum6f799372001-09-20 20:46:19 +0000137 PyObject_GenericGetAttr, /* tp_getattro */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000138 0, /* tp_setattro */
139 0, /* tp_as_buffer */
140 Py_TPFLAGS_DEFAULT, /* tp_flags */
141 0, /* tp_doc */
Guido van Rossum6f799372001-09-20 20:46:19 +0000142 0, /* tp_traverse */
143 0, /* tp_clear */
144 0, /* tp_richcompare */
145 0, /* tp_weaklistoffset */
146 0, /* tp_iter */
147 0, /* tp_iternext */
148 0, /* tp_methods */
149 ste_memberlist, /* tp_members */
150 0, /* tp_getset */
151 0, /* tp_base */
152 0, /* tp_dict */
153 0, /* tp_descr_get */
154 0, /* tp_descr_set */
155 0, /* tp_dictoffset */
156 0, /* tp_init */
157 0, /* tp_alloc */
158 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000159};
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000160
161static int symtable_analyze(struct symtable *st);
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000162static int symtable_warn(struct symtable *st, char *msg, int lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000163static int symtable_enter_block(struct symtable *st, identifier name,
Neal Norwitz62c2fac2005-10-24 00:30:44 +0000164 _Py_block_ty block, void *ast, int lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000165static int symtable_exit_block(struct symtable *st, void *ast);
166static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
167static int symtable_visit_expr(struct symtable *st, expr_ty s);
168static int symtable_visit_genexp(struct symtable *st, expr_ty s);
169static int symtable_visit_arguments(struct symtable *st, arguments_ty);
170static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
171static int symtable_visit_alias(struct symtable *st, alias_ty);
172static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
173static int symtable_visit_keyword(struct symtable *st, keyword_ty);
174static int symtable_visit_slice(struct symtable *st, slice_ty);
175static int symtable_visit_params(struct symtable *st, asdl_seq *args, int top);
176static int symtable_visit_params_nested(struct symtable *st, asdl_seq *args);
177static int symtable_implicit_arg(struct symtable *st, int pos);
178
179
Nick Coghlan99b25332005-11-16 12:45:24 +0000180static identifier top = NULL, lambda = NULL, genexpr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181
182#define GET_IDENTIFIER(VAR) \
183 ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
184
185#define DUPLICATE_ARGUMENT \
186"duplicate argument '%s' in function definition"
187
188static struct symtable *
189symtable_new(void)
190{
191 struct symtable *st;
192
193 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
194 if (st == NULL)
195 return NULL;
196
197 st->st_filename = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000198 st->st_symbols = NULL;
199
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200 if ((st->st_stack = PyList_New(0)) == NULL)
201 goto fail;
202 if ((st->st_symbols = PyDict_New()) == NULL)
203 goto fail;
204 st->st_cur = NULL;
205 st->st_tmpname = 0;
206 st->st_private = NULL;
207 return st;
208 fail:
209 PySymtable_Free(st);
210 return NULL;
211}
212
213struct symtable *
214PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
215{
216 struct symtable *st = symtable_new();
217 asdl_seq *seq;
218 int i;
219
220 if (st == NULL)
221 return st;
222 st->st_filename = filename;
223 st->st_future = future;
Neal Norwitzd12bd012006-07-21 07:59:47 +0000224 if (!symtable_enter_block(st, GET_IDENTIFIER(top), ModuleBlock,
225 (void *)mod, 0)) {
226 PySymtable_Free(st);
227 return NULL;
228 }
229
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230 st->st_top = st->st_cur;
231 st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
232 /* Any other top-level initialization? */
233 switch (mod->kind) {
234 case Module_kind:
235 seq = mod->v.Module.body;
236 for (i = 0; i < asdl_seq_LEN(seq); i++)
Anthony Baxter019aec62006-04-12 04:00:50 +0000237 if (!symtable_visit_stmt(st,
238 (stmt_ty)asdl_seq_GET(seq, i)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 goto error;
240 break;
241 case Expression_kind:
242 if (!symtable_visit_expr(st, mod->v.Expression.body))
243 goto error;
244 break;
245 case Interactive_kind:
246 seq = mod->v.Interactive.body;
247 for (i = 0; i < asdl_seq_LEN(seq); i++)
Anthony Baxter019aec62006-04-12 04:00:50 +0000248 if (!symtable_visit_stmt(st,
249 (stmt_ty)asdl_seq_GET(seq, i)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000250 goto error;
251 break;
252 case Suite_kind:
253 PyErr_SetString(PyExc_RuntimeError,
254 "this compiler does not handle Suites");
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000255 goto error;
256 }
257 if (!symtable_exit_block(st, (void *)mod)) {
258 PySymtable_Free(st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259 return NULL;
260 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 if (symtable_analyze(st))
262 return st;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000263 PySymtable_Free(st);
264 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 error:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000266 (void) symtable_exit_block(st, (void *)mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267 PySymtable_Free(st);
268 return NULL;
269}
270
271void
272PySymtable_Free(struct symtable *st)
273{
274 Py_XDECREF(st->st_symbols);
275 Py_XDECREF(st->st_stack);
276 PyMem_Free((void *)st);
277}
278
279PySTEntryObject *
280PySymtable_Lookup(struct symtable *st, void *key)
281{
282 PyObject *k, *v;
283
284 k = PyLong_FromVoidPtr(key);
285 if (k == NULL)
286 return NULL;
287 v = PyDict_GetItem(st->st_symbols, k);
288 if (v) {
289 assert(PySTEntry_Check(v));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000290 Py_INCREF(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 }
292 else {
293 PyErr_SetString(PyExc_KeyError,
294 "unknown symbol table entry");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000296
297 Py_DECREF(k);
298 return (PySTEntryObject *)v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000299}
300
301int
302PyST_GetScope(PySTEntryObject *ste, PyObject *name)
303{
304 PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
305 if (!v)
306 return 0;
307 assert(PyInt_Check(v));
308 return (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
309}
310
311
312/* Analyze raw symbol information to determine scope of each name.
313
314 The next several functions are helpers for PySymtable_Analyze(),
315 which determines whether a name is local, global, or free. In addition,
316 it determines which local variables are cell variables; they provide
317 bindings that are used for free variables in enclosed blocks.
318
319 There are also two kinds of free variables, implicit and explicit. An
320 explicit global is declared with the global statement. An implicit
321 global is a free variable for which the compiler has found no binding
322 in an enclosing function scope. The implicit global is either a global
323 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
324 to handle these names to implement slightly odd semantics. In such a
325 block, the name is treated as global until it is assigned to; then it
326 is treated as a local.
327
328 The symbol table requires two passes to determine the scope of each name.
329 The first pass collects raw facts from the AST: the name is a parameter
330 here, the name is used by not defined here, etc. The second pass analyzes
331 these facts during a pass over the PySTEntryObjects created during pass 1.
332
333 When a function is entered during the second pass, the parent passes
334 the set of all name bindings visible to its children. These bindings
335 are used to determine if the variable is free or an implicit global.
336 After doing the local analysis, it analyzes each of its child blocks
337 using an updated set of name bindings.
338
339 The children update the free variable set. If a local variable is free
340 in a child, the variable is marked as a cell. The current function must
341 provide runtime storage for the variable that may outlive the function's
342 frame. Cell variables are removed from the free set before the analyze
343 function returns to its parent.
344
345 The sets of bound and free variables are implemented as dictionaries
346 mapping strings to None.
347*/
348
349#define SET_SCOPE(DICT, NAME, I) { \
350 PyObject *o = PyInt_FromLong(I); \
351 if (!o) \
352 return 0; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000353 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
354 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000355 return 0; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000356 } \
357 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000358}
359
360/* Decide on scope of name, given flags.
361
362 The dicts passed in as arguments are modified as necessary.
363 ste is passed so that flags can be updated.
364*/
365
366static int
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000367analyze_name(PySTEntryObject *ste, PyObject *dict, PyObject *name, long flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368 PyObject *bound, PyObject *local, PyObject *free,
369 PyObject *global)
370{
371 if (flags & DEF_GLOBAL) {
372 if (flags & DEF_PARAM) {
373 PyErr_Format(PyExc_SyntaxError,
374 "name '%s' is local and global",
375 PyString_AS_STRING(name));
376 return 0;
377 }
378 SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
379 if (PyDict_SetItem(global, name, Py_None) < 0)
380 return 0;
381 if (bound && PyDict_GetItem(bound, name)) {
382 if (PyDict_DelItem(bound, name) < 0)
383 return 0;
384 }
385 return 1;
386 }
387 if (flags & DEF_BOUND) {
388 SET_SCOPE(dict, name, LOCAL);
389 if (PyDict_SetItem(local, name, Py_None) < 0)
390 return 0;
391 if (PyDict_GetItem(global, name)) {
392 if (PyDict_DelItem(global, name) < 0)
393 return 0;
394 }
395 return 1;
396 }
397 /* If an enclosing block has a binding for this name, it
398 is a free variable rather than a global variable.
399 Note that having a non-NULL bound implies that the block
400 is nested.
401 */
402 if (bound && PyDict_GetItem(bound, name)) {
403 SET_SCOPE(dict, name, FREE);
404 ste->ste_free = 1;
405 if (PyDict_SetItem(free, name, Py_None) < 0)
406 return 0;
407 return 1;
408 }
409 /* If a parent has a global statement, then call it global
410 explicit? It could also be global implicit.
411 */
412 else if (global && PyDict_GetItem(global, name)) {
413 SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
414 return 1;
415 }
416 else {
417 if (ste->ste_nested)
418 ste->ste_free = 1;
419 SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
420 return 1;
421 }
422 return 0; /* Can't get here */
423}
424
425#undef SET_SCOPE
426
427/* If a name is defined in free and also in locals, then this block
428 provides the binding for the free variable. The name should be
429 marked CELL in this block and removed from the free list.
430
431 Note that the current block's free variables are included in free.
432 That's safe because no name can be free and local in the same scope.
433*/
434
435static int
436analyze_cells(PyObject *scope, PyObject *free)
437{
438 PyObject *name, *v, *w;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000439 int success = 0;
440 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000441
442 w = PyInt_FromLong(CELL);
443 if (!w)
444 return 0;
445 while (PyDict_Next(scope, &pos, &name, &v)) {
Tim Petersd8fe7ab2006-01-08 02:19:07 +0000446 long flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000447 assert(PyInt_Check(v));
Tim Petersd8fe7ab2006-01-08 02:19:07 +0000448 flags = PyInt_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 if (flags != LOCAL)
450 continue;
451 if (!PyDict_GetItem(free, name))
452 continue;
453 /* Replace LOCAL with CELL for this name, and remove
454 from free. It is safe to replace the value of name
455 in the dict, because it will not cause a resize.
456 */
457 if (PyDict_SetItem(scope, name, w) < 0)
458 goto error;
459 if (!PyDict_DelItem(free, name) < 0)
460 goto error;
461 }
462 success = 1;
463 error:
464 Py_DECREF(w);
465 return success;
466}
467
468/* Check for illegal statements in unoptimized namespaces */
469static int
470check_unoptimized(const PySTEntryObject* ste) {
471 char buf[300];
Armin Rigo31441302005-10-21 12:57:31 +0000472 const char* trailer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000473
Neil Schemenauer2dfcef52005-10-23 18:50:36 +0000474 if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475 || !(ste->ste_free || ste->ste_child_free))
476 return 1;
477
Armin Rigo31441302005-10-21 12:57:31 +0000478 trailer = (ste->ste_child_free ?
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000479 "contains a nested function with free variables" :
480 "is a nested function");
481
482 switch (ste->ste_unoptimized) {
483 case OPT_TOPLEVEL: /* exec / import * at top-level is fine */
484 case OPT_EXEC: /* qualified exec is fine */
485 return 1;
486 case OPT_IMPORT_STAR:
487 PyOS_snprintf(buf, sizeof(buf),
488 "import * is not allowed in function '%.100s' "
489 "because it is %s",
490 PyString_AS_STRING(ste->ste_name), trailer);
491 break;
492 case OPT_BARE_EXEC:
493 PyOS_snprintf(buf, sizeof(buf),
494 "unqualified exec is not allowed in function "
495 "'%.100s' it %s",
496 PyString_AS_STRING(ste->ste_name), trailer);
497 break;
498 default:
499 PyOS_snprintf(buf, sizeof(buf),
500 "function '%.100s' uses import * and bare exec, "
501 "which are illegal because it %s",
502 PyString_AS_STRING(ste->ste_name), trailer);
503 break;
504 }
505
506 PyErr_SetString(PyExc_SyntaxError, buf);
507 PyErr_SyntaxLocation(ste->ste_table->st_filename,
508 ste->ste_opt_lineno);
509 return 0;
510}
511
512/* Enter the final scope information into the st_symbols dict.
513 *
514 * All arguments are dicts. Modifies symbols, others are read-only.
515*/
516static int
517update_symbols(PyObject *symbols, PyObject *scope,
Anthony Baxter019aec62006-04-12 04:00:50 +0000518 PyObject *bound, PyObject *free, int classflag)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519{
520 PyObject *name, *v, *u, *w, *free_value = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000521 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522
523 while (PyDict_Next(symbols, &pos, &name, &v)) {
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000524 long i, flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525 assert(PyInt_Check(v));
526 flags = PyInt_AS_LONG(v);
527 w = PyDict_GetItem(scope, name);
528 assert(w && PyInt_Check(w));
529 i = PyInt_AS_LONG(w);
530 flags |= (i << SCOPE_OFF);
531 u = PyInt_FromLong(flags);
532 if (PyDict_SetItem(symbols, name, u) < 0) {
533 Py_DECREF(u);
534 return 0;
535 }
536 Py_DECREF(u);
537 }
538
539 free_value = PyInt_FromLong(FREE << SCOPE_OFF);
540 if (!free_value)
541 return 0;
542
543 /* add a free variable when it's only use is for creating a closure */
544 pos = 0;
545 while (PyDict_Next(free, &pos, &name, &v)) {
546 PyObject *o = PyDict_GetItem(symbols, name);
547
548 if (o) {
549 /* It could be a free variable in a method of
550 the class that has the same name as a local
551 or global in the class scope.
552 */
Anthony Baxter019aec62006-04-12 04:00:50 +0000553 if (classflag &&
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554 PyInt_AS_LONG(o) & (DEF_BOUND | DEF_GLOBAL)) {
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000555 long i = PyInt_AS_LONG(o) | DEF_FREE_CLASS;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556 o = PyInt_FromLong(i);
557 if (!o) {
558 Py_DECREF(free_value);
559 return 0;
560 }
561 if (PyDict_SetItem(symbols, name, o) < 0) {
562 Py_DECREF(o);
563 Py_DECREF(free_value);
564 return 0;
565 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000566 Py_DECREF(o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 }
568 /* else it's not free, probably a cell */
569 continue;
570 }
571 if (!PyDict_GetItem(bound, name))
572 continue; /* it's a global */
573
574 if (PyDict_SetItem(symbols, name, free_value) < 0) {
575 Py_DECREF(free_value);
576 return 0;
577 }
578 }
579 Py_DECREF(free_value);
580 return 1;
581}
582
583/* Make final symbol table decisions for block of ste.
584 Arguments:
585 ste -- current symtable entry (input/output)
586 bound -- set of variables bound in enclosing scopes (input)
587 free -- set of free variables in enclosed scopes (output)
588 globals -- set of declared global variables in enclosing scopes (input)
589*/
590
591static int
592analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
593 PyObject *global)
594{
595 PyObject *name, *v, *local = NULL, *scope = NULL, *newbound = NULL;
596 PyObject *newglobal = NULL, *newfree = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000597 int i, success = 0;
598 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599
600 local = PyDict_New();
601 if (!local)
602 goto error;
603 scope = PyDict_New();
604 if (!scope)
605 goto error;
606 newglobal = PyDict_New();
607 if (!newglobal)
608 goto error;
609 newfree = PyDict_New();
610 if (!newfree)
611 goto error;
612 newbound = PyDict_New();
613 if (!newbound)
614 goto error;
615
616 if (ste->ste_type == ClassBlock) {
617 /* make a copy of globals before calling analyze_name(),
618 because global statements in the class have no effect
619 on nested functions.
620 */
621 if (PyDict_Update(newglobal, global) < 0)
622 goto error;
623 if (bound)
624 if (PyDict_Update(newbound, bound) < 0)
625 goto error;
626 }
627
628 assert(PySTEntry_Check(ste));
629 assert(PyDict_Check(ste->ste_symbols));
630 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000631 long flags = PyInt_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000632 if (!analyze_name(ste, scope, name, flags, bound, local, free,
633 global))
634 goto error;
635 }
636
637 if (ste->ste_type != ClassBlock) {
638 if (ste->ste_type == FunctionBlock) {
639 if (PyDict_Update(newbound, local) < 0)
640 goto error;
641 }
642 if (bound) {
643 if (PyDict_Update(newbound, bound) < 0)
644 goto error;
645 }
646 if (PyDict_Update(newglobal, global) < 0)
647 goto error;
648 }
649
650 /* Recursively call analyze_block() on each child block */
651 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
652 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
Armin Rigo31441302005-10-21 12:57:31 +0000653 PySTEntryObject* entry;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000654 assert(c && PySTEntry_Check(c));
Armin Rigo31441302005-10-21 12:57:31 +0000655 entry = (PySTEntryObject*)c;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000656 if (!analyze_block(entry, newbound, newfree, newglobal))
657 goto error;
658 if (entry->ste_free || entry->ste_child_free)
659 ste->ste_child_free = 1;
660 }
661
662 if (ste->ste_type == FunctionBlock && !analyze_cells(scope, newfree))
663 goto error;
664 if (!update_symbols(ste->ste_symbols, scope, bound, newfree,
665 ste->ste_type == ClassBlock))
666 goto error;
667 if (!check_unoptimized(ste))
668 goto error;
669
670 if (PyDict_Update(free, newfree) < 0)
671 goto error;
672 success = 1;
673 error:
674 Py_XDECREF(local);
675 Py_XDECREF(scope);
676 Py_XDECREF(newbound);
677 Py_XDECREF(newglobal);
678 Py_XDECREF(newfree);
679 if (!success)
680 assert(PyErr_Occurred());
681 return success;
682}
683
684static int
685symtable_analyze(struct symtable *st)
686{
687 PyObject *free, *global;
688 int r;
689
690 free = PyDict_New();
691 if (!free)
692 return 0;
693 global = PyDict_New();
694 if (!global) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000695 Py_DECREF(free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000696 return 0;
697 }
698 r = analyze_block(st->st_top, NULL, free, global);
699 Py_DECREF(free);
700 Py_DECREF(global);
701 return r;
702}
703
704
705static int
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000706symtable_warn(struct symtable *st, char *msg, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707{
708 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000709 lineno, NULL, NULL) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000710 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
711 PyErr_SetString(PyExc_SyntaxError, msg);
712 PyErr_SyntaxLocation(st->st_filename,
713 st->st_cur->ste_lineno);
714 }
715 return 0;
716 }
717 return 1;
718}
719
720/* symtable_enter_block() gets a reference via PySTEntry_New().
721 This reference is released when the block is exited, via the DECREF
722 in symtable_exit_block().
723*/
724
725static int
726symtable_exit_block(struct symtable *st, void *ast)
727{
Martin v. Löwisd96ee902006-02-16 14:37:16 +0000728 Py_ssize_t end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729
730 Py_DECREF(st->st_cur);
731 end = PyList_GET_SIZE(st->st_stack) - 1;
732 if (end >= 0) {
733 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
734 end);
Neal Norwitzd12bd012006-07-21 07:59:47 +0000735 if (st->st_cur == NULL)
736 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737 Py_INCREF(st->st_cur);
738 if (PySequence_DelItem(st->st_stack, end) < 0)
739 return 0;
740 }
741 return 1;
742}
743
744static int
Neal Norwitz62c2fac2005-10-24 00:30:44 +0000745symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 void *ast, int lineno)
747{
748 PySTEntryObject *prev = NULL;
749
750 if (st->st_cur) {
751 prev = st->st_cur;
752 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 return 0;
754 }
755 Py_DECREF(st->st_cur);
756 }
757 st->st_cur = PySTEntry_New(st, name, block, ast, lineno);
Neal Norwitzd12bd012006-07-21 07:59:47 +0000758 if (st->st_cur == NULL)
759 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760 if (name == GET_IDENTIFIER(top))
761 st->st_global = st->st_cur->ste_symbols;
762 if (prev) {
763 if (PyList_Append(prev->ste_children,
764 (PyObject *)st->st_cur) < 0) {
765 return 0;
766 }
767 }
768 return 1;
769}
770
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000771static long
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772symtable_lookup(struct symtable *st, PyObject *name)
773{
774 PyObject *o;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000775 PyObject *mangled = _Py_Mangle(st->st_private, name);
776 if (!mangled)
777 return 0;
778 o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
779 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 if (!o)
781 return 0;
782 return PyInt_AsLong(o);
783}
784
785static int
786symtable_add_def(struct symtable *st, PyObject *name, int flag)
787{
788 PyObject *o;
789 PyObject *dict;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000790 long val;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000791 PyObject *mangled = _Py_Mangle(st->st_private, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000793 if (!mangled)
794 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 dict = st->st_cur->ste_symbols;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000796 if ((o = PyDict_GetItem(dict, mangled))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000797 val = PyInt_AS_LONG(o);
798 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000799 /* Is it better to use 'mangled' or 'name' here? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
801 PyString_AsString(name));
802 PyErr_SyntaxLocation(st->st_filename,
803 st->st_cur->ste_lineno);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000804 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805 }
806 val |= flag;
807 } else
808 val = flag;
809 o = PyInt_FromLong(val);
810 if (o == NULL)
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000811 goto error;
812 if (PyDict_SetItem(dict, mangled, o) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813 Py_DECREF(o);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000814 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815 }
816 Py_DECREF(o);
817
818 if (flag & DEF_PARAM) {
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000819 if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
820 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821 } else if (flag & DEF_GLOBAL) {
822 /* XXX need to update DEF_GLOBAL for other flags too;
823 perhaps only DEF_FREE_GLOBAL */
824 val = flag;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000825 if ((o = PyDict_GetItem(st->st_global, mangled))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000826 val |= PyInt_AS_LONG(o);
827 }
828 o = PyInt_FromLong(val);
829 if (o == NULL)
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000830 goto error;
831 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832 Py_DECREF(o);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000833 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834 }
835 Py_DECREF(o);
836 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000837 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 return 1;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000839
840error:
841 Py_DECREF(mangled);
842 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843}
844
845/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
846 They use the ASDL name to synthesize the name of the C type and the visit
847 function.
848
849 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
850 useful if the first node in the sequence requires special treatment.
851*/
852
853#define VISIT(ST, TYPE, V) \
854 if (!symtable_visit_ ## TYPE((ST), (V))) \
855 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000856
857#define VISIT_IN_BLOCK(ST, TYPE, V, S) \
858 if (!symtable_visit_ ## TYPE((ST), (V))) { \
859 symtable_exit_block((ST), (S)); \
860 return 0; \
861 }
862
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863#define VISIT_SEQ(ST, TYPE, SEQ) { \
864 int i; \
865 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
866 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Anthony Baxter019aec62006-04-12 04:00:50 +0000867 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868 if (!symtable_visit_ ## TYPE((ST), elt)) \
869 return 0; \
870 } \
871}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000872
873#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
874 int i; \
875 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
876 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Anthony Baxter019aec62006-04-12 04:00:50 +0000877 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000878 if (!symtable_visit_ ## TYPE((ST), elt)) { \
879 symtable_exit_block((ST), (S)); \
880 return 0; \
881 } \
882 } \
883}
884
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
886 int i; \
887 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
888 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
Anthony Baxter019aec62006-04-12 04:00:50 +0000889 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890 if (!symtable_visit_ ## TYPE((ST), elt)) \
891 return 0; \
892 } \
893}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000894
895#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
896 int i; \
897 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
898 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
Anthony Baxter019aec62006-04-12 04:00:50 +0000899 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000900 if (!symtable_visit_ ## TYPE((ST), elt)) { \
901 symtable_exit_block((ST), (S)); \
902 return 0; \
903 } \
904 } \
905}
906
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000907static int
Guido van Rossumc2e20742006-02-27 22:32:47 +0000908symtable_new_tmpname(struct symtable *st)
909{
910 char tmpname[256];
911 identifier tmp;
912
913 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
914 ++st->st_cur->ste_tmpname);
915 tmp = PyString_InternFromString(tmpname);
916 if (!symtable_add_def(st, tmp, DEF_LOCAL))
917 return 0;
918 Py_DECREF(tmp);
919 return 1;
920}
921
922static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923symtable_visit_stmt(struct symtable *st, stmt_ty s)
924{
925 switch (s->kind) {
926 case FunctionDef_kind:
927 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
928 return 0;
929 if (s->v.FunctionDef.args->defaults)
930 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
931 if (s->v.FunctionDef.decorators)
932 VISIT_SEQ(st, expr, s->v.FunctionDef.decorators);
933 if (!symtable_enter_block(st, s->v.FunctionDef.name,
934 FunctionBlock, (void *)s, s->lineno))
935 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000936 VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
937 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938 if (!symtable_exit_block(st, s))
939 return 0;
940 break;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000941 case ClassDef_kind: {
942 PyObject *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
944 return 0;
945 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
946 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
947 (void *)s, s->lineno))
948 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000949 tmp = st->st_private;
950 st->st_private = s->v.ClassDef.name;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000951 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000952 st->st_private = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 if (!symtable_exit_block(st, s))
954 return 0;
955 break;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000956 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 case Return_kind:
Georg Brandlddbaa662006-06-04 21:56:52 +0000958 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959 VISIT(st, expr, s->v.Return.value);
Georg Brandlddbaa662006-06-04 21:56:52 +0000960 st->st_cur->ste_returns_value = 1;
961 if (st->st_cur->ste_generator) {
962 PyErr_SetString(PyExc_SyntaxError,
963 RETURN_VAL_IN_GENERATOR);
964 PyErr_SyntaxLocation(st->st_filename,
965 s->lineno);
966 return 0;
967 }
968 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969 break;
970 case Delete_kind:
971 VISIT_SEQ(st, expr, s->v.Delete.targets);
972 break;
973 case Assign_kind:
974 VISIT_SEQ(st, expr, s->v.Assign.targets);
975 VISIT(st, expr, s->v.Assign.value);
976 break;
977 case AugAssign_kind:
978 VISIT(st, expr, s->v.AugAssign.target);
979 VISIT(st, expr, s->v.AugAssign.value);
980 break;
981 case Print_kind:
982 if (s->v.Print.dest)
983 VISIT(st, expr, s->v.Print.dest);
984 VISIT_SEQ(st, expr, s->v.Print.values);
985 break;
986 case For_kind:
987 VISIT(st, expr, s->v.For.target);
988 VISIT(st, expr, s->v.For.iter);
989 VISIT_SEQ(st, stmt, s->v.For.body);
990 if (s->v.For.orelse)
991 VISIT_SEQ(st, stmt, s->v.For.orelse);
992 break;
993 case While_kind:
994 VISIT(st, expr, s->v.While.test);
995 VISIT_SEQ(st, stmt, s->v.While.body);
996 if (s->v.While.orelse)
997 VISIT_SEQ(st, stmt, s->v.While.orelse);
998 break;
999 case If_kind:
1000 /* XXX if 0: and lookup_yield() hacks */
1001 VISIT(st, expr, s->v.If.test);
1002 VISIT_SEQ(st, stmt, s->v.If.body);
1003 if (s->v.If.orelse)
1004 VISIT_SEQ(st, stmt, s->v.If.orelse);
1005 break;
1006 case Raise_kind:
1007 if (s->v.Raise.type) {
1008 VISIT(st, expr, s->v.Raise.type);
1009 if (s->v.Raise.inst) {
1010 VISIT(st, expr, s->v.Raise.inst);
1011 if (s->v.Raise.tback)
1012 VISIT(st, expr, s->v.Raise.tback);
1013 }
1014 }
1015 break;
1016 case TryExcept_kind:
1017 VISIT_SEQ(st, stmt, s->v.TryExcept.body);
1018 VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
1019 VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
1020 break;
1021 case TryFinally_kind:
1022 VISIT_SEQ(st, stmt, s->v.TryFinally.body);
1023 VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
1024 break;
1025 case Assert_kind:
1026 VISIT(st, expr, s->v.Assert.test);
1027 if (s->v.Assert.msg)
1028 VISIT(st, expr, s->v.Assert.msg);
1029 break;
1030 case Import_kind:
1031 VISIT_SEQ(st, alias, s->v.Import.names);
1032 /* XXX Don't have the lineno available inside
1033 visit_alias */
1034 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1035 st->st_cur->ste_opt_lineno = s->lineno;
1036 break;
1037 case ImportFrom_kind:
1038 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
1039 /* XXX Don't have the lineno available inside
1040 visit_alias */
1041 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1042 st->st_cur->ste_opt_lineno = s->lineno;
1043 break;
1044 case Exec_kind:
1045 VISIT(st, expr, s->v.Exec.body);
1046 if (!st->st_cur->ste_opt_lineno)
1047 st->st_cur->ste_opt_lineno = s->lineno;
1048 if (s->v.Exec.globals) {
1049 st->st_cur->ste_unoptimized |= OPT_EXEC;
1050 VISIT(st, expr, s->v.Exec.globals);
1051 if (s->v.Exec.locals)
1052 VISIT(st, expr, s->v.Exec.locals);
1053 } else {
1054 st->st_cur->ste_unoptimized |= OPT_BARE_EXEC;
1055 }
1056 break;
1057 case Global_kind: {
1058 int i;
1059 asdl_seq *seq = s->v.Global.names;
1060 for (i = 0; i < asdl_seq_LEN(seq); i++) {
Anthony Baxter019aec62006-04-12 04:00:50 +00001061 identifier name = (identifier)asdl_seq_GET(seq, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001062 char *c_name = PyString_AS_STRING(name);
Neal Norwitz46b7bda2006-01-08 01:06:06 +00001063 long cur = symtable_lookup(st, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064 if (cur < 0)
1065 return 0;
1066 if (cur & (DEF_LOCAL | USE)) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001067 char buf[256];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068 if (cur & DEF_LOCAL)
1069 PyOS_snprintf(buf, sizeof(buf),
1070 GLOBAL_AFTER_ASSIGN,
1071 c_name);
1072 else
1073 PyOS_snprintf(buf, sizeof(buf),
1074 GLOBAL_AFTER_USE,
1075 c_name);
Neal Norwitz5d0ad502005-12-19 04:27:42 +00001076 if (!symtable_warn(st, buf, s->lineno))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077 return 0;
1078 }
1079 if (!symtable_add_def(st, name, DEF_GLOBAL))
1080 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 break;
1083 }
1084 case Expr_kind:
1085 VISIT(st, expr, s->v.Expr.value);
1086 break;
1087 case Pass_kind:
1088 case Break_kind:
1089 case Continue_kind:
1090 /* nothing to do here */
1091 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001092 case With_kind:
1093 if (!symtable_new_tmpname(st))
1094 return 0;
1095 VISIT(st, expr, s->v.With.context_expr);
1096 if (s->v.With.optional_vars) {
1097 if (!symtable_new_tmpname(st))
1098 return 0;
1099 VISIT(st, expr, s->v.With.optional_vars);
1100 }
1101 VISIT_SEQ(st, stmt, s->v.With.body);
1102 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 }
1104 return 1;
1105}
1106
1107static int
1108symtable_visit_expr(struct symtable *st, expr_ty e)
1109{
1110 switch (e->kind) {
1111 case BoolOp_kind:
1112 VISIT_SEQ(st, expr, e->v.BoolOp.values);
1113 break;
1114 case BinOp_kind:
1115 VISIT(st, expr, e->v.BinOp.left);
1116 VISIT(st, expr, e->v.BinOp.right);
1117 break;
1118 case UnaryOp_kind:
1119 VISIT(st, expr, e->v.UnaryOp.operand);
1120 break;
1121 case Lambda_kind: {
1122 if (!symtable_add_def(st, GET_IDENTIFIER(lambda), DEF_LOCAL))
1123 return 0;
1124 if (e->v.Lambda.args->defaults)
1125 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
1126 /* XXX how to get line numbers for expressions */
1127 if (!symtable_enter_block(st, GET_IDENTIFIER(lambda),
1128 FunctionBlock, (void *)e, 0))
1129 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001130 VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
1131 VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132 if (!symtable_exit_block(st, (void *)e))
1133 return 0;
1134 break;
1135 }
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001136 case IfExp_kind:
1137 VISIT(st, expr, e->v.IfExp.test);
1138 VISIT(st, expr, e->v.IfExp.body);
1139 VISIT(st, expr, e->v.IfExp.orelse);
1140 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141 case Dict_kind:
1142 VISIT_SEQ(st, expr, e->v.Dict.keys);
1143 VISIT_SEQ(st, expr, e->v.Dict.values);
1144 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001145 case ListComp_kind:
1146 if (!symtable_new_tmpname(st))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 return 0;
1148 VISIT(st, expr, e->v.ListComp.elt);
1149 VISIT_SEQ(st, comprehension, e->v.ListComp.generators);
1150 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001151 case GeneratorExp_kind:
1152 if (!symtable_visit_genexp(st, e))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155 case Yield_kind:
1156 if (e->v.Yield.value)
1157 VISIT(st, expr, e->v.Yield.value);
1158 st->st_cur->ste_generator = 1;
Georg Brandlddbaa662006-06-04 21:56:52 +00001159 if (st->st_cur->ste_returns_value) {
1160 PyErr_SetString(PyExc_SyntaxError,
1161 RETURN_VAL_IN_GENERATOR);
1162 PyErr_SyntaxLocation(st->st_filename,
1163 e->lineno);
1164 return 0;
1165 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 break;
1167 case Compare_kind:
1168 VISIT(st, expr, e->v.Compare.left);
1169 VISIT_SEQ(st, expr, e->v.Compare.comparators);
1170 break;
1171 case Call_kind:
1172 VISIT(st, expr, e->v.Call.func);
1173 VISIT_SEQ(st, expr, e->v.Call.args);
1174 VISIT_SEQ(st, keyword, e->v.Call.keywords);
1175 if (e->v.Call.starargs)
1176 VISIT(st, expr, e->v.Call.starargs);
1177 if (e->v.Call.kwargs)
1178 VISIT(st, expr, e->v.Call.kwargs);
1179 break;
1180 case Repr_kind:
1181 VISIT(st, expr, e->v.Repr.value);
1182 break;
1183 case Num_kind:
1184 case Str_kind:
1185 /* Nothing to do here. */
1186 break;
1187 /* The following exprs can be assignment targets. */
1188 case Attribute_kind:
1189 VISIT(st, expr, e->v.Attribute.value);
1190 break;
1191 case Subscript_kind:
1192 VISIT(st, expr, e->v.Subscript.value);
1193 VISIT(st, slice, e->v.Subscript.slice);
1194 break;
1195 case Name_kind:
1196 if (!symtable_add_def(st, e->v.Name.id,
1197 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
1198 return 0;
1199 break;
1200 /* child nodes of List and Tuple will have expr_context set */
1201 case List_kind:
1202 VISIT_SEQ(st, expr, e->v.List.elts);
1203 break;
1204 case Tuple_kind:
1205 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1206 break;
1207 }
1208 return 1;
1209}
1210
1211static int
1212symtable_implicit_arg(struct symtable *st, int pos)
1213{
1214 PyObject *id = PyString_FromFormat(".%d", pos);
1215 if (id == NULL)
1216 return 0;
1217 if (!symtable_add_def(st, id, DEF_PARAM)) {
1218 Py_DECREF(id);
1219 return 0;
1220 }
1221 Py_DECREF(id);
1222 return 1;
1223}
1224
1225static int
1226symtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
1227{
Neal Norwitzdaf595f2006-01-07 21:24:54 +00001228 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229
1230 /* go through all the toplevel arguments first */
1231 for (i = 0; i < asdl_seq_LEN(args); i++) {
Anthony Baxter019aec62006-04-12 04:00:50 +00001232 expr_ty arg = (expr_ty)asdl_seq_GET(args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 if (arg->kind == Name_kind) {
1234 assert(arg->v.Name.ctx == Param ||
1235 (arg->v.Name.ctx == Store && !toplevel));
1236 if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
1237 return 0;
1238 }
1239 else if (arg->kind == Tuple_kind) {
1240 assert(arg->v.Tuple.ctx == Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241 if (toplevel) {
1242 if (!symtable_implicit_arg(st, i))
1243 return 0;
1244 }
1245 }
1246 else {
Neal Norwitz4737b232005-11-19 23:58:29 +00001247 PyErr_SetString(PyExc_SyntaxError,
1248 "invalid expression in parameter list");
1249 PyErr_SyntaxLocation(st->st_filename,
1250 st->st_cur->ste_lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 return 0;
1252 }
1253 }
1254
1255 if (!toplevel) {
1256 if (!symtable_visit_params_nested(st, args))
1257 return 0;
1258 }
1259
1260 return 1;
1261}
1262
1263static int
1264symtable_visit_params_nested(struct symtable *st, asdl_seq *args)
1265{
1266 int i;
1267 for (i = 0; i < asdl_seq_LEN(args); i++) {
Anthony Baxter019aec62006-04-12 04:00:50 +00001268 expr_ty arg = (expr_ty)asdl_seq_GET(args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 if (arg->kind == Tuple_kind &&
1270 !symtable_visit_params(st, arg->v.Tuple.elts, 0))
1271 return 0;
1272 }
1273
1274 return 1;
1275}
1276
1277static int
1278symtable_visit_arguments(struct symtable *st, arguments_ty a)
1279{
1280 /* skip default arguments inside function block
1281 XXX should ast be different?
1282 */
1283 if (a->args && !symtable_visit_params(st, a->args, 1))
1284 return 0;
1285 if (a->vararg) {
1286 if (!symtable_add_def(st, a->vararg, DEF_PARAM))
1287 return 0;
1288 st->st_cur->ste_varargs = 1;
1289 }
1290 if (a->kwarg) {
1291 if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
1292 return 0;
1293 st->st_cur->ste_varkeywords = 1;
1294 }
1295 if (a->args && !symtable_visit_params_nested(st, a->args))
1296 return 0;
1297 return 1;
1298}
1299
1300
1301static int
1302symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1303{
1304 if (eh->type)
1305 VISIT(st, expr, eh->type);
1306 if (eh->name)
1307 VISIT(st, expr, eh->name);
1308 VISIT_SEQ(st, stmt, eh->body);
1309 return 1;
1310}
1311
1312
1313static int
1314symtable_visit_alias(struct symtable *st, alias_ty a)
1315{
1316 /* Compute store_name, the name actually bound by the import
1317 operation. It is diferent than a->name when a->name is a
1318 dotted package name (e.g. spam.eggs)
1319 */
1320 PyObject *store_name;
1321 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
1322 const char *base = PyString_AS_STRING(name);
1323 char *dot = strchr(base, '.');
1324 if (dot)
1325 store_name = PyString_FromStringAndSize(base, dot - base);
1326 else {
1327 store_name = name;
1328 Py_INCREF(store_name);
1329 }
1330 if (strcmp(PyString_AS_STRING(name), "*")) {
1331 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1332 Py_DECREF(store_name);
1333 return r;
1334 }
1335 else {
1336 if (st->st_cur->ste_type != ModuleBlock) {
Neal Norwitz5d0ad502005-12-19 04:27:42 +00001337 int lineno = st->st_cur->ste_lineno;
1338 if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001339 Py_DECREF(store_name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 return 0;
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001341 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342 }
1343 st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
Neal Norwitz4737b232005-11-19 23:58:29 +00001344 Py_DECREF(store_name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001345 return 1;
1346 }
1347}
1348
1349
1350static int
1351symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1352{
1353 VISIT(st, expr, lc->target);
1354 VISIT(st, expr, lc->iter);
1355 VISIT_SEQ(st, expr, lc->ifs);
1356 return 1;
1357}
1358
1359
1360static int
1361symtable_visit_keyword(struct symtable *st, keyword_ty k)
1362{
1363 VISIT(st, expr, k->value);
1364 return 1;
1365}
1366
1367
1368static int
1369symtable_visit_slice(struct symtable *st, slice_ty s)
1370{
1371 switch (s->kind) {
1372 case Slice_kind:
1373 if (s->v.Slice.lower)
1374 VISIT(st, expr, s->v.Slice.lower)
1375 if (s->v.Slice.upper)
1376 VISIT(st, expr, s->v.Slice.upper)
1377 if (s->v.Slice.step)
1378 VISIT(st, expr, s->v.Slice.step)
1379 break;
1380 case ExtSlice_kind:
1381 VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
1382 break;
1383 case Index_kind:
1384 VISIT(st, expr, s->v.Index.value)
1385 break;
1386 case Ellipsis_kind:
1387 break;
1388 }
1389 return 1;
1390}
1391
1392static int
1393symtable_visit_genexp(struct symtable *st, expr_ty e)
1394{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395 comprehension_ty outermost = ((comprehension_ty)
1396 (asdl_seq_GET(e->v.GeneratorExp.generators, 0)));
1397 /* Outermost iterator is evaluated in current scope */
1398 VISIT(st, expr, outermost->iter);
1399 /* Create generator scope for the rest */
Nick Coghlan99b25332005-11-16 12:45:24 +00001400 if (!symtable_enter_block(st, GET_IDENTIFIER(genexpr),
1401 FunctionBlock, (void *)e, 0)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 return 0;
1403 }
1404 st->st_cur->ste_generator = 1;
1405 /* Outermost iter is received as an argument */
1406 if (!symtable_implicit_arg(st, 0)) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001407 symtable_exit_block(st, (void *)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408 return 0;
1409 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001410 VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
1411 VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
1412 VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
1413 e->v.GeneratorExp.generators, 1, (void*)e);
1414 VISIT_IN_BLOCK(st, expr, e->v.GeneratorExp.elt, (void*)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415 if (!symtable_exit_block(st, (void *)e))
1416 return 0;
1417 return 1;
1418}