blob: 1bb3c89e335883853b9115ecc905296ffa884a0a [file] [log] [blame]
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001#include "Python.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002#include "Python-ast.h"
3#include "code.h"
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004#include "symtable.h"
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005#include "structmember.h"
6
Neal Norwitz5d0ad502005-12-19 04:27:42 +00007/* error strings used for warnings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#define GLOBAL_AFTER_ASSIGN \
9"name '%.400s' is assigned to before global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000010
Jeremy Hylton81e95022007-02-27 06:50:52 +000011#define NONLOCAL_AFTER_ASSIGN \
12"name '%.400s' is assigned to before nonlocal declaration"
13
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#define GLOBAL_AFTER_USE \
15"name '%.400s' is used prior to global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000016
Jeremy Hylton81e95022007-02-27 06:50:52 +000017#define NONLOCAL_AFTER_USE \
18"name '%.400s' is used prior to nonlocal declaration"
19
Neal Norwitz5d0ad502005-12-19 04:27:42 +000020#define IMPORT_STAR_WARNING "import * only allowed at module level"
21
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000022#define RETURN_VAL_IN_GENERATOR \
23 "'return' with argument inside generator"
Neal Norwitz5d0ad502005-12-19 04:27:42 +000024
Neal Norwitz090b3dd2006-02-28 22:36:46 +000025/* XXX(nnorwitz): change name since static? */
26static PySTEntryObject *
Neal Norwitz62c2fac2005-10-24 00:30:44 +000027PySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028 void *key, int lineno)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000029{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000030 PySTEntryObject *ste = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000031 PyObject *k;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000032
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033 k = PyLong_FromVoidPtr(key);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000034 if (k == NULL)
35 goto fail;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000036 ste = (PySTEntryObject *)PyObject_New(PySTEntryObject,
37 &PySTEntry_Type);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000038 ste->ste_table = st;
39 ste->ste_id = k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040 ste->ste_tmpname = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042 ste->ste_name = name;
43 Py_INCREF(name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000044
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000045 ste->ste_symbols = NULL;
46 ste->ste_varnames = NULL;
47 ste->ste_children = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000048
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000049 ste->ste_symbols = PyDict_New();
50 if (ste->ste_symbols == NULL)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000051 goto fail;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +000052
53 ste->ste_varnames = PyList_New(0);
54 if (ste->ste_varnames == NULL)
55 goto fail;
56
57 ste->ste_children = PyList_New(0);
58 if (ste->ste_children == NULL)
59 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000060
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000061 ste->ste_type = block;
62 ste->ste_unoptimized = 0;
63 ste->ste_nested = 0;
64 ste->ste_free = 0;
65 ste->ste_varargs = 0;
66 ste->ste_varkeywords = 0;
Jeremy Hylton86424e32001-12-04 02:41:46 +000067 ste->ste_opt_lineno = 0;
Jeremy Hylton4d508ad2003-05-21 17:34:50 +000068 ste->ste_tmpname = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000069 ste->ste_lineno = lineno;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000070
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000071 if (st->st_cur != NULL &&
72 (st->st_cur->ste_nested ||
73 st->st_cur->ste_type == FunctionBlock))
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000074 ste->ste_nested = 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000075 ste->ste_child_free = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +000076 ste->ste_generator = 0;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000077 ste->ste_returns_value = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000078
Nick Coghlan650f0d02007-04-15 12:05:43 +000079 if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000080 goto fail;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +000081
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082 return ste;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000083 fail:
84 Py_XDECREF(ste);
85 return NULL;
86}
87
88static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000089ste_repr(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000090{
Walter Dörwald5d4ede12007-06-11 16:03:16 +000091 return PyUnicode_FromFormat("<symtable entry %U(%ld), line %d>",
92 ste->ste_name,
93 PyInt_AS_LONG(ste->ste_id), ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000094}
95
96static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097ste_dealloc(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000098{
99 ste->ste_table = NULL;
100 Py_XDECREF(ste->ste_id);
101 Py_XDECREF(ste->ste_name);
102 Py_XDECREF(ste->ste_symbols);
103 Py_XDECREF(ste->ste_varnames);
104 Py_XDECREF(ste->ste_children);
105 PyObject_Del(ste);
106}
107
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108#define OFF(x) offsetof(PySTEntryObject, x)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000109
Guido van Rossum6f799372001-09-20 20:46:19 +0000110static PyMemberDef ste_memberlist[] = {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000111 {"id", T_OBJECT, OFF(ste_id), READONLY},
112 {"name", T_OBJECT, OFF(ste_name), READONLY},
113 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
114 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
115 {"children", T_OBJECT, OFF(ste_children), READONLY},
116 {"type", T_INT, OFF(ste_type), READONLY},
117 {"lineno", T_INT, OFF(ste_lineno), READONLY},
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000118 {NULL}
119};
120
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121PyTypeObject PySTEntry_Type = {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000122 PyObject_HEAD_INIT(&PyType_Type)
123 0,
124 "symtable entry",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000125 sizeof(PySTEntryObject),
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000126 0,
127 (destructor)ste_dealloc, /* tp_dealloc */
128 0, /* tp_print */
Guido van Rossum6f799372001-09-20 20:46:19 +0000129 0, /* tp_getattr */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000130 0, /* tp_setattr */
131 0, /* tp_compare */
132 (reprfunc)ste_repr, /* tp_repr */
133 0, /* tp_as_number */
134 0, /* tp_as_sequence */
135 0, /* tp_as_mapping */
136 0, /* tp_hash */
137 0, /* tp_call */
138 0, /* tp_str */
Guido van Rossum6f799372001-09-20 20:46:19 +0000139 PyObject_GenericGetAttr, /* tp_getattro */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000140 0, /* tp_setattro */
141 0, /* tp_as_buffer */
142 Py_TPFLAGS_DEFAULT, /* tp_flags */
143 0, /* tp_doc */
Guido van Rossum6f799372001-09-20 20:46:19 +0000144 0, /* tp_traverse */
145 0, /* tp_clear */
146 0, /* tp_richcompare */
147 0, /* tp_weaklistoffset */
148 0, /* tp_iter */
149 0, /* tp_iternext */
150 0, /* tp_methods */
151 ste_memberlist, /* tp_members */
152 0, /* tp_getset */
153 0, /* tp_base */
154 0, /* tp_dict */
155 0, /* tp_descr_get */
156 0, /* tp_descr_set */
157 0, /* tp_dictoffset */
158 0, /* tp_init */
159 0, /* tp_alloc */
160 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000161};
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000162
163static int symtable_analyze(struct symtable *st);
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000164static int symtable_warn(struct symtable *st, char *msg, int lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000165static int symtable_enter_block(struct symtable *st, identifier name,
Neal Norwitz62c2fac2005-10-24 00:30:44 +0000166 _Py_block_ty block, void *ast, int lineno);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000167static int symtable_exit_block(struct symtable *st, void *ast);
168static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
169static int symtable_visit_expr(struct symtable *st, expr_ty s);
170static int symtable_visit_genexp(struct symtable *st, expr_ty s);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000171static int symtable_visit_listcomp(struct symtable *st, expr_ty s);
172static int symtable_visit_setcomp(struct symtable *st, expr_ty s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000173static int symtable_visit_arguments(struct symtable *st, arguments_ty);
174static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
175static int symtable_visit_alias(struct symtable *st, alias_ty);
176static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
177static int symtable_visit_keyword(struct symtable *st, keyword_ty);
178static int symtable_visit_slice(struct symtable *st, slice_ty);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000179static int symtable_visit_params(struct symtable *st, asdl_seq *args);
180static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181static int symtable_implicit_arg(struct symtable *st, int pos);
Neal Norwitzc1505362006-12-28 06:47:50 +0000182static int symtable_visit_annotations(struct symtable *st, stmt_ty s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000183
184
Nick Coghlan650f0d02007-04-15 12:05:43 +0000185static identifier top = NULL, lambda = NULL, genexpr = NULL,
186 listcomp = NULL, setcomp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187
188#define GET_IDENTIFIER(VAR) \
Martin v. Löwis5b222132007-06-10 09:51:05 +0000189 ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000190
191#define DUPLICATE_ARGUMENT \
192"duplicate argument '%s' in function definition"
193
194static struct symtable *
195symtable_new(void)
196{
197 struct symtable *st;
198
199 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
200 if (st == NULL)
201 return NULL;
202
203 st->st_filename = NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000204 st->st_blocks = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000205
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206 if ((st->st_stack = PyList_New(0)) == NULL)
207 goto fail;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000208 if ((st->st_blocks = PyDict_New()) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209 goto fail;
210 st->st_cur = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 st->st_private = NULL;
212 return st;
213 fail:
214 PySymtable_Free(st);
215 return NULL;
216}
217
218struct symtable *
219PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
220{
221 struct symtable *st = symtable_new();
222 asdl_seq *seq;
223 int i;
224
225 if (st == NULL)
226 return st;
227 st->st_filename = filename;
228 st->st_future = future;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000229 /* Make the initial symbol information gathering pass */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000230 if (!GET_IDENTIFIER(top) ||
231 !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000232 PySymtable_Free(st);
233 return NULL;
234 }
235
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 st->st_top = st->st_cur;
237 st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 switch (mod->kind) {
239 case Module_kind:
240 seq = mod->v.Module.body;
241 for (i = 0; i < asdl_seq_LEN(seq); i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000242 if (!symtable_visit_stmt(st,
243 (stmt_ty)asdl_seq_GET(seq, i)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 goto error;
245 break;
246 case Expression_kind:
247 if (!symtable_visit_expr(st, mod->v.Expression.body))
248 goto error;
249 break;
250 case Interactive_kind:
251 seq = mod->v.Interactive.body;
252 for (i = 0; i < asdl_seq_LEN(seq); i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000253 if (!symtable_visit_stmt(st,
254 (stmt_ty)asdl_seq_GET(seq, i)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000255 goto error;
256 break;
257 case Suite_kind:
258 PyErr_SetString(PyExc_RuntimeError,
259 "this compiler does not handle Suites");
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000260 goto error;
261 }
262 if (!symtable_exit_block(st, (void *)mod)) {
263 PySymtable_Free(st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000264 return NULL;
265 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000266 /* Make the second symbol analysis pass */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267 if (symtable_analyze(st))
268 return st;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000269 PySymtable_Free(st);
270 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271 error:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000272 (void) symtable_exit_block(st, (void *)mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 PySymtable_Free(st);
274 return NULL;
275}
276
277void
278PySymtable_Free(struct symtable *st)
279{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000280 Py_XDECREF(st->st_blocks);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000281 Py_XDECREF(st->st_stack);
282 PyMem_Free((void *)st);
283}
284
285PySTEntryObject *
286PySymtable_Lookup(struct symtable *st, void *key)
287{
288 PyObject *k, *v;
289
290 k = PyLong_FromVoidPtr(key);
291 if (k == NULL)
292 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000293 v = PyDict_GetItem(st->st_blocks, k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 if (v) {
295 assert(PySTEntry_Check(v));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000296 Py_INCREF(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000297 }
298 else {
299 PyErr_SetString(PyExc_KeyError,
300 "unknown symbol table entry");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000302
303 Py_DECREF(k);
304 return (PySTEntryObject *)v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000305}
306
307int
308PyST_GetScope(PySTEntryObject *ste, PyObject *name)
309{
310 PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
311 if (!v)
312 return 0;
313 assert(PyInt_Check(v));
Nick Coghlan650f0d02007-04-15 12:05:43 +0000314 return (PyInt_AS_LONG(v) >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315}
316
317
318/* Analyze raw symbol information to determine scope of each name.
319
320 The next several functions are helpers for PySymtable_Analyze(),
321 which determines whether a name is local, global, or free. In addition,
322 it determines which local variables are cell variables; they provide
323 bindings that are used for free variables in enclosed blocks.
324
Nick Coghlan650f0d02007-04-15 12:05:43 +0000325 There are also two kinds of global variables, implicit and explicit. An
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000326 explicit global is declared with the global statement. An implicit
327 global is a free variable for which the compiler has found no binding
328 in an enclosing function scope. The implicit global is either a global
329 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
330 to handle these names to implement slightly odd semantics. In such a
331 block, the name is treated as global until it is assigned to; then it
332 is treated as a local.
333
334 The symbol table requires two passes to determine the scope of each name.
Nick Coghlan650f0d02007-04-15 12:05:43 +0000335 The first pass collects raw facts from the AST via the symtable_visit_*
336 functions: the name is a parameter here, the name is used but not defined
337 here, etc. The second pass analyzes these facts during a pass over the
338 PySTEntryObjects created during pass 1.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000339
340 When a function is entered during the second pass, the parent passes
341 the set of all name bindings visible to its children. These bindings
Nick Coghlan650f0d02007-04-15 12:05:43 +0000342 are used to determine if non-local variables are free or implicit globals.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000343 Names which are explicitly declared nonlocal must exist in this set of
344 visible names - if they do not, a syntax error is raised. After doing
345 the local analysis, it analyzes each of its child blocks using an
346 updated set of name bindings.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347
Nick Coghlan650f0d02007-04-15 12:05:43 +0000348 The children update the free variable set. If a local variable is added to
349 the free variable set by the child, the variable is marked as a cell. The
350 function object being defined must provide runtime storage for the variable
351 that may outlive the function's frame. Cell variables are removed from the
352 free set before the analyze function returns to its parent.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000353
Nick Coghlan650f0d02007-04-15 12:05:43 +0000354 During analysis, the names are:
355 symbols: dict mapping from symbol names to flag values (including offset scope values)
356 scopes: dict mapping from symbol names to scope values (no offset)
357 local: set of all symbol names local to the current scope
358 bound: set of all symbol names local to a containing function scope
359 free: set of all symbol names referenced but not bound in child scopes
360 global: set of all symbol names explicitly declared as global
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000361*/
362
363#define SET_SCOPE(DICT, NAME, I) { \
364 PyObject *o = PyInt_FromLong(I); \
365 if (!o) \
366 return 0; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000367 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
368 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000369 return 0; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000370 } \
371 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000372}
373
374/* Decide on scope of name, given flags.
375
376 The dicts passed in as arguments are modified as necessary.
377 ste is passed so that flags can be updated.
378*/
379
380static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000381analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000382 PyObject *bound, PyObject *local, PyObject *free,
383 PyObject *global)
384{
385 if (flags & DEF_GLOBAL) {
386 if (flags & DEF_PARAM) {
387 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000388 "name '%U' is parameter and global",
389 name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000390 return 0;
391 }
Jeremy Hylton81e95022007-02-27 06:50:52 +0000392 if (flags & DEF_NONLOCAL) {
393 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000394 "name '%U' is nonlocal and global",
395 name);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000396 return 0;
397 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000398 SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
399 if (PySet_Add(global, name) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000400 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000401 if (bound && (PySet_Discard(bound, name) < 0))
402 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000403 return 1;
404 }
Jeremy Hylton81e95022007-02-27 06:50:52 +0000405 if (flags & DEF_NONLOCAL) {
406 if (flags & DEF_PARAM) {
407 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000408 "name '%U' is parameter and nonlocal",
409 name);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000410 return 0;
411 }
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000412 if (!bound) {
413 PyErr_Format(PyExc_SyntaxError,
414 "nonlocal declaration not allowed at module level");
415 return 0;
416 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000417 if (!PySet_Contains(bound, name)) {
Jeremy Hylton81e95022007-02-27 06:50:52 +0000418 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000419 "no binding for nonlocal '%U' found",
420 name);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000421
422 return 0;
423 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000424 SET_SCOPE(scopes, name, FREE);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000425 ste->ste_free = 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000426 return PySet_Add(free, name) >= 0;
Jeremy Hylton81e95022007-02-27 06:50:52 +0000427 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 if (flags & DEF_BOUND) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000429 SET_SCOPE(scopes, name, LOCAL);
430 if (PySet_Add(local, name) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000432 if (PySet_Discard(global, name) < 0)
433 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 return 1;
435 }
436 /* If an enclosing block has a binding for this name, it
437 is a free variable rather than a global variable.
438 Note that having a non-NULL bound implies that the block
439 is nested.
440 */
Nick Coghlan650f0d02007-04-15 12:05:43 +0000441 if (bound && PySet_Contains(bound, name)) {
442 SET_SCOPE(scopes, name, FREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443 ste->ste_free = 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000444 return PySet_Add(free, name) >= 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000445 }
446 /* If a parent has a global statement, then call it global
447 explicit? It could also be global implicit.
448 */
Nick Coghlan650f0d02007-04-15 12:05:43 +0000449 if (global && PySet_Contains(global, name)) {
450 SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000451 return 1;
452 }
Jeremy Hylton81e95022007-02-27 06:50:52 +0000453 if (ste->ste_nested)
454 ste->ste_free = 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000455 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
Jeremy Hylton81e95022007-02-27 06:50:52 +0000456 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000457}
458
459#undef SET_SCOPE
460
461/* If a name is defined in free and also in locals, then this block
462 provides the binding for the free variable. The name should be
463 marked CELL in this block and removed from the free list.
464
465 Note that the current block's free variables are included in free.
466 That's safe because no name can be free and local in the same scope.
467*/
468
469static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000470analyze_cells(PyObject *scopes, PyObject *free)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000471{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000472 PyObject *name, *v, *v_cell;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473 int success = 0;
474 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475
Nick Coghlan650f0d02007-04-15 12:05:43 +0000476 v_cell = PyInt_FromLong(CELL);
477 if (!v_cell)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000479 while (PyDict_Next(scopes, &pos, &name, &v)) {
480 long scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000481 assert(PyInt_Check(v));
Nick Coghlan650f0d02007-04-15 12:05:43 +0000482 scope = PyInt_AS_LONG(v);
483 if (scope != LOCAL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000484 continue;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000485 if (!PySet_Contains(free, name))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000486 continue;
487 /* Replace LOCAL with CELL for this name, and remove
488 from free. It is safe to replace the value of name
489 in the dict, because it will not cause a resize.
490 */
Nick Coghlan650f0d02007-04-15 12:05:43 +0000491 if (PyDict_SetItem(scopes, name, v_cell) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000492 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000493 if (PySet_Discard(free, name) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494 goto error;
495 }
496 success = 1;
497 error:
Nick Coghlan650f0d02007-04-15 12:05:43 +0000498 Py_DECREF(v_cell);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 return success;
500}
501
502/* Check for illegal statements in unoptimized namespaces */
503static int
504check_unoptimized(const PySTEntryObject* ste) {
505 char buf[300];
Armin Rigo31441302005-10-21 12:57:31 +0000506 const char* trailer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507
Neil Schemenauer2dfcef52005-10-23 18:50:36 +0000508 if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 || !(ste->ste_free || ste->ste_child_free))
510 return 1;
511
Armin Rigo31441302005-10-21 12:57:31 +0000512 trailer = (ste->ste_child_free ?
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 "contains a nested function with free variables" :
514 "is a nested function");
515
516 switch (ste->ste_unoptimized) {
Georg Brandl7cae87c2006-09-06 06:51:57 +0000517 case OPT_TOPLEVEL: /* import * at top-level is fine */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518 return 1;
519 case OPT_IMPORT_STAR:
Walter Dörwald4ddbdad2007-06-11 16:06:26 +0000520 PyOS_snprintf(buf, sizeof(buf),
521 "import * is not allowed in function '%U' "
522 "because it %s",
523 ste->ste_name, trailer);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525 }
526
527 PyErr_SetString(PyExc_SyntaxError, buf);
528 PyErr_SyntaxLocation(ste->ste_table->st_filename,
529 ste->ste_opt_lineno);
530 return 0;
531}
532
Nick Coghlan650f0d02007-04-15 12:05:43 +0000533/* Enter the final scope information into the ste_symbols dict.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534 *
535 * All arguments are dicts. Modifies symbols, others are read-only.
536*/
537static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000538update_symbols(PyObject *symbols, PyObject *scopes,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000539 PyObject *bound, PyObject *free, int classflag)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000540{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000541 PyObject *name = NULL, *itr = NULL;
542 PyObject *v = NULL, *v_scope = NULL, *v_new = NULL, *v_free = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000543 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544
Nick Coghlan650f0d02007-04-15 12:05:43 +0000545 /* Update scope information for all symbols in this scope */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546 while (PyDict_Next(symbols, &pos, &name, &v)) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000547 long scope, flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 assert(PyInt_Check(v));
549 flags = PyInt_AS_LONG(v);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000550 v_scope = PyDict_GetItem(scopes, name);
551 assert(v_scope && PyInt_Check(v_scope));
552 scope = PyInt_AS_LONG(v_scope);
553 flags |= (scope << SCOPE_OFFSET);
554 v_new = PyInt_FromLong(flags);
555 if (!v_new)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000556 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000557 if (PyDict_SetItem(symbols, name, v_new) < 0) {
558 Py_DECREF(v_new);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559 return 0;
560 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000561 Py_DECREF(v_new);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562 }
563
Nick Coghlan650f0d02007-04-15 12:05:43 +0000564 /* Record not yet resolved free variables from children (if any) */
565 v_free = PyInt_FromLong(FREE << SCOPE_OFFSET);
566 if (!v_free)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 return 0;
568
Nick Coghlan650f0d02007-04-15 12:05:43 +0000569 itr = PyObject_GetIter(free);
570 if (!itr)
571 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572
Nick Coghlan650f0d02007-04-15 12:05:43 +0000573 while ((name = PyIter_Next(itr))) {
574 v = PyDict_GetItem(symbols, name);
575
576 /* Handle symbol that already exists in this scope */
577 if (v) {
578 /* Handle a free variable in a method of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579 the class that has the same name as a local
580 or global in the class scope.
581 */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000582 if (classflag &&
Nick Coghlan650f0d02007-04-15 12:05:43 +0000583 PyInt_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) {
584 long flags = PyInt_AS_LONG(v) | DEF_FREE_CLASS;
585 v_new = PyInt_FromLong(flags);
586 if (!v_new) {
587 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000589 if (PyDict_SetItem(symbols, name, v_new) < 0) {
590 Py_DECREF(v_new);
591 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000593 Py_DECREF(v_new);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000595 /* It's a cell, or already a free variable in this scope */
596 Py_DECREF(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 continue;
598 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000599 /* Handle global symbol */
600 if (!PySet_Contains(bound, name)) {
601 Py_DECREF(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602 continue; /* it's a global */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000604 /* Propagate new free symbol up the lexical stack */
605 if (PyDict_SetItem(symbols, name, v_free) < 0) {
606 goto error;
607 }
608 Py_DECREF(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000610 Py_DECREF(itr);
611 Py_DECREF(v_free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000613error:
614 Py_XDECREF(v_free);
615 Py_XDECREF(itr);
616 Py_XDECREF(name);
617 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618}
619
620/* Make final symbol table decisions for block of ste.
621 Arguments:
622 ste -- current symtable entry (input/output)
623 bound -- set of variables bound in enclosing scopes (input)
624 free -- set of free variables in enclosed scopes (output)
625 globals -- set of declared global variables in enclosing scopes (input)
626*/
627
628static int
629analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
630 PyObject *global)
631{
Nick Coghlan650f0d02007-04-15 12:05:43 +0000632 PyObject *name, *v, *local = NULL, *scopes = NULL, *newbound = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633 PyObject *newglobal = NULL, *newfree = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000634 int i, success = 0;
635 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636
Nick Coghlan650f0d02007-04-15 12:05:43 +0000637 scopes = PyDict_New();
638 if (!scopes)
639 goto error;
640 local = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000641 if (!local)
642 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000643 newglobal = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000644 if (!newglobal)
645 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000646 newfree = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000647 if (!newfree)
648 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000649 newbound = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000650 if (!newbound)
651 goto error;
652
Nick Coghlan650f0d02007-04-15 12:05:43 +0000653 /* Class namespace has no effect on names visible in
654 nested functions, so populate the global and bound
655 sets to be passed to child blocks before analyzing
656 this one.
657 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000658 if (ste->ste_type == ClassBlock) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000659 /* Pass down previously bound symbols */
660 if (bound) {
661 if (!PyNumber_InPlaceOr(newbound, bound))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000662 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000663 Py_DECREF(newbound);
664 }
665 /* Pass down known globals */
666 if (!PyNumber_InPlaceOr(newglobal, global))
667 goto error;
668 Py_DECREF(newglobal);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669 }
670
Nick Coghlan650f0d02007-04-15 12:05:43 +0000671 /* Analyze symbols in current scope */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000672 assert(PySTEntry_Check(ste));
673 assert(PyDict_Check(ste->ste_symbols));
674 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000675 long flags = PyInt_AS_LONG(v);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000676 if (!analyze_name(ste, scopes, name, flags, bound, local, free,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 global))
678 goto error;
679 }
680
Nick Coghlan650f0d02007-04-15 12:05:43 +0000681 /* Populate global and bound sets to be passed to children.
682 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683 if (ste->ste_type != ClassBlock) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000684 /* Add function locals to bound set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685 if (ste->ste_type == FunctionBlock) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000686 if (!PyNumber_InPlaceOr(newbound, local))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000687 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000688 Py_DECREF(newbound);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000690 /* Pass down previously bound symbols */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000691 if (bound) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000692 if (!PyNumber_InPlaceOr(newbound, bound))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000693 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000694 Py_DECREF(newbound);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000695 }
Nick Coghlan650f0d02007-04-15 12:05:43 +0000696 /* Pass down known globals */
697 if (!PyNumber_InPlaceOr(newglobal, global))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000699 Py_DECREF(newglobal);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700 }
701
702 /* Recursively call analyze_block() on each child block */
703 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
704 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
Armin Rigo31441302005-10-21 12:57:31 +0000705 PySTEntryObject* entry;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000706 assert(c && PySTEntry_Check(c));
Armin Rigo31441302005-10-21 12:57:31 +0000707 entry = (PySTEntryObject*)c;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000708 if (!analyze_block(entry, newbound, newfree, newglobal))
709 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000710 /* Check if any children have free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711 if (entry->ste_free || entry->ste_child_free)
712 ste->ste_child_free = 1;
713 }
714
Nick Coghlan650f0d02007-04-15 12:05:43 +0000715 /* Check if any local variables need to be converted to cell variables */
716 if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000717 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000718 /* Records the results of the analysis in the symbol table entry */
719 if (!update_symbols(ste->ste_symbols, scopes, bound, newfree,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720 ste->ste_type == ClassBlock))
721 goto error;
722 if (!check_unoptimized(ste))
723 goto error;
724
Nick Coghlan650f0d02007-04-15 12:05:43 +0000725 if (!PyNumber_InPlaceOr(free, newfree))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000727 Py_DECREF(free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 success = 1;
729 error:
Nick Coghlan650f0d02007-04-15 12:05:43 +0000730 Py_XDECREF(scopes);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731 Py_XDECREF(local);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732 Py_XDECREF(newbound);
733 Py_XDECREF(newglobal);
734 Py_XDECREF(newfree);
735 if (!success)
736 assert(PyErr_Occurred());
737 return success;
738}
739
740static int
741symtable_analyze(struct symtable *st)
742{
743 PyObject *free, *global;
744 int r;
745
Nick Coghlan650f0d02007-04-15 12:05:43 +0000746 free = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 if (!free)
748 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000749 global = PySet_New(NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 if (!global) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000751 Py_DECREF(free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 return 0;
753 }
754 r = analyze_block(st->st_top, NULL, free, global);
755 Py_DECREF(free);
756 Py_DECREF(global);
757 return r;
758}
759
760
761static int
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000762symtable_warn(struct symtable *st, char *msg, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000763{
764 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
Neal Norwitz5d0ad502005-12-19 04:27:42 +0000765 lineno, NULL, NULL) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
767 PyErr_SetString(PyExc_SyntaxError, msg);
768 PyErr_SyntaxLocation(st->st_filename,
769 st->st_cur->ste_lineno);
770 }
771 return 0;
772 }
773 return 1;
774}
775
776/* symtable_enter_block() gets a reference via PySTEntry_New().
777 This reference is released when the block is exited, via the DECREF
778 in symtable_exit_block().
779*/
780
781static int
782symtable_exit_block(struct symtable *st, void *ast)
783{
Martin v. Löwisd96ee902006-02-16 14:37:16 +0000784 Py_ssize_t end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000785
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000786 Py_CLEAR(st->st_cur);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 end = PyList_GET_SIZE(st->st_stack) - 1;
788 if (end >= 0) {
789 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
790 end);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000791 if (st->st_cur == NULL)
792 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 Py_INCREF(st->st_cur);
794 if (PySequence_DelItem(st->st_stack, end) < 0)
795 return 0;
796 }
797 return 1;
798}
799
800static int
Neal Norwitz62c2fac2005-10-24 00:30:44 +0000801symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 void *ast, int lineno)
803{
804 PySTEntryObject *prev = NULL;
805
806 if (st->st_cur) {
807 prev = st->st_cur;
808 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 return 0;
810 }
811 Py_DECREF(st->st_cur);
812 }
813 st->st_cur = PySTEntry_New(st, name, block, ast, lineno);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000814 if (st->st_cur == NULL)
815 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816 if (name == GET_IDENTIFIER(top))
817 st->st_global = st->st_cur->ste_symbols;
818 if (prev) {
819 if (PyList_Append(prev->ste_children,
820 (PyObject *)st->st_cur) < 0) {
821 return 0;
822 }
823 }
824 return 1;
825}
826
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000827static long
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000828symtable_lookup(struct symtable *st, PyObject *name)
829{
830 PyObject *o;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000831 PyObject *mangled = _Py_Mangle(st->st_private, name);
832 if (!mangled)
833 return 0;
834 o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
835 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 if (!o)
837 return 0;
838 return PyInt_AsLong(o);
839}
840
841static int
842symtable_add_def(struct symtable *st, PyObject *name, int flag)
843{
844 PyObject *o;
845 PyObject *dict;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000846 long val;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000847 PyObject *mangled = _Py_Mangle(st->st_private, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848
Jeremy Hylton81e95022007-02-27 06:50:52 +0000849
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000850 if (!mangled)
851 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852 dict = st->st_cur->ste_symbols;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000853 if ((o = PyDict_GetItem(dict, mangled))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854 val = PyInt_AS_LONG(o);
855 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000856 /* Is it better to use 'mangled' or 'name' here? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
858 PyString_AsString(name));
859 PyErr_SyntaxLocation(st->st_filename,
860 st->st_cur->ste_lineno);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000861 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862 }
863 val |= flag;
864 } else
865 val = flag;
866 o = PyInt_FromLong(val);
867 if (o == NULL)
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000868 goto error;
869 if (PyDict_SetItem(dict, mangled, o) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870 Py_DECREF(o);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000871 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872 }
873 Py_DECREF(o);
874
875 if (flag & DEF_PARAM) {
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000876 if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
877 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000878 } else if (flag & DEF_GLOBAL) {
879 /* XXX need to update DEF_GLOBAL for other flags too;
880 perhaps only DEF_FREE_GLOBAL */
881 val = flag;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000882 if ((o = PyDict_GetItem(st->st_global, mangled))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883 val |= PyInt_AS_LONG(o);
884 }
885 o = PyInt_FromLong(val);
886 if (o == NULL)
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000887 goto error;
888 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889 Py_DECREF(o);
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000890 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891 }
892 Py_DECREF(o);
893 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000894 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895 return 1;
Neil Schemenauer8b528b22005-10-23 18:37:42 +0000896
897error:
898 Py_DECREF(mangled);
899 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000900}
901
902/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
903 They use the ASDL name to synthesize the name of the C type and the visit
904 function.
905
906 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
907 useful if the first node in the sequence requires special treatment.
908*/
909
910#define VISIT(ST, TYPE, V) \
911 if (!symtable_visit_ ## TYPE((ST), (V))) \
912 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000913
914#define VISIT_IN_BLOCK(ST, TYPE, V, S) \
915 if (!symtable_visit_ ## TYPE((ST), (V))) { \
916 symtable_exit_block((ST), (S)); \
917 return 0; \
918 }
919
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920#define VISIT_SEQ(ST, TYPE, SEQ) { \
921 int i; \
922 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
923 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000924 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925 if (!symtable_visit_ ## TYPE((ST), elt)) \
926 return 0; \
927 } \
928}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000929
930#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
931 int i; \
932 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
933 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000934 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000935 if (!symtable_visit_ ## TYPE((ST), elt)) { \
936 symtable_exit_block((ST), (S)); \
937 return 0; \
938 } \
939 } \
940}
941
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
943 int i; \
944 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
945 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000946 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 if (!symtable_visit_ ## TYPE((ST), elt)) \
948 return 0; \
949 } \
950}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000951
952#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
953 int i; \
954 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
955 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000956 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000957 if (!symtable_visit_ ## TYPE((ST), elt)) { \
958 symtable_exit_block((ST), (S)); \
959 return 0; \
960 } \
961 } \
962}
963
Guido van Rossum4f72a782006-10-27 23:31:49 +0000964#define VISIT_KWONLYDEFAULTS(ST, KW_DEFAULTS) { \
965 int i = 0; \
966 asdl_seq *seq = (KW_DEFAULTS); /* avoid variable capture */ \
967 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
968 expr_ty elt = (expr_ty)asdl_seq_GET(seq, i); \
969 if (!elt) continue; /* can be NULL */ \
970 if (!symtable_visit_expr((ST), elt)) \
971 return 0; \
972 } \
973}
974
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975static int
Guido van Rossumc2e20742006-02-27 22:32:47 +0000976symtable_new_tmpname(struct symtable *st)
977{
978 char tmpname[256];
979 identifier tmp;
980
981 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
982 ++st->st_cur->ste_tmpname);
Martin v. Löwis5b222132007-06-10 09:51:05 +0000983 tmp = PyUnicode_InternFromString(tmpname);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000984 if (!tmp)
985 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000986 if (!symtable_add_def(st, tmp, DEF_LOCAL))
987 return 0;
988 Py_DECREF(tmp);
989 return 1;
990}
991
Guido van Rossum4f72a782006-10-27 23:31:49 +0000992
993
Guido van Rossumc2e20742006-02-27 22:32:47 +0000994static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995symtable_visit_stmt(struct symtable *st, stmt_ty s)
996{
997 switch (s->kind) {
998 case FunctionDef_kind:
999 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
1000 return 0;
1001 if (s->v.FunctionDef.args->defaults)
1002 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001003 if (s->v.FunctionDef.args->kw_defaults)
1004 VISIT_KWONLYDEFAULTS(st,
1005 s->v.FunctionDef.args->kw_defaults);
Neal Norwitzc1505362006-12-28 06:47:50 +00001006 if (!symtable_visit_annotations(st, s))
1007 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001008 if (s->v.FunctionDef.decorator_list)
1009 VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 if (!symtable_enter_block(st, s->v.FunctionDef.name,
1011 FunctionBlock, (void *)s, s->lineno))
1012 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001013 VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
1014 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015 if (!symtable_exit_block(st, s))
1016 return 0;
1017 break;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001018 case ClassDef_kind: {
1019 PyObject *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
1021 return 0;
1022 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001023 VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
1024 if (s->v.ClassDef.starargs)
1025 VISIT(st, expr, s->v.ClassDef.starargs);
1026 if (s->v.ClassDef.kwargs)
1027 VISIT(st, expr, s->v.ClassDef.kwargs);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001028 if (s->v.ClassDef.decorator_list)
1029 VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
1031 (void *)s, s->lineno))
1032 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001033 tmp = st->st_private;
1034 st->st_private = s->v.ClassDef.name;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001035 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001036 st->st_private = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037 if (!symtable_exit_block(st, s))
1038 return 0;
1039 break;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001040 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 case Return_kind:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001042 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 VISIT(st, expr, s->v.Return.value);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001044 st->st_cur->ste_returns_value = 1;
1045 if (st->st_cur->ste_generator) {
1046 PyErr_SetString(PyExc_SyntaxError,
1047 RETURN_VAL_IN_GENERATOR);
1048 PyErr_SyntaxLocation(st->st_filename,
1049 s->lineno);
1050 return 0;
1051 }
1052 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 break;
1054 case Delete_kind:
1055 VISIT_SEQ(st, expr, s->v.Delete.targets);
1056 break;
1057 case Assign_kind:
1058 VISIT_SEQ(st, expr, s->v.Assign.targets);
1059 VISIT(st, expr, s->v.Assign.value);
1060 break;
1061 case AugAssign_kind:
1062 VISIT(st, expr, s->v.AugAssign.target);
1063 VISIT(st, expr, s->v.AugAssign.value);
1064 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065 case For_kind:
1066 VISIT(st, expr, s->v.For.target);
1067 VISIT(st, expr, s->v.For.iter);
1068 VISIT_SEQ(st, stmt, s->v.For.body);
1069 if (s->v.For.orelse)
1070 VISIT_SEQ(st, stmt, s->v.For.orelse);
1071 break;
1072 case While_kind:
1073 VISIT(st, expr, s->v.While.test);
1074 VISIT_SEQ(st, stmt, s->v.While.body);
1075 if (s->v.While.orelse)
1076 VISIT_SEQ(st, stmt, s->v.While.orelse);
1077 break;
1078 case If_kind:
1079 /* XXX if 0: and lookup_yield() hacks */
1080 VISIT(st, expr, s->v.If.test);
1081 VISIT_SEQ(st, stmt, s->v.If.body);
1082 if (s->v.If.orelse)
1083 VISIT_SEQ(st, stmt, s->v.If.orelse);
1084 break;
1085 case Raise_kind:
1086 if (s->v.Raise.type) {
1087 VISIT(st, expr, s->v.Raise.type);
1088 if (s->v.Raise.inst) {
1089 VISIT(st, expr, s->v.Raise.inst);
1090 if (s->v.Raise.tback)
1091 VISIT(st, expr, s->v.Raise.tback);
1092 }
1093 }
1094 break;
1095 case TryExcept_kind:
1096 VISIT_SEQ(st, stmt, s->v.TryExcept.body);
1097 VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
1098 VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
1099 break;
1100 case TryFinally_kind:
1101 VISIT_SEQ(st, stmt, s->v.TryFinally.body);
1102 VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
1103 break;
1104 case Assert_kind:
1105 VISIT(st, expr, s->v.Assert.test);
1106 if (s->v.Assert.msg)
1107 VISIT(st, expr, s->v.Assert.msg);
1108 break;
1109 case Import_kind:
1110 VISIT_SEQ(st, alias, s->v.Import.names);
1111 /* XXX Don't have the lineno available inside
1112 visit_alias */
1113 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1114 st->st_cur->ste_opt_lineno = s->lineno;
1115 break;
1116 case ImportFrom_kind:
1117 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
1118 /* XXX Don't have the lineno available inside
1119 visit_alias */
1120 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1121 st->st_cur->ste_opt_lineno = s->lineno;
1122 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123 case Global_kind: {
1124 int i;
1125 asdl_seq *seq = s->v.Global.names;
1126 for (i = 0; i < asdl_seq_LEN(seq); i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001127 identifier name = (identifier)asdl_seq_GET(seq, i);
Martin v. Löwis5b222132007-06-10 09:51:05 +00001128 char *c_name = PyUnicode_AsString(name);
Neal Norwitz46b7bda2006-01-08 01:06:06 +00001129 long cur = symtable_lookup(st, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130 if (cur < 0)
1131 return 0;
1132 if (cur & (DEF_LOCAL | USE)) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001133 char buf[256];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134 if (cur & DEF_LOCAL)
1135 PyOS_snprintf(buf, sizeof(buf),
1136 GLOBAL_AFTER_ASSIGN,
1137 c_name);
1138 else
1139 PyOS_snprintf(buf, sizeof(buf),
1140 GLOBAL_AFTER_USE,
1141 c_name);
Neal Norwitz5d0ad502005-12-19 04:27:42 +00001142 if (!symtable_warn(st, buf, s->lineno))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143 return 0;
1144 }
1145 if (!symtable_add_def(st, name, DEF_GLOBAL))
1146 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148 break;
1149 }
Jeremy Hylton81e95022007-02-27 06:50:52 +00001150 case Nonlocal_kind: {
1151 int i;
1152 asdl_seq *seq = s->v.Nonlocal.names;
1153 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1154 identifier name = (identifier)asdl_seq_GET(seq, i);
Martin v. Löwis5b222132007-06-10 09:51:05 +00001155 char *c_name = PyUnicode_AsString(name);
Jeremy Hylton81e95022007-02-27 06:50:52 +00001156 long cur = symtable_lookup(st, name);
1157 if (cur < 0)
1158 return 0;
1159 if (cur & (DEF_LOCAL | USE)) {
1160 char buf[256];
1161 if (cur & DEF_LOCAL)
1162 PyOS_snprintf(buf, sizeof(buf),
1163 NONLOCAL_AFTER_ASSIGN,
1164 c_name);
1165 else
1166 PyOS_snprintf(buf, sizeof(buf),
1167 NONLOCAL_AFTER_USE,
1168 c_name);
1169 if (!symtable_warn(st, buf, s->lineno))
1170 return 0;
1171 }
1172 if (!symtable_add_def(st, name, DEF_NONLOCAL))
1173 return 0;
1174 }
1175 break;
1176 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177 case Expr_kind:
1178 VISIT(st, expr, s->v.Expr.value);
1179 break;
1180 case Pass_kind:
1181 case Break_kind:
1182 case Continue_kind:
1183 /* nothing to do here */
1184 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001185 case With_kind:
1186 if (!symtable_new_tmpname(st))
1187 return 0;
1188 VISIT(st, expr, s->v.With.context_expr);
1189 if (s->v.With.optional_vars) {
1190 if (!symtable_new_tmpname(st))
1191 return 0;
1192 VISIT(st, expr, s->v.With.optional_vars);
1193 }
1194 VISIT_SEQ(st, stmt, s->v.With.body);
1195 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 }
1197 return 1;
1198}
1199
1200static int
1201symtable_visit_expr(struct symtable *st, expr_ty e)
1202{
1203 switch (e->kind) {
1204 case BoolOp_kind:
1205 VISIT_SEQ(st, expr, e->v.BoolOp.values);
1206 break;
1207 case BinOp_kind:
1208 VISIT(st, expr, e->v.BinOp.left);
1209 VISIT(st, expr, e->v.BinOp.right);
1210 break;
1211 case UnaryOp_kind:
1212 VISIT(st, expr, e->v.UnaryOp.operand);
1213 break;
1214 case Lambda_kind: {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001215 if (!GET_IDENTIFIER(lambda) ||
1216 !symtable_add_def(st, lambda, DEF_LOCAL))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217 return 0;
1218 if (e->v.Lambda.args->defaults)
1219 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
1220 /* XXX how to get line numbers for expressions */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001221 if (!symtable_enter_block(st, lambda,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 FunctionBlock, (void *)e, 0))
1223 return 0;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001224 VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
1225 VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226 if (!symtable_exit_block(st, (void *)e))
1227 return 0;
1228 break;
1229 }
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001230 case IfExp_kind:
1231 VISIT(st, expr, e->v.IfExp.test);
1232 VISIT(st, expr, e->v.IfExp.body);
1233 VISIT(st, expr, e->v.IfExp.orelse);
1234 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 case Dict_kind:
1236 VISIT_SEQ(st, expr, e->v.Dict.keys);
1237 VISIT_SEQ(st, expr, e->v.Dict.values);
1238 break;
Georg Brandl17ab9a02006-08-28 16:38:22 +00001239 case Set_kind:
1240 VISIT_SEQ(st, expr, e->v.Set.elts);
1241 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001242 case GeneratorExp_kind:
1243 if (!symtable_visit_genexp(st, e))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 break;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001246 case ListComp_kind:
1247 if (!symtable_visit_listcomp(st, e))
1248 return 0;
1249 break;
1250 case SetComp_kind:
1251 if (!symtable_visit_setcomp(st, e))
1252 return 0;
1253 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 case Yield_kind:
1255 if (e->v.Yield.value)
1256 VISIT(st, expr, e->v.Yield.value);
1257 st->st_cur->ste_generator = 1;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001258 if (st->st_cur->ste_returns_value) {
1259 PyErr_SetString(PyExc_SyntaxError,
1260 RETURN_VAL_IN_GENERATOR);
1261 PyErr_SyntaxLocation(st->st_filename,
1262 e->lineno);
1263 return 0;
1264 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 break;
1266 case Compare_kind:
1267 VISIT(st, expr, e->v.Compare.left);
1268 VISIT_SEQ(st, expr, e->v.Compare.comparators);
1269 break;
1270 case Call_kind:
1271 VISIT(st, expr, e->v.Call.func);
1272 VISIT_SEQ(st, expr, e->v.Call.args);
1273 VISIT_SEQ(st, keyword, e->v.Call.keywords);
1274 if (e->v.Call.starargs)
1275 VISIT(st, expr, e->v.Call.starargs);
1276 if (e->v.Call.kwargs)
1277 VISIT(st, expr, e->v.Call.kwargs);
1278 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001279 case Num_kind:
1280 case Str_kind:
Georg Brandlee91be42007-02-24 19:41:35 +00001281 case Bytes_kind:
1282 case Ellipsis_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 /* Nothing to do here. */
1284 break;
1285 /* The following exprs can be assignment targets. */
1286 case Attribute_kind:
1287 VISIT(st, expr, e->v.Attribute.value);
1288 break;
1289 case Subscript_kind:
1290 VISIT(st, expr, e->v.Subscript.value);
1291 VISIT(st, slice, e->v.Subscript.slice);
1292 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00001293 case Starred_kind:
1294 VISIT(st, expr, e->v.Starred.value);
1295 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296 case Name_kind:
1297 if (!symtable_add_def(st, e->v.Name.id,
1298 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
1299 return 0;
1300 break;
1301 /* child nodes of List and Tuple will have expr_context set */
1302 case List_kind:
1303 VISIT_SEQ(st, expr, e->v.List.elts);
1304 break;
1305 case Tuple_kind:
1306 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1307 break;
1308 }
1309 return 1;
1310}
1311
1312static int
1313symtable_implicit_arg(struct symtable *st, int pos)
1314{
Martin v. Löwis5b222132007-06-10 09:51:05 +00001315 PyObject *id = PyUnicode_FromFormat(".%d", pos);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316 if (id == NULL)
1317 return 0;
1318 if (!symtable_add_def(st, id, DEF_PARAM)) {
1319 Py_DECREF(id);
1320 return 0;
1321 }
1322 Py_DECREF(id);
1323 return 1;
1324}
1325
1326static int
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001327symtable_visit_params(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328{
Neal Norwitzdaf595f2006-01-07 21:24:54 +00001329 int i;
Neal Norwitzc1505362006-12-28 06:47:50 +00001330
1331 if (!args)
1332 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334 for (i = 0; i < asdl_seq_LEN(args); i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001335 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001336 if (!symtable_add_def(st, arg->arg, DEF_PARAM))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337 return 0;
1338 }
1339
1340 return 1;
1341}
1342
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001343static int
1344symtable_visit_argannotations(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001345{
1346 int i;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001347
1348 if (!args)
1349 return -1;
1350
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 for (i = 0; i < asdl_seq_LEN(args); i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001352 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001353 if (arg->annotation)
1354 VISIT(st, expr, arg->annotation);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001356
1357 return 1;
1358}
1359
Neal Norwitzc1505362006-12-28 06:47:50 +00001360static int
1361symtable_visit_annotations(struct symtable *st, stmt_ty s)
1362{
1363 arguments_ty a = s->v.FunctionDef.args;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001365 if (a->args && !symtable_visit_argannotations(st, a->args))
Neal Norwitzc1505362006-12-28 06:47:50 +00001366 return 0;
1367 if (a->varargannotation)
1368 VISIT(st, expr, a->varargannotation);
1369 if (a->kwargannotation)
1370 VISIT(st, expr, a->kwargannotation);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001371 if (a->kwonlyargs && !symtable_visit_argannotations(st, a->kwonlyargs))
Neal Norwitzc1505362006-12-28 06:47:50 +00001372 return 0;
1373 if (s->v.FunctionDef.returns)
1374 VISIT(st, expr, s->v.FunctionDef.returns);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001375 return 1;
1376}
1377
1378static int
1379symtable_visit_arguments(struct symtable *st, arguments_ty a)
1380{
1381 /* skip default arguments inside function block
1382 XXX should ast be different?
1383 */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001384 if (a->args && !symtable_visit_params(st, a->args))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 return 0;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001386 if (a->kwonlyargs && !symtable_visit_params(st, a->kwonlyargs))
Guido van Rossum4f72a782006-10-27 23:31:49 +00001387 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388 if (a->vararg) {
1389 if (!symtable_add_def(st, a->vararg, DEF_PARAM))
1390 return 0;
1391 st->st_cur->ste_varargs = 1;
1392 }
1393 if (a->kwarg) {
1394 if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
1395 return 0;
1396 st->st_cur->ste_varkeywords = 1;
1397 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 return 1;
1399}
1400
1401
1402static int
1403symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1404{
1405 if (eh->type)
1406 VISIT(st, expr, eh->type);
1407 if (eh->name)
Guido van Rossum16be03e2007-01-10 18:51:35 +00001408 if (!symtable_add_def(st, eh->name, DEF_LOCAL))
1409 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410 VISIT_SEQ(st, stmt, eh->body);
1411 return 1;
1412}
1413
1414
1415static int
1416symtable_visit_alias(struct symtable *st, alias_ty a)
1417{
1418 /* Compute store_name, the name actually bound by the import
1419 operation. It is diferent than a->name when a->name is a
1420 dotted package name (e.g. spam.eggs)
1421 */
1422 PyObject *store_name;
1423 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
Martin v. Löwis5b222132007-06-10 09:51:05 +00001424 const Py_UNICODE *base = PyUnicode_AS_UNICODE(name);
1425 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001426 if (dot) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001427 store_name = PyUnicode_FromUnicode(base, dot - base);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001428 if (!store_name)
1429 return 0;
1430 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 else {
1432 store_name = name;
1433 Py_INCREF(store_name);
1434 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00001435 if (PyUnicode_CompareWithASCIIString(name, "*")) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1437 Py_DECREF(store_name);
1438 return r;
1439 }
1440 else {
1441 if (st->st_cur->ste_type != ModuleBlock) {
Neal Norwitz5d0ad502005-12-19 04:27:42 +00001442 int lineno = st->st_cur->ste_lineno;
1443 if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001444 Py_DECREF(store_name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 return 0;
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001446 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447 }
1448 st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
Neal Norwitz4737b232005-11-19 23:58:29 +00001449 Py_DECREF(store_name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 return 1;
1451 }
1452}
1453
1454
1455static int
1456symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1457{
1458 VISIT(st, expr, lc->target);
1459 VISIT(st, expr, lc->iter);
1460 VISIT_SEQ(st, expr, lc->ifs);
1461 return 1;
1462}
1463
1464
1465static int
1466symtable_visit_keyword(struct symtable *st, keyword_ty k)
1467{
1468 VISIT(st, expr, k->value);
1469 return 1;
1470}
1471
1472
1473static int
1474symtable_visit_slice(struct symtable *st, slice_ty s)
1475{
1476 switch (s->kind) {
1477 case Slice_kind:
1478 if (s->v.Slice.lower)
1479 VISIT(st, expr, s->v.Slice.lower)
1480 if (s->v.Slice.upper)
1481 VISIT(st, expr, s->v.Slice.upper)
1482 if (s->v.Slice.step)
1483 VISIT(st, expr, s->v.Slice.step)
1484 break;
1485 case ExtSlice_kind:
1486 VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
1487 break;
1488 case Index_kind:
1489 VISIT(st, expr, s->v.Index.value)
1490 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 }
1492 return 1;
1493}
1494
1495static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001496symtable_handle_comprehension(struct symtable *st, expr_ty e,
1497 identifier scope_name,
1498 asdl_seq *generators, expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001500 int is_generator = (e->kind == GeneratorExp_kind);
1501 int needs_tmp = !is_generator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502 comprehension_ty outermost = ((comprehension_ty)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001503 asdl_seq_GET(generators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 /* Outermost iterator is evaluated in current scope */
1505 VISIT(st, expr, outermost->iter);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001506 /* Create comprehension scope for the rest */
1507 if (!scope_name ||
1508 !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e, 0)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 return 0;
1510 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001511 st->st_cur->ste_generator = is_generator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 /* Outermost iter is received as an argument */
1513 if (!symtable_implicit_arg(st, 0)) {
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001514 symtable_exit_block(st, (void *)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 return 0;
1516 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001517 /* Allocate temporary name if needed */
1518 if (needs_tmp && !symtable_new_tmpname(st)) {
1519 symtable_exit_block(st, (void *)e);
1520 return 0;
1521 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001522 VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
1523 VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
1524 VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001525 generators, 1, (void*)e);
1526 VISIT_IN_BLOCK(st, expr, elt, (void*)e);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001527 return symtable_exit_block(st, (void *)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528}
Nick Coghlan650f0d02007-04-15 12:05:43 +00001529
1530static int
1531symtable_visit_genexp(struct symtable *st, expr_ty e)
1532{
1533 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
1534 e->v.GeneratorExp.generators,
1535 e->v.GeneratorExp.elt);
1536}
1537
1538static int
1539symtable_visit_listcomp(struct symtable *st, expr_ty e)
1540{
1541 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(listcomp),
1542 e->v.ListComp.generators,
1543 e->v.ListComp.elt);
1544}
1545
1546static int
1547symtable_visit_setcomp(struct symtable *st, expr_ty e)
1548{
1549 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
1550 e->v.SetComp.generators,
1551 e->v.SetComp.elt);
1552}