blob: 915324df1e90bc3a6f75d49d82b1ec3fe5ad6c39 [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
16
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000017PySTEntryObject *
Neal Norwitz62c2fac2005-10-24 00:30:44 +000018PySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000019 void *key, int lineno)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000020{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000021 PySTEntryObject *ste = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000022 PyObject *k;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000023
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024 k = PyLong_FromVoidPtr(key);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000025 if (k == NULL)
26 goto fail;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000027 ste = (PySTEntryObject *)PyObject_New(PySTEntryObject,
28 &PySTEntry_Type);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000029 ste->ste_table = st;
30 ste->ste_id = k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000031 ste->ste_tmpname = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000032
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033 ste->ste_name = name;
34 Py_INCREF(name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000035
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000036 ste->ste_symbols = NULL;
37 ste->ste_varnames = NULL;
38 ste->ste_children = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000039
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000040 ste->ste_symbols = PyDict_New();
41 if (ste->ste_symbols == NULL)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000042 goto fail;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000043
44 ste->ste_varnames = PyList_New(0);
45 if (ste->ste_varnames == NULL)
46 goto fail;
47
48 ste->ste_children = PyList_New(0);
49 if (ste->ste_children == NULL)
50 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000051
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000052 ste->ste_type = block;
53 ste->ste_unoptimized = 0;
54 ste->ste_nested = 0;
55 ste->ste_free = 0;
56 ste->ste_varargs = 0;
57 ste->ste_varkeywords = 0;
Jeremy Hylton86424e32001-12-04 02:41:46 +000058 ste->ste_opt_lineno = 0;
Jeremy Hylton4d508ad2003-05-21 17:34:50 +000059 ste->ste_tmpname = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000060 ste->ste_lineno = lineno;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000061
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000062 if (st->st_cur != NULL &&
63 (st->st_cur->ste_nested ||
64 st->st_cur->ste_type == FunctionBlock))
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000065 ste->ste_nested = 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000066 ste->ste_child_free = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +000067 ste->ste_generator = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000068
69 if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0)
70 goto fail;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +000071
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000072 return ste;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000073 fail:
74 Py_XDECREF(ste);
75 return NULL;
76}
77
78static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000079ste_repr(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000080{
81 char buf[256];
82
Barry Warsaw4b4ab202001-11-28 21:36:28 +000083 PyOS_snprintf(buf, sizeof(buf),
84 "<symtable entry %.100s(%ld), line %d>",
85 PyString_AS_STRING(ste->ste_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086 PyInt_AS_LONG(ste->ste_id), ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000087 return PyString_FromString(buf);
88}
89
90static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000091ste_dealloc(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000092{
93 ste->ste_table = NULL;
94 Py_XDECREF(ste->ste_id);
95 Py_XDECREF(ste->ste_name);
96 Py_XDECREF(ste->ste_symbols);
97 Py_XDECREF(ste->ste_varnames);
98 Py_XDECREF(ste->ste_children);
99 PyObject_Del(ste);
100}
101
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000102#define OFF(x) offsetof(PySTEntryObject, x)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000103
Guido van Rossum6f799372001-09-20 20:46:19 +0000104static PyMemberDef ste_memberlist[] = {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000105 {"id", T_OBJECT, OFF(ste_id), READONLY},
106 {"name", T_OBJECT, OFF(ste_name), READONLY},
107 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
108 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
109 {"children", T_OBJECT, OFF(ste_children), READONLY},
110 {"type", T_INT, OFF(ste_type), READONLY},
111 {"lineno", T_INT, OFF(ste_lineno), READONLY},
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000112 {NULL}
113};
114
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115PyTypeObject PySTEntry_Type = {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000116 PyObject_HEAD_INIT(&PyType_Type)
117 0,
118 "symtable entry",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000119 sizeof(PySTEntryObject),
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000120 0,
121 (destructor)ste_dealloc, /* tp_dealloc */
122 0, /* tp_print */
Guido van Rossum6f799372001-09-20 20:46:19 +0000123 0, /* tp_getattr */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000124 0, /* tp_setattr */
125 0, /* tp_compare */
126 (reprfunc)ste_repr, /* tp_repr */
127 0, /* tp_as_number */
128 0, /* tp_as_sequence */
129 0, /* tp_as_mapping */
130 0, /* tp_hash */
131 0, /* tp_call */
132 0, /* tp_str */
Guido van Rossum6f799372001-09-20 20:46:19 +0000133 PyObject_GenericGetAttr, /* tp_getattro */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000134 0, /* tp_setattro */
135 0, /* tp_as_buffer */
136 Py_TPFLAGS_DEFAULT, /* tp_flags */
137 0, /* tp_doc */
Guido van Rossum6f799372001-09-20 20:46:19 +0000138 0, /* tp_traverse */
139 0, /* tp_clear */
140 0, /* tp_richcompare */
141 0, /* tp_weaklistoffset */
142 0, /* tp_iter */
143 0, /* tp_iternext */
144 0, /* tp_methods */
145 ste_memberlist, /* tp_members */
146 0, /* tp_getset */
147 0, /* tp_base */
148 0, /* tp_dict */
149 0, /* tp_descr_get */
150 0, /* tp_descr_set */
151 0, /* tp_dictoffset */
152 0, /* tp_init */
153 0, /* tp_alloc */
154 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000155};
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000156
157static int symtable_analyze(struct symtable *st);
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000158static int symtable_warn(struct symtable *st, char *msg, int lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000159static int symtable_enter_block(struct symtable *st, identifier name,
Neal Norwitz62c2fac2005-10-24 00:30:44 +0000160 _Py_block_ty block, void *ast, int lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000161static int symtable_exit_block(struct symtable *st, void *ast);
162static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
163static int symtable_visit_expr(struct symtable *st, expr_ty s);
164static int symtable_visit_genexp(struct symtable *st, expr_ty s);
165static int symtable_visit_arguments(struct symtable *st, arguments_ty);
166static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
167static int symtable_visit_alias(struct symtable *st, alias_ty);
168static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
169static int symtable_visit_keyword(struct symtable *st, keyword_ty);
170static int symtable_visit_slice(struct symtable *st, slice_ty);
171static int symtable_visit_params(struct symtable *st, asdl_seq *args, int top);
172static int symtable_visit_params_nested(struct symtable *st, asdl_seq *args);
173static int symtable_implicit_arg(struct symtable *st, int pos);
174
175
Nick Coghlan99b25332005-11-16 12:45:24 +0000176static identifier top = NULL, lambda = NULL, genexpr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000177
178#define GET_IDENTIFIER(VAR) \
179 ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
180
181#define DUPLICATE_ARGUMENT \
182"duplicate argument '%s' in function definition"
183
184static struct symtable *
185symtable_new(void)
186{
187 struct symtable *st;
188
189 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
190 if (st == NULL)
191 return NULL;
192
193 st->st_filename = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000194 st->st_symbols = NULL;
195
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196 if ((st->st_stack = PyList_New(0)) == NULL)
197 goto fail;
198 if ((st->st_symbols = PyDict_New()) == NULL)
199 goto fail;
200 st->st_cur = NULL;
201 st->st_tmpname = 0;
202 st->st_private = NULL;
203 return st;
204 fail:
205 PySymtable_Free(st);
206 return NULL;
207}
208
209struct symtable *
210PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
211{
212 struct symtable *st = symtable_new();
213 asdl_seq *seq;
214 int i;
215
216 if (st == NULL)
217 return st;
218 st->st_filename = filename;
219 st->st_future = future;
220 symtable_enter_block(st, GET_IDENTIFIER(top), ModuleBlock,
221 (void *)mod, 0);
222 st->st_top = st->st_cur;
223 st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
224 /* Any other top-level initialization? */
225 switch (mod->kind) {
226 case Module_kind:
227 seq = mod->v.Module.body;
228 for (i = 0; i < asdl_seq_LEN(seq); i++)
229 if (!symtable_visit_stmt(st, asdl_seq_GET(seq, i)))
230 goto error;
231 break;
232 case Expression_kind:
233 if (!symtable_visit_expr(st, mod->v.Expression.body))
234 goto error;
235 break;
236 case Interactive_kind:
237 seq = mod->v.Interactive.body;
238 for (i = 0; i < asdl_seq_LEN(seq); i++)
239 if (!symtable_visit_stmt(st, asdl_seq_GET(seq, i)))
240 goto error;
241 break;
242 case Suite_kind:
243 PyErr_SetString(PyExc_RuntimeError,
244 "this compiler does not handle Suites");
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000245 goto error;
246 }
247 if (!symtable_exit_block(st, (void *)mod)) {
248 PySymtable_Free(st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 return NULL;
250 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251 if (symtable_analyze(st))
252 return st;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000253 PySymtable_Free(st);
254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000255 error:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000256 (void) symtable_exit_block(st, (void *)mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000257 PySymtable_Free(st);
258 return NULL;
259}
260
261void
262PySymtable_Free(struct symtable *st)
263{
264 Py_XDECREF(st->st_symbols);
265 Py_XDECREF(st->st_stack);
266 PyMem_Free((void *)st);
267}
268
269PySTEntryObject *
270PySymtable_Lookup(struct symtable *st, void *key)
271{
272 PyObject *k, *v;
273
274 k = PyLong_FromVoidPtr(key);
275 if (k == NULL)
276 return NULL;
277 v = PyDict_GetItem(st->st_symbols, k);
278 if (v) {
279 assert(PySTEntry_Check(v));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 Py_INCREF(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000281 }
282 else {
283 PyErr_SetString(PyExc_KeyError,
284 "unknown symbol table entry");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000285 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000286
287 Py_DECREF(k);
288 return (PySTEntryObject *)v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289}
290
291int
292PyST_GetScope(PySTEntryObject *ste, PyObject *name)
293{
294 PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
295 if (!v)
296 return 0;
297 assert(PyInt_Check(v));
298 return (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
299}
300
301
302/* Analyze raw symbol information to determine scope of each name.
303
304 The next several functions are helpers for PySymtable_Analyze(),
305 which determines whether a name is local, global, or free. In addition,
306 it determines which local variables are cell variables; they provide
307 bindings that are used for free variables in enclosed blocks.
308
309 There are also two kinds of free variables, implicit and explicit. An
310 explicit global is declared with the global statement. An implicit
311 global is a free variable for which the compiler has found no binding
312 in an enclosing function scope. The implicit global is either a global
313 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
314 to handle these names to implement slightly odd semantics. In such a
315 block, the name is treated as global until it is assigned to; then it
316 is treated as a local.
317
318 The symbol table requires two passes to determine the scope of each name.
319 The first pass collects raw facts from the AST: the name is a parameter
320 here, the name is used by not defined here, etc. The second pass analyzes
321 these facts during a pass over the PySTEntryObjects created during pass 1.
322
323 When a function is entered during the second pass, the parent passes
324 the set of all name bindings visible to its children. These bindings
325 are used to determine if the variable is free or an implicit global.
326 After doing the local analysis, it analyzes each of its child blocks
327 using an updated set of name bindings.
328
329 The children update the free variable set. If a local variable is free
330 in a child, the variable is marked as a cell. The current function must
331 provide runtime storage for the variable that may outlive the function's
332 frame. Cell variables are removed from the free set before the analyze
333 function returns to its parent.
334
335 The sets of bound and free variables are implemented as dictionaries
336 mapping strings to None.
337*/
338
339#define SET_SCOPE(DICT, NAME, I) { \
340 PyObject *o = PyInt_FromLong(I); \
341 if (!o) \
342 return 0; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000343 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
344 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345 return 0; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000346 } \
347 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000348}
349
350/* Decide on scope of name, given flags.
351
352 The dicts passed in as arguments are modified as necessary.
353 ste is passed so that flags can be updated.
354*/
355
356static int
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000357analyze_name(PySTEntryObject *ste, PyObject *dict, PyObject *name, long flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000358 PyObject *bound, PyObject *local, PyObject *free,
359 PyObject *global)
360{
361 if (flags & DEF_GLOBAL) {
362 if (flags & DEF_PARAM) {
363 PyErr_Format(PyExc_SyntaxError,
364 "name '%s' is local and global",
365 PyString_AS_STRING(name));
366 return 0;
367 }
368 SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
369 if (PyDict_SetItem(global, name, Py_None) < 0)
370 return 0;
371 if (bound && PyDict_GetItem(bound, name)) {
372 if (PyDict_DelItem(bound, name) < 0)
373 return 0;
374 }
375 return 1;
376 }
377 if (flags & DEF_BOUND) {
378 SET_SCOPE(dict, name, LOCAL);
379 if (PyDict_SetItem(local, name, Py_None) < 0)
380 return 0;
381 if (PyDict_GetItem(global, name)) {
382 if (PyDict_DelItem(global, name) < 0)
383 return 0;
384 }
385 return 1;
386 }
387 /* If an enclosing block has a binding for this name, it
388 is a free variable rather than a global variable.
389 Note that having a non-NULL bound implies that the block
390 is nested.
391 */
392 if (bound && PyDict_GetItem(bound, name)) {
393 SET_SCOPE(dict, name, FREE);
394 ste->ste_free = 1;
395 if (PyDict_SetItem(free, name, Py_None) < 0)
396 return 0;
397 return 1;
398 }
399 /* If a parent has a global statement, then call it global
400 explicit? It could also be global implicit.
401 */
402 else if (global && PyDict_GetItem(global, name)) {
403 SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
404 return 1;
405 }
406 else {
407 if (ste->ste_nested)
408 ste->ste_free = 1;
409 SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
410 return 1;
411 }
412 return 0; /* Can't get here */
413}
414
415#undef SET_SCOPE
416
417/* If a name is defined in free and also in locals, then this block
418 provides the binding for the free variable. The name should be
419 marked CELL in this block and removed from the free list.
420
421 Note that the current block's free variables are included in free.
422 That's safe because no name can be free and local in the same scope.
423*/
424
425static int
426analyze_cells(PyObject *scope, PyObject *free)
427{
428 PyObject *name, *v, *w;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000429 int pos = 0, success = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000430
431 w = PyInt_FromLong(CELL);
432 if (!w)
433 return 0;
434 while (PyDict_Next(scope, &pos, &name, &v)) {
435 assert(PyInt_Check(v));
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000436 long flags = PyInt_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000437 if (flags != LOCAL)
438 continue;
439 if (!PyDict_GetItem(free, name))
440 continue;
441 /* Replace LOCAL with CELL for this name, and remove
442 from free. It is safe to replace the value of name
443 in the dict, because it will not cause a resize.
444 */
445 if (PyDict_SetItem(scope, name, w) < 0)
446 goto error;
447 if (!PyDict_DelItem(free, name) < 0)
448 goto error;
449 }
450 success = 1;
451 error:
452 Py_DECREF(w);
453 return success;
454}
455
456/* Check for illegal statements in unoptimized namespaces */
457static int
458check_unoptimized(const PySTEntryObject* ste) {
459 char buf[300];
Armin Rigo31441302005-10-21 12:57:31 +0000460 const char* trailer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000461
Neil Schemenauer2dfcef52005-10-23 18:50:36 +0000462 if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 || !(ste->ste_free || ste->ste_child_free))
464 return 1;
465
Armin Rigo31441302005-10-21 12:57:31 +0000466 trailer = (ste->ste_child_free ?
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467 "contains a nested function with free variables" :
468 "is a nested function");
469
470 switch (ste->ste_unoptimized) {
471 case OPT_TOPLEVEL: /* exec / import * at top-level is fine */
472 case OPT_EXEC: /* qualified exec is fine */
473 return 1;
474 case OPT_IMPORT_STAR:
475 PyOS_snprintf(buf, sizeof(buf),
476 "import * is not allowed in function '%.100s' "
477 "because it is %s",
478 PyString_AS_STRING(ste->ste_name), trailer);
479 break;
480 case OPT_BARE_EXEC:
481 PyOS_snprintf(buf, sizeof(buf),
482 "unqualified exec is not allowed in function "
483 "'%.100s' it %s",
484 PyString_AS_STRING(ste->ste_name), trailer);
485 break;
486 default:
487 PyOS_snprintf(buf, sizeof(buf),
488 "function '%.100s' uses import * and bare exec, "
489 "which are illegal because it %s",
490 PyString_AS_STRING(ste->ste_name), trailer);
491 break;
492 }
493
494 PyErr_SetString(PyExc_SyntaxError, buf);
495 PyErr_SyntaxLocation(ste->ste_table->st_filename,
496 ste->ste_opt_lineno);
497 return 0;
498}
499
500/* Enter the final scope information into the st_symbols dict.
501 *
502 * All arguments are dicts. Modifies symbols, others are read-only.
503*/
504static int
505update_symbols(PyObject *symbols, PyObject *scope,
506 PyObject *bound, PyObject *free, int class)
507{
508 PyObject *name, *v, *u, *w, *free_value = NULL;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000509 int pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000510
511 while (PyDict_Next(symbols, &pos, &name, &v)) {
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000512 long i, flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 assert(PyInt_Check(v));
514 flags = PyInt_AS_LONG(v);
515 w = PyDict_GetItem(scope, name);
516 assert(w && PyInt_Check(w));
517 i = PyInt_AS_LONG(w);
518 flags |= (i << SCOPE_OFF);
519 u = PyInt_FromLong(flags);
520 if (PyDict_SetItem(symbols, name, u) < 0) {
521 Py_DECREF(u);
522 return 0;
523 }
524 Py_DECREF(u);
525 }
526
527 free_value = PyInt_FromLong(FREE << SCOPE_OFF);
528 if (!free_value)
529 return 0;
530
531 /* add a free variable when it's only use is for creating a closure */
532 pos = 0;
533 while (PyDict_Next(free, &pos, &name, &v)) {
534 PyObject *o = PyDict_GetItem(symbols, name);
535
536 if (o) {
537 /* It could be a free variable in a method of
538 the class that has the same name as a local
539 or global in the class scope.
540 */
541 if (class &&
542 PyInt_AS_LONG(o) & (DEF_BOUND | DEF_GLOBAL)) {
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000543 long i = PyInt_AS_LONG(o) | DEF_FREE_CLASS;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 o = PyInt_FromLong(i);
545 if (!o) {
546 Py_DECREF(free_value);
547 return 0;
548 }
549 if (PyDict_SetItem(symbols, name, o) < 0) {
550 Py_DECREF(o);
551 Py_DECREF(free_value);
552 return 0;
553 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000554 Py_DECREF(o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 }
556 /* else it's not free, probably a cell */
557 continue;
558 }
559 if (!PyDict_GetItem(bound, name))
560 continue; /* it's a global */
561
562 if (PyDict_SetItem(symbols, name, free_value) < 0) {
563 Py_DECREF(free_value);
564 return 0;
565 }
566 }
567 Py_DECREF(free_value);
568 return 1;
569}
570
571/* Make final symbol table decisions for block of ste.
572 Arguments:
573 ste -- current symtable entry (input/output)
574 bound -- set of variables bound in enclosing scopes (input)
575 free -- set of free variables in enclosed scopes (output)
576 globals -- set of declared global variables in enclosing scopes (input)
577*/
578
579static int
580analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
581 PyObject *global)
582{
583 PyObject *name, *v, *local = NULL, *scope = NULL, *newbound = NULL;
584 PyObject *newglobal = NULL, *newfree = NULL;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000585 int i, pos = 0, success = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586
587 local = PyDict_New();
588 if (!local)
589 goto error;
590 scope = PyDict_New();
591 if (!scope)
592 goto error;
593 newglobal = PyDict_New();
594 if (!newglobal)
595 goto error;
596 newfree = PyDict_New();
597 if (!newfree)
598 goto error;
599 newbound = PyDict_New();
600 if (!newbound)
601 goto error;
602
603 if (ste->ste_type == ClassBlock) {
604 /* make a copy of globals before calling analyze_name(),
605 because global statements in the class have no effect
606 on nested functions.
607 */
608 if (PyDict_Update(newglobal, global) < 0)
609 goto error;
610 if (bound)
611 if (PyDict_Update(newbound, bound) < 0)
612 goto error;
613 }
614
615 assert(PySTEntry_Check(ste));
616 assert(PyDict_Check(ste->ste_symbols));
617 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000618 long flags = PyInt_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000619 if (!analyze_name(ste, scope, name, flags, bound, local, free,
620 global))
621 goto error;
622 }
623
624 if (ste->ste_type != ClassBlock) {
625 if (ste->ste_type == FunctionBlock) {
626 if (PyDict_Update(newbound, local) < 0)
627 goto error;
628 }
629 if (bound) {
630 if (PyDict_Update(newbound, bound) < 0)
631 goto error;
632 }
633 if (PyDict_Update(newglobal, global) < 0)
634 goto error;
635 }
636
637 /* Recursively call analyze_block() on each child block */
638 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
639 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
Armin Rigo31441302005-10-21 12:57:31 +0000640 PySTEntryObject* entry;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000641 assert(c && PySTEntry_Check(c));
Armin Rigo31441302005-10-21 12:57:31 +0000642 entry = (PySTEntryObject*)c;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000643 if (!analyze_block(entry, newbound, newfree, newglobal))
644 goto error;
645 if (entry->ste_free || entry->ste_child_free)
646 ste->ste_child_free = 1;
647 }
648
649 if (ste->ste_type == FunctionBlock && !analyze_cells(scope, newfree))
650 goto error;
651 if (!update_symbols(ste->ste_symbols, scope, bound, newfree,
652 ste->ste_type == ClassBlock))
653 goto error;
654 if (!check_unoptimized(ste))
655 goto error;
656
657 if (PyDict_Update(free, newfree) < 0)
658 goto error;
659 success = 1;
660 error:
661 Py_XDECREF(local);
662 Py_XDECREF(scope);
663 Py_XDECREF(newbound);
664 Py_XDECREF(newglobal);
665 Py_XDECREF(newfree);
666 if (!success)
667 assert(PyErr_Occurred());
668 return success;
669}
670
671static int
672symtable_analyze(struct symtable *st)
673{
674 PyObject *free, *global;
675 int r;
676
677 free = PyDict_New();
678 if (!free)
679 return 0;
680 global = PyDict_New();
681 if (!global) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000682 Py_DECREF(free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683 return 0;
684 }
685 r = analyze_block(st->st_top, NULL, free, global);
686 Py_DECREF(free);
687 Py_DECREF(global);
688 return r;
689}
690
691
692static int
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000693symtable_warn(struct symtable *st, char *msg, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694{
695 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000696 lineno, NULL, NULL) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000697 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
698 PyErr_SetString(PyExc_SyntaxError, msg);
699 PyErr_SyntaxLocation(st->st_filename,
700 st->st_cur->ste_lineno);
701 }
702 return 0;
703 }
704 return 1;
705}
706
707/* symtable_enter_block() gets a reference via PySTEntry_New().
708 This reference is released when the block is exited, via the DECREF
709 in symtable_exit_block().
710*/
711
712static int
713symtable_exit_block(struct symtable *st, void *ast)
714{
715 int end;
716
717 Py_DECREF(st->st_cur);
718 end = PyList_GET_SIZE(st->st_stack) - 1;
719 if (end >= 0) {
720 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
721 end);
722 Py_INCREF(st->st_cur);
723 if (PySequence_DelItem(st->st_stack, end) < 0)
724 return 0;
725 }
726 return 1;
727}
728
729static int
Neal Norwitz62c2fac2005-10-24 00:30:44 +0000730symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731 void *ast, int lineno)
732{
733 PySTEntryObject *prev = NULL;
734
735 if (st->st_cur) {
736 prev = st->st_cur;
737 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738 return 0;
739 }
740 Py_DECREF(st->st_cur);
741 }
742 st->st_cur = PySTEntry_New(st, name, block, ast, lineno);
743 if (name == GET_IDENTIFIER(top))
744 st->st_global = st->st_cur->ste_symbols;
745 if (prev) {
746 if (PyList_Append(prev->ste_children,
747 (PyObject *)st->st_cur) < 0) {
748 return 0;
749 }
750 }
751 return 1;
752}
753
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000754static long
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755symtable_lookup(struct symtable *st, PyObject *name)
756{
757 PyObject *o;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000758 PyObject *mangled = _Py_Mangle(st->st_private, name);
759 if (!mangled)
760 return 0;
761 o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
762 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000763 if (!o)
764 return 0;
765 return PyInt_AsLong(o);
766}
767
768static int
769symtable_add_def(struct symtable *st, PyObject *name, int flag)
770{
771 PyObject *o;
772 PyObject *dict;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000773 long val;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000774 PyObject *mangled = _Py_Mangle(st->st_private, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000776 if (!mangled)
777 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 dict = st->st_cur->ste_symbols;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000779 if ((o = PyDict_GetItem(dict, mangled))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 val = PyInt_AS_LONG(o);
781 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000782 /* Is it better to use 'mangled' or 'name' here? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
784 PyString_AsString(name));
785 PyErr_SyntaxLocation(st->st_filename,
786 st->st_cur->ste_lineno);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000787 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788 }
789 val |= flag;
790 } else
791 val = flag;
792 o = PyInt_FromLong(val);
793 if (o == NULL)
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000794 goto error;
795 if (PyDict_SetItem(dict, mangled, o) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796 Py_DECREF(o);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000797 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798 }
799 Py_DECREF(o);
800
801 if (flag & DEF_PARAM) {
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000802 if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
803 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 } else if (flag & DEF_GLOBAL) {
805 /* XXX need to update DEF_GLOBAL for other flags too;
806 perhaps only DEF_FREE_GLOBAL */
807 val = flag;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000808 if ((o = PyDict_GetItem(st->st_global, mangled))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 val |= PyInt_AS_LONG(o);
810 }
811 o = PyInt_FromLong(val);
812 if (o == NULL)
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000813 goto error;
814 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815 Py_DECREF(o);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000816 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000817 }
818 Py_DECREF(o);
819 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000820 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821 return 1;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000822
823error:
824 Py_DECREF(mangled);
825 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000826}
827
828/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
829 They use the ASDL name to synthesize the name of the C type and the visit
830 function.
831
832 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
833 useful if the first node in the sequence requires special treatment.
834*/
835
836#define VISIT(ST, TYPE, V) \
837 if (!symtable_visit_ ## TYPE((ST), (V))) \
838 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000839
840#define VISIT_IN_BLOCK(ST, TYPE, V, S) \
841 if (!symtable_visit_ ## TYPE((ST), (V))) { \
842 symtable_exit_block((ST), (S)); \
843 return 0; \
844 }
845
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846#define VISIT_SEQ(ST, TYPE, SEQ) { \
847 int i; \
848 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
849 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
850 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
851 if (!symtable_visit_ ## TYPE((ST), elt)) \
852 return 0; \
853 } \
854}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000855
856#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
857 int i; \
858 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
859 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
860 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
861 if (!symtable_visit_ ## TYPE((ST), elt)) { \
862 symtable_exit_block((ST), (S)); \
863 return 0; \
864 } \
865 } \
866}
867
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
869 int i; \
870 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
871 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
872 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
873 if (!symtable_visit_ ## TYPE((ST), elt)) \
874 return 0; \
875 } \
876}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000877
878#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
879 int i; \
880 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
881 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
882 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
883 if (!symtable_visit_ ## TYPE((ST), elt)) { \
884 symtable_exit_block((ST), (S)); \
885 return 0; \
886 } \
887 } \
888}
889
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890static int
891symtable_visit_stmt(struct symtable *st, stmt_ty s)
892{
893 switch (s->kind) {
894 case FunctionDef_kind:
895 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
896 return 0;
897 if (s->v.FunctionDef.args->defaults)
898 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
899 if (s->v.FunctionDef.decorators)
900 VISIT_SEQ(st, expr, s->v.FunctionDef.decorators);
901 if (!symtable_enter_block(st, s->v.FunctionDef.name,
902 FunctionBlock, (void *)s, s->lineno))
903 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000904 VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
905 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 if (!symtable_exit_block(st, s))
907 return 0;
908 break;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000909 case ClassDef_kind: {
910 PyObject *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000911 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
912 return 0;
913 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
914 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
915 (void *)s, s->lineno))
916 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000917 tmp = st->st_private;
918 st->st_private = s->v.ClassDef.name;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000919 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000920 st->st_private = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 if (!symtable_exit_block(st, s))
922 return 0;
923 break;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000924 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925 case Return_kind:
926 if (s->v.Return.value)
927 VISIT(st, expr, s->v.Return.value);
928 break;
929 case Delete_kind:
930 VISIT_SEQ(st, expr, s->v.Delete.targets);
931 break;
932 case Assign_kind:
933 VISIT_SEQ(st, expr, s->v.Assign.targets);
934 VISIT(st, expr, s->v.Assign.value);
935 break;
936 case AugAssign_kind:
937 VISIT(st, expr, s->v.AugAssign.target);
938 VISIT(st, expr, s->v.AugAssign.value);
939 break;
940 case Print_kind:
941 if (s->v.Print.dest)
942 VISIT(st, expr, s->v.Print.dest);
943 VISIT_SEQ(st, expr, s->v.Print.values);
944 break;
945 case For_kind:
946 VISIT(st, expr, s->v.For.target);
947 VISIT(st, expr, s->v.For.iter);
948 VISIT_SEQ(st, stmt, s->v.For.body);
949 if (s->v.For.orelse)
950 VISIT_SEQ(st, stmt, s->v.For.orelse);
951 break;
952 case While_kind:
953 VISIT(st, expr, s->v.While.test);
954 VISIT_SEQ(st, stmt, s->v.While.body);
955 if (s->v.While.orelse)
956 VISIT_SEQ(st, stmt, s->v.While.orelse);
957 break;
958 case If_kind:
959 /* XXX if 0: and lookup_yield() hacks */
960 VISIT(st, expr, s->v.If.test);
961 VISIT_SEQ(st, stmt, s->v.If.body);
962 if (s->v.If.orelse)
963 VISIT_SEQ(st, stmt, s->v.If.orelse);
964 break;
965 case Raise_kind:
966 if (s->v.Raise.type) {
967 VISIT(st, expr, s->v.Raise.type);
968 if (s->v.Raise.inst) {
969 VISIT(st, expr, s->v.Raise.inst);
970 if (s->v.Raise.tback)
971 VISIT(st, expr, s->v.Raise.tback);
972 }
973 }
974 break;
975 case TryExcept_kind:
976 VISIT_SEQ(st, stmt, s->v.TryExcept.body);
977 VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
978 VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
979 break;
980 case TryFinally_kind:
981 VISIT_SEQ(st, stmt, s->v.TryFinally.body);
982 VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
983 break;
984 case Assert_kind:
985 VISIT(st, expr, s->v.Assert.test);
986 if (s->v.Assert.msg)
987 VISIT(st, expr, s->v.Assert.msg);
988 break;
989 case Import_kind:
990 VISIT_SEQ(st, alias, s->v.Import.names);
991 /* XXX Don't have the lineno available inside
992 visit_alias */
993 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
994 st->st_cur->ste_opt_lineno = s->lineno;
995 break;
996 case ImportFrom_kind:
997 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
998 /* XXX Don't have the lineno available inside
999 visit_alias */
1000 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1001 st->st_cur->ste_opt_lineno = s->lineno;
1002 break;
1003 case Exec_kind:
1004 VISIT(st, expr, s->v.Exec.body);
1005 if (!st->st_cur->ste_opt_lineno)
1006 st->st_cur->ste_opt_lineno = s->lineno;
1007 if (s->v.Exec.globals) {
1008 st->st_cur->ste_unoptimized |= OPT_EXEC;
1009 VISIT(st, expr, s->v.Exec.globals);
1010 if (s->v.Exec.locals)
1011 VISIT(st, expr, s->v.Exec.locals);
1012 } else {
1013 st->st_cur->ste_unoptimized |= OPT_BARE_EXEC;
1014 }
1015 break;
1016 case Global_kind: {
1017 int i;
1018 asdl_seq *seq = s->v.Global.names;
1019 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1020 identifier name = asdl_seq_GET(seq, i);
1021 char *c_name = PyString_AS_STRING(name);
Neal Norwitz46b7bda2006-01-08 01:06:06 +00001022 long cur = symtable_lookup(st, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001023 if (cur < 0)
1024 return 0;
1025 if (cur & (DEF_LOCAL | USE)) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001026 char buf[256];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027 if (cur & DEF_LOCAL)
1028 PyOS_snprintf(buf, sizeof(buf),
1029 GLOBAL_AFTER_ASSIGN,
1030 c_name);
1031 else
1032 PyOS_snprintf(buf, sizeof(buf),
1033 GLOBAL_AFTER_USE,
1034 c_name);
Neal Norwitz5d0ad502005-12-19 04:27:42 +00001035 if (!symtable_warn(st, buf, s->lineno))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 return 0;
1037 }
1038 if (!symtable_add_def(st, name, DEF_GLOBAL))
1039 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 break;
1042 }
1043 case Expr_kind:
1044 VISIT(st, expr, s->v.Expr.value);
1045 break;
1046 case Pass_kind:
1047 case Break_kind:
1048 case Continue_kind:
1049 /* nothing to do here */
1050 break;
1051 }
1052 return 1;
1053}
1054
1055static int
1056symtable_visit_expr(struct symtable *st, expr_ty e)
1057{
1058 switch (e->kind) {
1059 case BoolOp_kind:
1060 VISIT_SEQ(st, expr, e->v.BoolOp.values);
1061 break;
1062 case BinOp_kind:
1063 VISIT(st, expr, e->v.BinOp.left);
1064 VISIT(st, expr, e->v.BinOp.right);
1065 break;
1066 case UnaryOp_kind:
1067 VISIT(st, expr, e->v.UnaryOp.operand);
1068 break;
1069 case Lambda_kind: {
1070 if (!symtable_add_def(st, GET_IDENTIFIER(lambda), DEF_LOCAL))
1071 return 0;
1072 if (e->v.Lambda.args->defaults)
1073 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
1074 /* XXX how to get line numbers for expressions */
1075 if (!symtable_enter_block(st, GET_IDENTIFIER(lambda),
1076 FunctionBlock, (void *)e, 0))
1077 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001078 VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
1079 VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080 if (!symtable_exit_block(st, (void *)e))
1081 return 0;
1082 break;
1083 }
1084 case Dict_kind:
1085 VISIT_SEQ(st, expr, e->v.Dict.keys);
1086 VISIT_SEQ(st, expr, e->v.Dict.values);
1087 break;
1088 case ListComp_kind: {
1089 char tmpname[256];
1090 identifier tmp;
1091
1092 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
1093 ++st->st_cur->ste_tmpname);
Neal Norwitz4737b232005-11-19 23:58:29 +00001094 tmp = PyString_InternFromString(tmpname);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095 if (!symtable_add_def(st, tmp, DEF_LOCAL))
1096 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001097 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098 VISIT(st, expr, e->v.ListComp.elt);
1099 VISIT_SEQ(st, comprehension, e->v.ListComp.generators);
1100 break;
1101 }
1102 case GeneratorExp_kind: {
1103 if (!symtable_visit_genexp(st, e)) {
1104 return 0;
1105 }
1106 break;
1107 }
1108 case Yield_kind:
1109 if (e->v.Yield.value)
1110 VISIT(st, expr, e->v.Yield.value);
1111 st->st_cur->ste_generator = 1;
1112 break;
1113 case Compare_kind:
1114 VISIT(st, expr, e->v.Compare.left);
1115 VISIT_SEQ(st, expr, e->v.Compare.comparators);
1116 break;
1117 case Call_kind:
1118 VISIT(st, expr, e->v.Call.func);
1119 VISIT_SEQ(st, expr, e->v.Call.args);
1120 VISIT_SEQ(st, keyword, e->v.Call.keywords);
1121 if (e->v.Call.starargs)
1122 VISIT(st, expr, e->v.Call.starargs);
1123 if (e->v.Call.kwargs)
1124 VISIT(st, expr, e->v.Call.kwargs);
1125 break;
1126 case Repr_kind:
1127 VISIT(st, expr, e->v.Repr.value);
1128 break;
1129 case Num_kind:
1130 case Str_kind:
1131 /* Nothing to do here. */
1132 break;
1133 /* The following exprs can be assignment targets. */
1134 case Attribute_kind:
1135 VISIT(st, expr, e->v.Attribute.value);
1136 break;
1137 case Subscript_kind:
1138 VISIT(st, expr, e->v.Subscript.value);
1139 VISIT(st, slice, e->v.Subscript.slice);
1140 break;
1141 case Name_kind:
1142 if (!symtable_add_def(st, e->v.Name.id,
1143 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
1144 return 0;
1145 break;
1146 /* child nodes of List and Tuple will have expr_context set */
1147 case List_kind:
1148 VISIT_SEQ(st, expr, e->v.List.elts);
1149 break;
1150 case Tuple_kind:
1151 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1152 break;
1153 }
1154 return 1;
1155}
1156
1157static int
1158symtable_implicit_arg(struct symtable *st, int pos)
1159{
1160 PyObject *id = PyString_FromFormat(".%d", pos);
1161 if (id == NULL)
1162 return 0;
1163 if (!symtable_add_def(st, id, DEF_PARAM)) {
1164 Py_DECREF(id);
1165 return 0;
1166 }
1167 Py_DECREF(id);
1168 return 1;
1169}
1170
1171static int
1172symtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
1173{
Neal Norwitzdaf595f2006-01-07 21:24:54 +00001174 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175
1176 /* go through all the toplevel arguments first */
1177 for (i = 0; i < asdl_seq_LEN(args); i++) {
1178 expr_ty arg = asdl_seq_GET(args, i);
1179 if (arg->kind == Name_kind) {
1180 assert(arg->v.Name.ctx == Param ||
1181 (arg->v.Name.ctx == Store && !toplevel));
1182 if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
1183 return 0;
1184 }
1185 else if (arg->kind == Tuple_kind) {
1186 assert(arg->v.Tuple.ctx == Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 if (toplevel) {
1188 if (!symtable_implicit_arg(st, i))
1189 return 0;
1190 }
1191 }
1192 else {
Neal Norwitz4737b232005-11-19 23:58:29 +00001193 PyErr_SetString(PyExc_SyntaxError,
1194 "invalid expression in parameter list");
1195 PyErr_SyntaxLocation(st->st_filename,
1196 st->st_cur->ste_lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 return 0;
1198 }
1199 }
1200
1201 if (!toplevel) {
1202 if (!symtable_visit_params_nested(st, args))
1203 return 0;
1204 }
1205
1206 return 1;
1207}
1208
1209static int
1210symtable_visit_params_nested(struct symtable *st, asdl_seq *args)
1211{
1212 int i;
1213 for (i = 0; i < asdl_seq_LEN(args); i++) {
1214 expr_ty arg = asdl_seq_GET(args, i);
1215 if (arg->kind == Tuple_kind &&
1216 !symtable_visit_params(st, arg->v.Tuple.elts, 0))
1217 return 0;
1218 }
1219
1220 return 1;
1221}
1222
1223static int
1224symtable_visit_arguments(struct symtable *st, arguments_ty a)
1225{
1226 /* skip default arguments inside function block
1227 XXX should ast be different?
1228 */
1229 if (a->args && !symtable_visit_params(st, a->args, 1))
1230 return 0;
1231 if (a->vararg) {
1232 if (!symtable_add_def(st, a->vararg, DEF_PARAM))
1233 return 0;
1234 st->st_cur->ste_varargs = 1;
1235 }
1236 if (a->kwarg) {
1237 if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
1238 return 0;
1239 st->st_cur->ste_varkeywords = 1;
1240 }
1241 if (a->args && !symtable_visit_params_nested(st, a->args))
1242 return 0;
1243 return 1;
1244}
1245
1246
1247static int
1248symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1249{
1250 if (eh->type)
1251 VISIT(st, expr, eh->type);
1252 if (eh->name)
1253 VISIT(st, expr, eh->name);
1254 VISIT_SEQ(st, stmt, eh->body);
1255 return 1;
1256}
1257
1258
1259static int
1260symtable_visit_alias(struct symtable *st, alias_ty a)
1261{
1262 /* Compute store_name, the name actually bound by the import
1263 operation. It is diferent than a->name when a->name is a
1264 dotted package name (e.g. spam.eggs)
1265 */
1266 PyObject *store_name;
1267 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
1268 const char *base = PyString_AS_STRING(name);
1269 char *dot = strchr(base, '.');
1270 if (dot)
1271 store_name = PyString_FromStringAndSize(base, dot - base);
1272 else {
1273 store_name = name;
1274 Py_INCREF(store_name);
1275 }
1276 if (strcmp(PyString_AS_STRING(name), "*")) {
1277 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1278 Py_DECREF(store_name);
1279 return r;
1280 }
1281 else {
1282 if (st->st_cur->ste_type != ModuleBlock) {
Neal Norwitz5d0ad502005-12-19 04:27:42 +00001283 int lineno = st->st_cur->ste_lineno;
1284 if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001285 Py_DECREF(store_name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286 return 0;
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001287 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288 }
1289 st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
Neal Norwitz4737b232005-11-19 23:58:29 +00001290 Py_DECREF(store_name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 return 1;
1292 }
1293}
1294
1295
1296static int
1297symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1298{
1299 VISIT(st, expr, lc->target);
1300 VISIT(st, expr, lc->iter);
1301 VISIT_SEQ(st, expr, lc->ifs);
1302 return 1;
1303}
1304
1305
1306static int
1307symtable_visit_keyword(struct symtable *st, keyword_ty k)
1308{
1309 VISIT(st, expr, k->value);
1310 return 1;
1311}
1312
1313
1314static int
1315symtable_visit_slice(struct symtable *st, slice_ty s)
1316{
1317 switch (s->kind) {
1318 case Slice_kind:
1319 if (s->v.Slice.lower)
1320 VISIT(st, expr, s->v.Slice.lower)
1321 if (s->v.Slice.upper)
1322 VISIT(st, expr, s->v.Slice.upper)
1323 if (s->v.Slice.step)
1324 VISIT(st, expr, s->v.Slice.step)
1325 break;
1326 case ExtSlice_kind:
1327 VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
1328 break;
1329 case Index_kind:
1330 VISIT(st, expr, s->v.Index.value)
1331 break;
1332 case Ellipsis_kind:
1333 break;
1334 }
1335 return 1;
1336}
1337
1338static int
1339symtable_visit_genexp(struct symtable *st, expr_ty e)
1340{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001341 comprehension_ty outermost = ((comprehension_ty)
1342 (asdl_seq_GET(e->v.GeneratorExp.generators, 0)));
1343 /* Outermost iterator is evaluated in current scope */
1344 VISIT(st, expr, outermost->iter);
1345 /* Create generator scope for the rest */
Nick Coghlan99b25332005-11-16 12:45:24 +00001346 if (!symtable_enter_block(st, GET_IDENTIFIER(genexpr),
1347 FunctionBlock, (void *)e, 0)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348 return 0;
1349 }
1350 st->st_cur->ste_generator = 1;
1351 /* Outermost iter is received as an argument */
1352 if (!symtable_implicit_arg(st, 0)) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001353 symtable_exit_block(st, (void *)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001354 return 0;
1355 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001356 VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
1357 VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
1358 VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
1359 e->v.GeneratorExp.generators, 1, (void*)e);
1360 VISIT_IN_BLOCK(st, expr, e->v.GeneratorExp.elt, (void*)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361 if (!symtable_exit_block(st, (void *)e))
1362 return 0;
1363 return 1;
1364}