blob: fe6bc9aca4d08f730efe2db53bf33e7983df0af4 [file] [log] [blame]
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001#include "Python.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01002#include "pycore_pystate.h"
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003#include "symtable.h"
Victor Stinner3bb183d2018-11-22 18:38:38 +01004#undef Yield /* undefine macro conflicting with <winbase.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 */
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02008#define GLOBAL_PARAM \
9"name '%U' is parameter and global"
10
11#define NONLOCAL_PARAM \
12"name '%U' is parameter and nonlocal"
13
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#define GLOBAL_AFTER_ASSIGN \
Guido van Rossum6cff8742016-09-09 09:36:26 -070015"name '%U' is assigned to before global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000016
Jeremy Hylton81e95022007-02-27 06:50:52 +000017#define NONLOCAL_AFTER_ASSIGN \
Guido van Rossum6cff8742016-09-09 09:36:26 -070018"name '%U' is assigned to before nonlocal declaration"
Jeremy Hylton81e95022007-02-27 06:50:52 +000019
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000020#define GLOBAL_AFTER_USE \
Guido van Rossum6cff8742016-09-09 09:36:26 -070021"name '%U' is used prior to global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000022
Jeremy Hylton81e95022007-02-27 06:50:52 +000023#define NONLOCAL_AFTER_USE \
Guido van Rossum6cff8742016-09-09 09:36:26 -070024"name '%U' is used prior to nonlocal declaration"
25
26#define GLOBAL_ANNOT \
27"annotated name '%U' can't be global"
28
29#define NONLOCAL_ANNOT \
30"annotated name '%U' can't be nonlocal"
Jeremy Hylton81e95022007-02-27 06:50:52 +000031
Neal Norwitz5d0ad502005-12-19 04:27:42 +000032#define IMPORT_STAR_WARNING "import * only allowed at module level"
33
Emily Morehouse8f59ee02019-01-24 16:49:56 -070034#define NAMED_EXPR_COMP_IN_CLASS \
35"named expression within a comprehension cannot be used in a class body"
36
Neal Norwitz090b3dd2006-02-28 22:36:46 +000037static PySTEntryObject *
Benjamin Peterson55e00f22008-08-17 18:02:44 +000038ste_new(struct symtable *st, identifier name, _Py_block_ty block,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000039 void *key, int lineno, int col_offset)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 PySTEntryObject *ste = NULL;
Christian Heimes837e53a2012-09-10 03:08:46 +020042 PyObject *k = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 k = PyLong_FromVoidPtr(key);
45 if (k == NULL)
46 goto fail;
47 ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
Christian Heimes55ad6512012-09-12 17:58:10 +020048 if (ste == NULL) {
49 Py_DECREF(k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 goto fail;
Christian Heimes55ad6512012-09-12 17:58:10 +020051 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 ste->ste_table = st;
Christian Heimes15265822012-09-12 17:52:46 +020053 ste->ste_id = k; /* ste owns reference to k */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 Py_INCREF(name);
Victor Stinner9a4fb662013-07-11 22:49:00 +020056 ste->ste_name = name;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 ste->ste_symbols = NULL;
59 ste->ste_varnames = NULL;
60 ste->ste_children = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000061
Benjamin Petersond9c87022012-10-31 20:26:20 -040062 ste->ste_directives = NULL;
63
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 ste->ste_type = block;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 ste->ste_nested = 0;
66 ste->ste_free = 0;
67 ste->ste_varargs = 0;
68 ste->ste_varkeywords = 0;
69 ste->ste_opt_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000070 ste->ste_opt_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 ste->ste_lineno = lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000072 ste->ste_col_offset = col_offset;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 if (st->st_cur != NULL &&
75 (st->st_cur->ste_nested ||
76 st->st_cur->ste_type == FunctionBlock))
77 ste->ste_nested = 1;
78 ste->ste_child_free = 0;
79 ste->ste_generator = 0;
Yury Selivanoveb636452016-09-08 22:01:51 -070080 ste->ste_coroutine = 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -070081 ste->ste_comprehension = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 ste->ste_returns_value = 0;
Benjamin Peterson312595c2013-05-15 15:26:42 -050083 ste->ste_needs_class_closure = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000084
Victor Stinner9a4fb662013-07-11 22:49:00 +020085 ste->ste_symbols = PyDict_New();
86 ste->ste_varnames = PyList_New(0);
87 ste->ste_children = PyList_New(0);
88 if (ste->ste_symbols == NULL
89 || ste->ste_varnames == NULL
90 || ste->ste_children == NULL)
91 goto fail;
92
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0)
94 goto fail;
95
96 return ste;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000097 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 Py_XDECREF(ste);
99 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000100}
101
102static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103ste_repr(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 return PyUnicode_FromFormat("<symtable entry %U(%ld), line %d>",
106 ste->ste_name,
107 PyLong_AS_LONG(ste->ste_id), ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000108}
109
110static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111ste_dealloc(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 ste->ste_table = NULL;
114 Py_XDECREF(ste->ste_id);
115 Py_XDECREF(ste->ste_name);
116 Py_XDECREF(ste->ste_symbols);
117 Py_XDECREF(ste->ste_varnames);
118 Py_XDECREF(ste->ste_children);
Benjamin Petersond9c87022012-10-31 20:26:20 -0400119 Py_XDECREF(ste->ste_directives);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 PyObject_Del(ste);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000121}
122
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000123#define OFF(x) offsetof(PySTEntryObject, x)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000124
Guido van Rossum6f799372001-09-20 20:46:19 +0000125static PyMemberDef ste_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 {"id", T_OBJECT, OFF(ste_id), READONLY},
127 {"name", T_OBJECT, OFF(ste_name), READONLY},
128 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
129 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
130 {"children", T_OBJECT, OFF(ste_children), READONLY},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 {"nested", T_INT, OFF(ste_nested), READONLY},
132 {"type", T_INT, OFF(ste_type), READONLY},
133 {"lineno", T_INT, OFF(ste_lineno), READONLY},
134 {NULL}
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000135};
136
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000137PyTypeObject PySTEntry_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 PyVarObject_HEAD_INIT(&PyType_Type, 0)
139 "symtable entry",
140 sizeof(PySTEntryObject),
141 0,
142 (destructor)ste_dealloc, /* tp_dealloc */
143 0, /* tp_print */
144 0, /* tp_getattr */
145 0, /* tp_setattr */
146 0, /* tp_reserved */
147 (reprfunc)ste_repr, /* tp_repr */
148 0, /* tp_as_number */
149 0, /* tp_as_sequence */
150 0, /* tp_as_mapping */
151 0, /* tp_hash */
152 0, /* tp_call */
153 0, /* tp_str */
154 PyObject_GenericGetAttr, /* tp_getattro */
155 0, /* tp_setattro */
156 0, /* tp_as_buffer */
157 Py_TPFLAGS_DEFAULT, /* tp_flags */
158 0, /* tp_doc */
159 0, /* tp_traverse */
160 0, /* tp_clear */
161 0, /* tp_richcompare */
162 0, /* tp_weaklistoffset */
163 0, /* tp_iter */
164 0, /* tp_iternext */
165 0, /* tp_methods */
166 ste_memberlist, /* tp_members */
167 0, /* tp_getset */
168 0, /* tp_base */
169 0, /* tp_dict */
170 0, /* tp_descr_get */
171 0, /* tp_descr_set */
172 0, /* tp_dictoffset */
173 0, /* tp_init */
174 0, /* tp_alloc */
175 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000176};
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000177
178static int symtable_analyze(struct symtable *st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179static int symtable_enter_block(struct symtable *st, identifier name,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000180 _Py_block_ty block, void *ast, int lineno,
181 int col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000182static int symtable_exit_block(struct symtable *st, void *ast);
183static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
184static int symtable_visit_expr(struct symtable *st, expr_ty s);
185static int symtable_visit_genexp(struct symtable *st, expr_ty s);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000186static int symtable_visit_listcomp(struct symtable *st, expr_ty s);
187static int symtable_visit_setcomp(struct symtable *st, expr_ty s);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000188static int symtable_visit_dictcomp(struct symtable *st, expr_ty s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000189static int symtable_visit_arguments(struct symtable *st, arguments_ty);
190static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
191static int symtable_visit_alias(struct symtable *st, alias_ty);
192static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
193static int symtable_visit_keyword(struct symtable *st, keyword_ty);
194static int symtable_visit_slice(struct symtable *st, slice_ty);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000195static int symtable_visit_params(struct symtable *st, asdl_seq *args);
196static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000197static int symtable_implicit_arg(struct symtable *st, int pos);
Yury Selivanov75445082015-05-11 22:57:16 -0400198static int symtable_visit_annotations(struct symtable *st, stmt_ty s, arguments_ty, expr_ty);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500199static int symtable_visit_withitem(struct symtable *st, withitem_ty item);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200
201
Nick Coghlan650f0d02007-04-15 12:05:43 +0000202static identifier top = NULL, lambda = NULL, genexpr = NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 listcomp = NULL, setcomp = NULL, dictcomp = NULL,
Benjamin Petersone8e14592013-05-16 14:37:25 -0500204 __class__ = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205
206#define GET_IDENTIFIER(VAR) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208
209#define DUPLICATE_ARGUMENT \
Neal Norwitza5d16a32007-08-24 22:53:58 +0000210"duplicate argument '%U' in function definition"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211
212static struct symtable *
213symtable_new(void)
214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 struct symtable *st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
Zackery Spytzad65f152018-11-16 08:58:55 -0700218 if (st == NULL) {
219 PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 return NULL;
Zackery Spytzad65f152018-11-16 08:58:55 -0700221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 st->st_filename = NULL;
224 st->st_blocks = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 if ((st->st_stack = PyList_New(0)) == NULL)
227 goto fail;
228 if ((st->st_blocks = PyDict_New()) == NULL)
229 goto fail;
230 st->st_cur = NULL;
231 st->st_private = NULL;
232 return st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 PySymtable_Free(st);
235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236}
237
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000238/* When compiling the use of C stack is probably going to be a lot
239 lighter than when executing Python code but still can overflow
240 and causing a Python crash if not checked (e.g. eval("()"*300000)).
241 Using the current recursion limit for the compiler seems too
242 restrictive (it caused at least one test to fail) so a factor is
243 used to allow deeper recursion when compiling an expression.
244
245 Using a scaling factor means this should automatically adjust when
246 the recursion limit is adjusted for small or large C stack allocations.
247*/
248#define COMPILER_STACK_FRAME_SCALE 3
249
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000250struct symtable *
Victor Stinner14e461d2013-08-26 22:28:21 +0200251PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252{
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000253 struct symtable *st = symtable_new();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 asdl_seq *seq;
255 int i;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000256 PyThreadState *tstate;
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400257 int recursion_limit = Py_GetRecursionLimit();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 if (st == NULL)
Victor Stinner14e461d2013-08-26 22:28:21 +0200260 return NULL;
261 if (filename == NULL) {
262 PySymtable_Free(st);
263 return NULL;
264 }
265 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 st->st_filename = filename;
267 st->st_future = future;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000268
269 /* Setup recursion depth check counters */
Victor Stinner50b48572018-11-01 01:51:40 +0100270 tstate = _PyThreadState_GET();
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000271 if (!tstate) {
272 PySymtable_Free(st);
273 return NULL;
274 }
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400275 /* Be careful here to prevent overflow. */
276 st->recursion_depth = (tstate->recursion_depth < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
277 tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE : tstate->recursion_depth;
278 st->recursion_limit = (recursion_limit < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
279 recursion_limit * COMPILER_STACK_FRAME_SCALE : recursion_limit;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 /* Make the initial symbol information gathering pass */
282 if (!GET_IDENTIFIER(top) ||
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000283 !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 PySymtable_Free(st);
285 return NULL;
286 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 st->st_top = st->st_cur;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 switch (mod->kind) {
290 case Module_kind:
291 seq = mod->v.Module.body;
292 for (i = 0; i < asdl_seq_LEN(seq); i++)
293 if (!symtable_visit_stmt(st,
294 (stmt_ty)asdl_seq_GET(seq, i)))
295 goto error;
296 break;
297 case Expression_kind:
298 if (!symtable_visit_expr(st, mod->v.Expression.body))
299 goto error;
300 break;
301 case Interactive_kind:
302 seq = mod->v.Interactive.body;
303 for (i = 0; i < asdl_seq_LEN(seq); i++)
304 if (!symtable_visit_stmt(st,
305 (stmt_ty)asdl_seq_GET(seq, i)))
306 goto error;
307 break;
308 case Suite_kind:
309 PyErr_SetString(PyExc_RuntimeError,
310 "this compiler does not handle Suites");
311 goto error;
Guido van Rossum522346d2019-02-11 11:34:50 -0800312 case FunctionType_kind:
313 PyErr_SetString(PyExc_RuntimeError,
314 "this compiler does not handle FunctionTypes");
315 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 }
317 if (!symtable_exit_block(st, (void *)mod)) {
318 PySymtable_Free(st);
319 return NULL;
320 }
321 /* Make the second symbol analysis pass */
322 if (symtable_analyze(st))
323 return st;
324 PySymtable_Free(st);
325 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000326 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 (void) symtable_exit_block(st, (void *)mod);
328 PySymtable_Free(st);
329 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000330}
331
Victor Stinner14e461d2013-08-26 22:28:21 +0200332struct symtable *
333PySymtable_Build(mod_ty mod, const char *filename_str, PyFutureFeatures *future)
334{
335 PyObject *filename;
336 struct symtable *st;
337 filename = PyUnicode_DecodeFSDefault(filename_str);
338 if (filename == NULL)
339 return NULL;
340 st = PySymtable_BuildObject(mod, filename, future);
341 Py_DECREF(filename);
342 return st;
343}
344
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345void
346PySymtable_Free(struct symtable *st)
347{
Victor Stinner14e461d2013-08-26 22:28:21 +0200348 Py_XDECREF(st->st_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 Py_XDECREF(st->st_blocks);
350 Py_XDECREF(st->st_stack);
351 PyMem_Free((void *)st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352}
353
354PySTEntryObject *
355PySymtable_Lookup(struct symtable *st, void *key)
356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 PyObject *k, *v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 k = PyLong_FromVoidPtr(key);
360 if (k == NULL)
361 return NULL;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200362 v = PyDict_GetItemWithError(st->st_blocks, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 if (v) {
364 assert(PySTEntry_Check(v));
365 Py_INCREF(v);
366 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200367 else if (!PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 PyErr_SetString(PyExc_KeyError,
369 "unknown symbol table entry");
370 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 Py_DECREF(k);
373 return (PySTEntryObject *)v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000374}
375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000377PyST_GetScope(PySTEntryObject *ste, PyObject *name)
378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
380 if (!v)
381 return 0;
382 assert(PyLong_Check(v));
383 return (PyLong_AS_LONG(v) >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000384}
385
Benjamin Petersond9c87022012-10-31 20:26:20 -0400386static int
387error_at_directive(PySTEntryObject *ste, PyObject *name)
388{
389 Py_ssize_t i;
390 PyObject *data;
391 assert(ste->ste_directives);
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600392 for (i = 0; i < PyList_GET_SIZE(ste->ste_directives); i++) {
Benjamin Petersond9c87022012-10-31 20:26:20 -0400393 data = PyList_GET_ITEM(ste->ste_directives, i);
394 assert(PyTuple_CheckExact(data));
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600395 assert(PyUnicode_CheckExact(PyTuple_GET_ITEM(data, 0)));
396 if (PyUnicode_Compare(PyTuple_GET_ITEM(data, 0), name) == 0) {
397 PyErr_SyntaxLocationObject(ste->ste_table->st_filename,
398 PyLong_AsLong(PyTuple_GET_ITEM(data, 1)),
Ammar Askar025eb982018-09-24 17:12:49 -0400399 PyLong_AsLong(PyTuple_GET_ITEM(data, 2)) + 1);
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600400
401 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -0700402 }
Benjamin Petersond9c87022012-10-31 20:26:20 -0400403 }
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600404 PyErr_SetString(PyExc_RuntimeError,
405 "BUG: internal directive bookkeeping broken");
Benjamin Petersond9c87022012-10-31 20:26:20 -0400406 return 0;
407}
408
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000409
410/* Analyze raw symbol information to determine scope of each name.
411
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000412 The next several functions are helpers for symtable_analyze(),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 which determines whether a name is local, global, or free. In addition,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 it determines which local variables are cell variables; they provide
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 bindings that are used for free variables in enclosed blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 There are also two kinds of global variables, implicit and explicit. An
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418 explicit global is declared with the global statement. An implicit
419 global is a free variable for which the compiler has found no binding
420 in an enclosing function scope. The implicit global is either a global
421 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
422 to handle these names to implement slightly odd semantics. In such a
423 block, the name is treated as global until it is assigned to; then it
424 is treated as a local.
425
426 The symbol table requires two passes to determine the scope of each name.
Nick Coghlan650f0d02007-04-15 12:05:43 +0000427 The first pass collects raw facts from the AST via the symtable_visit_*
428 functions: the name is a parameter here, the name is used but not defined
429 here, etc. The second pass analyzes these facts during a pass over the
430 PySTEntryObjects created during pass 1.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431
432 When a function is entered during the second pass, the parent passes
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 the set of all name bindings visible to its children. These bindings
Nick Coghlan650f0d02007-04-15 12:05:43 +0000434 are used to determine if non-local variables are free or implicit globals.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000435 Names which are explicitly declared nonlocal must exist in this set of
436 visible names - if they do not, a syntax error is raised. After doing
437 the local analysis, it analyzes each of its child blocks using an
438 updated set of name bindings.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439
Nick Coghlan650f0d02007-04-15 12:05:43 +0000440 The children update the free variable set. If a local variable is added to
441 the free variable set by the child, the variable is marked as a cell. The
442 function object being defined must provide runtime storage for the variable
443 that may outlive the function's frame. Cell variables are removed from the
444 free set before the analyze function returns to its parent.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000445
Nick Coghlan650f0d02007-04-15 12:05:43 +0000446 During analysis, the names are:
447 symbols: dict mapping from symbol names to flag values (including offset scope values)
448 scopes: dict mapping from symbol names to scope values (no offset)
449 local: set of all symbol names local to the current scope
450 bound: set of all symbol names local to a containing function scope
451 free: set of all symbol names referenced but not bound in child scopes
452 global: set of all symbol names explicitly declared as global
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453*/
454
455#define SET_SCOPE(DICT, NAME, I) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 PyObject *o = PyLong_FromLong(I); \
457 if (!o) \
458 return 0; \
459 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
460 Py_DECREF(o); \
461 return 0; \
462 } \
463 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000464}
465
466/* Decide on scope of name, given flags.
467
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000468 The namespace dictionaries may be modified to record information
469 about the new name. For example, a new global will add an entry to
470 global. A name that was global can be changed to local.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000471*/
472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000474analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 PyObject *bound, PyObject *local, PyObject *free,
476 PyObject *global)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 if (flags & DEF_GLOBAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 if (flags & DEF_NONLOCAL) {
480 PyErr_Format(PyExc_SyntaxError,
481 "name '%U' is nonlocal and global",
482 name);
Benjamin Petersond9c87022012-10-31 20:26:20 -0400483 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 }
485 SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
486 if (PySet_Add(global, name) < 0)
487 return 0;
488 if (bound && (PySet_Discard(bound, name) < 0))
489 return 0;
490 return 1;
491 }
492 if (flags & DEF_NONLOCAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 if (!bound) {
494 PyErr_Format(PyExc_SyntaxError,
495 "nonlocal declaration not allowed at module level");
Benjamin Petersond9c87022012-10-31 20:26:20 -0400496 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 }
498 if (!PySet_Contains(bound, name)) {
499 PyErr_Format(PyExc_SyntaxError,
500 "no binding for nonlocal '%U' found",
501 name);
502
Benjamin Petersond9c87022012-10-31 20:26:20 -0400503 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 }
505 SET_SCOPE(scopes, name, FREE);
506 ste->ste_free = 1;
507 return PySet_Add(free, name) >= 0;
508 }
509 if (flags & DEF_BOUND) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +0000510 SET_SCOPE(scopes, name, LOCAL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 if (PySet_Add(local, name) < 0)
512 return 0;
513 if (PySet_Discard(global, name) < 0)
514 return 0;
515 return 1;
516 }
517 /* If an enclosing block has a binding for this name, it
518 is a free variable rather than a global variable.
519 Note that having a non-NULL bound implies that the block
520 is nested.
521 */
522 if (bound && PySet_Contains(bound, name)) {
523 SET_SCOPE(scopes, name, FREE);
524 ste->ste_free = 1;
525 return PySet_Add(free, name) >= 0;
526 }
527 /* If a parent has a global statement, then call it global
528 explicit? It could also be global implicit.
529 */
530 if (global && PySet_Contains(global, name)) {
531 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
532 return 1;
533 }
534 if (ste->ste_nested)
535 ste->ste_free = 1;
536 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
537 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538}
539
540#undef SET_SCOPE
541
542/* If a name is defined in free and also in locals, then this block
543 provides the binding for the free variable. The name should be
544 marked CELL in this block and removed from the free list.
545
546 Note that the current block's free variables are included in free.
547 That's safe because no name can be free and local in the same scope.
548*/
549
550static int
Benjamin Peterson312595c2013-05-15 15:26:42 -0500551analyze_cells(PyObject *scopes, PyObject *free)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 PyObject *name, *v, *v_cell;
554 int success = 0;
555 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 v_cell = PyLong_FromLong(CELL);
558 if (!v_cell)
559 return 0;
560 while (PyDict_Next(scopes, &pos, &name, &v)) {
561 long scope;
562 assert(PyLong_Check(v));
563 scope = PyLong_AS_LONG(v);
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +0000564 if (scope != LOCAL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 continue;
566 if (!PySet_Contains(free, name))
567 continue;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 /* Replace LOCAL with CELL for this name, and remove
569 from free. It is safe to replace the value of name
570 in the dict, because it will not cause a resize.
571 */
572 if (PyDict_SetItem(scopes, name, v_cell) < 0)
573 goto error;
574 if (PySet_Discard(free, name) < 0)
575 goto error;
576 }
577 success = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 Py_DECREF(v_cell);
580 return success;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581}
582
Benjamin Peterson312595c2013-05-15 15:26:42 -0500583static int
584drop_class_free(PySTEntryObject *ste, PyObject *free)
585{
586 int res;
587 if (!GET_IDENTIFIER(__class__))
588 return 0;
589 res = PySet_Discard(free, __class__);
590 if (res < 0)
591 return 0;
592 if (res)
593 ste->ste_needs_class_closure = 1;
594 return 1;
595}
596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597/* Enter the final scope information into the ste_symbols dict.
598 *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 * All arguments are dicts. Modifies symbols, others are read-only.
600*/
601static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602update_symbols(PyObject *symbols, PyObject *scopes,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000603 PyObject *bound, PyObject *free, int classflag)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 PyObject *name = NULL, *itr = NULL;
606 PyObject *v = NULL, *v_scope = NULL, *v_new = NULL, *v_free = NULL;
607 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 /* Update scope information for all symbols in this scope */
610 while (PyDict_Next(symbols, &pos, &name, &v)) {
611 long scope, flags;
612 assert(PyLong_Check(v));
613 flags = PyLong_AS_LONG(v);
614 v_scope = PyDict_GetItem(scopes, name);
615 assert(v_scope && PyLong_Check(v_scope));
616 scope = PyLong_AS_LONG(v_scope);
617 flags |= (scope << SCOPE_OFFSET);
618 v_new = PyLong_FromLong(flags);
619 if (!v_new)
620 return 0;
621 if (PyDict_SetItem(symbols, name, v_new) < 0) {
622 Py_DECREF(v_new);
623 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 Py_DECREF(v_new);
626 }
627
628 /* Record not yet resolved free variables from children (if any) */
629 v_free = PyLong_FromLong(FREE << SCOPE_OFFSET);
630 if (!v_free)
631 return 0;
632
633 itr = PyObject_GetIter(free);
Zackery Spytzfc439d22018-10-10 23:05:35 -0600634 if (itr == NULL) {
635 Py_DECREF(v_free);
636 return 0;
637 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638
639 while ((name = PyIter_Next(itr))) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200640 v = PyDict_GetItemWithError(symbols, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641
642 /* Handle symbol that already exists in this scope */
643 if (v) {
644 /* Handle a free variable in a method of
645 the class that has the same name as a local
646 or global in the class scope.
647 */
648 if (classflag &&
649 PyLong_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) {
650 long flags = PyLong_AS_LONG(v) | DEF_FREE_CLASS;
651 v_new = PyLong_FromLong(flags);
652 if (!v_new) {
653 goto error;
654 }
655 if (PyDict_SetItem(symbols, name, v_new) < 0) {
656 Py_DECREF(v_new);
657 goto error;
658 }
659 Py_DECREF(v_new);
660 }
661 /* It's a cell, or already free in this scope */
662 Py_DECREF(name);
663 continue;
664 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200665 else if (PyErr_Occurred()) {
666 goto error;
667 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 /* Handle global symbol */
Christian Heimes45af0c82016-09-09 00:22:28 +0200669 if (bound && !PySet_Contains(bound, name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 Py_DECREF(name);
671 continue; /* it's a global */
672 }
673 /* Propagate new free symbol up the lexical stack */
674 if (PyDict_SetItem(symbols, name, v_free) < 0) {
675 goto error;
676 }
677 Py_DECREF(name);
678 }
679 Py_DECREF(itr);
680 Py_DECREF(v_free);
681 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000682error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 Py_XDECREF(v_free);
684 Py_XDECREF(itr);
685 Py_XDECREF(name);
686 return 0;
687}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000688
689/* Make final symbol table decisions for block of ste.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000690
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000691 Arguments:
692 ste -- current symtable entry (input/output)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000693 bound -- set of variables bound in enclosing scopes (input). bound
694 is NULL for module blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000695 free -- set of free variables in enclosed scopes (output)
696 globals -- set of declared global variables in enclosing scopes (input)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000697
698 The implementation uses two mutually recursive functions,
699 analyze_block() and analyze_child_block(). analyze_block() is
700 responsible for analyzing the individual names defined in a block.
701 analyze_child_block() prepares temporary namespace dictionaries
702 used to evaluated nested blocks.
703
704 The two functions exist because a child block should see the name
705 bindings of its enclosing blocks, but those bindings should not
706 propagate back to a parent block.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707*/
708
709static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
711 PyObject *global, PyObject* child_free);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000712
713static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
715 PyObject *global)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 PyObject *name, *v, *local = NULL, *scopes = NULL, *newbound = NULL;
718 PyObject *newglobal = NULL, *newfree = NULL, *allfree = NULL;
719 PyObject *temp;
720 int i, success = 0;
721 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 local = PySet_New(NULL); /* collect new names bound in block */
724 if (!local)
725 goto error;
726 scopes = PyDict_New(); /* collect scopes defined for each name */
727 if (!scopes)
728 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 /* Allocate new global and bound variable dictionaries. These
731 dictionaries hold the names visible in nested blocks. For
732 ClassBlocks, the bound and global names are initialized
733 before analyzing names, because class bindings aren't
734 visible in methods. For other blocks, they are initialized
735 after names are analyzed.
736 */
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 /* TODO(jhylton): Package these dicts in a struct so that we
739 can write reasonable helper functions?
740 */
741 newglobal = PySet_New(NULL);
742 if (!newglobal)
743 goto error;
744 newfree = PySet_New(NULL);
745 if (!newfree)
746 goto error;
747 newbound = PySet_New(NULL);
748 if (!newbound)
749 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 /* Class namespace has no effect on names visible in
752 nested functions, so populate the global and bound
753 sets to be passed to child blocks before analyzing
754 this one.
755 */
756 if (ste->ste_type == ClassBlock) {
757 /* Pass down known globals */
758 temp = PyNumber_InPlaceOr(newglobal, global);
759 if (!temp)
760 goto error;
761 Py_DECREF(temp);
762 /* Pass down previously bound symbols */
763 if (bound) {
764 temp = PyNumber_InPlaceOr(newbound, bound);
765 if (!temp)
766 goto error;
767 Py_DECREF(temp);
768 }
769 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
772 long flags = PyLong_AS_LONG(v);
773 if (!analyze_name(ste, scopes, name, flags,
774 bound, local, free, global))
775 goto error;
776 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 /* Populate global and bound sets to be passed to children. */
779 if (ste->ste_type != ClassBlock) {
780 /* Add function locals to bound set */
781 if (ste->ste_type == FunctionBlock) {
782 temp = PyNumber_InPlaceOr(newbound, local);
783 if (!temp)
784 goto error;
785 Py_DECREF(temp);
786 }
787 /* Pass down previously bound symbols */
788 if (bound) {
789 temp = PyNumber_InPlaceOr(newbound, bound);
790 if (!temp)
791 goto error;
792 Py_DECREF(temp);
793 }
794 /* Pass down known globals */
795 temp = PyNumber_InPlaceOr(newglobal, global);
796 if (!temp)
797 goto error;
798 Py_DECREF(temp);
799 }
800 else {
801 /* Special-case __class__ */
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000802 if (!GET_IDENTIFIER(__class__))
803 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 if (PySet_Add(newbound, __class__) < 0)
805 goto error;
806 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807
Eli Benderskydd97fbb2011-04-10 07:37:26 +0300808 /* Recursively call analyze_child_block() on each child block.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 newbound, newglobal now contain the names visible in
811 nested blocks. The free variables in the children will
812 be collected in allfree.
813 */
814 allfree = PySet_New(NULL);
815 if (!allfree)
816 goto error;
817 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
818 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
819 PySTEntryObject* entry;
820 assert(c && PySTEntry_Check(c));
821 entry = (PySTEntryObject*)c;
822 if (!analyze_child_block(entry, newbound, newfree, newglobal,
823 allfree))
824 goto error;
825 /* Check if any children have free variables */
826 if (entry->ste_free || entry->ste_child_free)
827 ste->ste_child_free = 1;
828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 temp = PyNumber_InPlaceOr(newfree, allfree);
831 if (!temp)
832 goto error;
833 Py_DECREF(temp);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 /* Check if any local variables must be converted to cell variables */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500836 if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 goto error;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500838 else if (ste->ste_type == ClassBlock && !drop_class_free(ste, newfree))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 goto error;
840 /* Records the results of the analysis in the symbol table entry */
841 if (!update_symbols(ste->ste_symbols, scopes, bound, newfree,
842 ste->ste_type == ClassBlock))
843 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 temp = PyNumber_InPlaceOr(free, newfree);
846 if (!temp)
847 goto error;
848 Py_DECREF(temp);
849 success = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000850 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 Py_XDECREF(scopes);
852 Py_XDECREF(local);
853 Py_XDECREF(newbound);
854 Py_XDECREF(newglobal);
855 Py_XDECREF(newfree);
856 Py_XDECREF(allfree);
857 if (!success)
858 assert(PyErr_Occurred());
859 return success;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860}
861
862static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
864 PyObject *global, PyObject* child_free)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
867 PyObject *temp;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 /* Copy the bound and global dictionaries.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000870
Martin Panter3ee62702016-06-04 04:57:19 +0000871 These dictionaries are used by all blocks enclosed by the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 current block. The analyze_block() call modifies these
873 dictionaries.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 */
876 temp_bound = PySet_New(bound);
877 if (!temp_bound)
878 goto error;
879 temp_free = PySet_New(free);
880 if (!temp_free)
881 goto error;
882 temp_global = PySet_New(global);
883 if (!temp_global)
884 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 if (!analyze_block(entry, temp_bound, temp_free, temp_global))
887 goto error;
888 temp = PyNumber_InPlaceOr(child_free, temp_free);
889 if (!temp)
890 goto error;
891 Py_DECREF(temp);
892 Py_DECREF(temp_bound);
893 Py_DECREF(temp_free);
894 Py_DECREF(temp_global);
895 return 1;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000896 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 Py_XDECREF(temp_bound);
898 Py_XDECREF(temp_free);
899 Py_XDECREF(temp_global);
900 return 0;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000901}
902
903static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000904symtable_analyze(struct symtable *st)
905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 PyObject *free, *global;
907 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 free = PySet_New(NULL);
910 if (!free)
911 return 0;
912 global = PySet_New(NULL);
913 if (!global) {
914 Py_DECREF(free);
915 return 0;
916 }
917 r = analyze_block(st->st_top, NULL, free, global);
918 Py_DECREF(free);
919 Py_DECREF(global);
920 return r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921}
922
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000923/* symtable_enter_block() gets a reference via ste_new.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 This reference is released when the block is exited, via the DECREF
925 in symtable_exit_block().
926*/
927
928static int
929symtable_exit_block(struct symtable *st, void *ast)
930{
Benjamin Peterson609da582011-06-29 22:52:39 -0500931 Py_ssize_t size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932
Benjamin Peterson609da582011-06-29 22:52:39 -0500933 st->st_cur = NULL;
934 size = PyList_GET_SIZE(st->st_stack);
935 if (size) {
Benjamin Peterson609da582011-06-29 22:52:39 -0500936 if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 return 0;
Benjamin Peterson9d872e12011-07-02 09:22:13 -0500938 if (--size)
939 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, size - 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 }
941 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942}
943
944static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000946 void *ast, int lineno, int col_offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947{
Benjamin Peterson609da582011-06-29 22:52:39 -0500948 PySTEntryObject *prev = NULL, *ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949
Benjamin Peterson609da582011-06-29 22:52:39 -0500950 ste = ste_new(st, name, block, ast, lineno, col_offset);
951 if (ste == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 return 0;
Benjamin Peterson609da582011-06-29 22:52:39 -0500953 if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) {
954 Py_DECREF(ste);
955 return 0;
956 }
957 prev = st->st_cur;
958 /* The entry is owned by the stack. Borrow it for st_cur. */
959 Py_DECREF(ste);
960 st->st_cur = ste;
Benjamin Peterson230b2062010-10-16 03:45:45 +0000961 if (block == ModuleBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 st->st_global = st->st_cur->ste_symbols;
963 if (prev) {
Benjamin Peterson609da582011-06-29 22:52:39 -0500964 if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 return 0;
966 }
967 }
968 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969}
970
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000971static long
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972symtable_lookup(struct symtable *st, PyObject *name)
973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 PyObject *o;
975 PyObject *mangled = _Py_Mangle(st->st_private, name);
976 if (!mangled)
977 return 0;
978 o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
979 Py_DECREF(mangled);
980 if (!o)
981 return 0;
982 return PyLong_AsLong(o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983}
984
985static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700986symtable_add_def_helper(struct symtable *st, PyObject *name, int flag, struct _symtable_entry *ste)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 PyObject *o;
989 PyObject *dict;
990 long val;
991 PyObject *mangled = _Py_Mangle(st->st_private, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Jeremy Hylton81e95022007-02-27 06:50:52 +0000993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 if (!mangled)
995 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700996 dict = ste->ste_symbols;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200997 if ((o = PyDict_GetItemWithError(dict, mangled))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 val = PyLong_AS_LONG(o);
999 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
1000 /* Is it better to use 'mangled' or 'name' here? */
1001 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, name);
Victor Stinner14e461d2013-08-26 22:28:21 +02001002 PyErr_SyntaxLocationObject(st->st_filename,
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001003 ste->ste_lineno,
1004 ste->ste_col_offset + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 goto error;
1006 }
1007 val |= flag;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001008 }
1009 else if (PyErr_Occurred()) {
1010 goto error;
1011 }
1012 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 val = flag;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001014 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 o = PyLong_FromLong(val);
1016 if (o == NULL)
1017 goto error;
1018 if (PyDict_SetItem(dict, mangled, o) < 0) {
1019 Py_DECREF(o);
1020 goto error;
1021 }
1022 Py_DECREF(o);
1023
1024 if (flag & DEF_PARAM) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001025 if (PyList_Append(ste->ste_varnames, mangled) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 goto error;
1027 } else if (flag & DEF_GLOBAL) {
1028 /* XXX need to update DEF_GLOBAL for other flags too;
1029 perhaps only DEF_FREE_GLOBAL */
1030 val = flag;
1031 if ((o = PyDict_GetItem(st->st_global, mangled))) {
1032 val |= PyLong_AS_LONG(o);
1033 }
1034 o = PyLong_FromLong(val);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035 if (o == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 goto error;
1037 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
1038 Py_DECREF(o);
1039 goto error;
1040 }
1041 Py_DECREF(o);
1042 }
1043 Py_DECREF(mangled);
1044 return 1;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001045
1046error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 Py_DECREF(mangled);
1048 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049}
1050
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001051static int
1052symtable_add_def(struct symtable *st, PyObject *name, int flag) {
1053 return symtable_add_def_helper(st, name, flag, st->st_cur);
1054}
1055
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
1057 They use the ASDL name to synthesize the name of the C type and the visit
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 function.
1059
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
1061 useful if the first node in the sequence requires special treatment.
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001062
1063 VISIT_QUIT macro returns the specified value exiting from the function but
1064 first adjusts current recursion counter depth.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065*/
1066
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001067#define VISIT_QUIT(ST, X) \
1068 return --(ST)->recursion_depth,(X)
1069
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070#define VISIT(ST, TYPE, V) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 if (!symtable_visit_ ## TYPE((ST), (V))) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001072 VISIT_QUIT((ST), 0);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001073
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074#define VISIT_SEQ(ST, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 int i; \
1076 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1077 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
1078 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1079 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001080 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001083
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 int i; \
1086 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1087 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
1088 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1089 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001090 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001093
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001094#define VISIT_SEQ_WITH_NULL(ST, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 int i = 0; \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001096 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001098 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 if (!elt) continue; /* can be NULL */ \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001100 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001101 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 } \
Guido van Rossum4f72a782006-10-27 23:31:49 +00001103}
1104
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001106symtable_record_directive(struct symtable *st, identifier name, int lineno, int col_offset)
Benjamin Petersond9c87022012-10-31 20:26:20 -04001107{
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -06001108 PyObject *data, *mangled;
Benjamin Petersond9c87022012-10-31 20:26:20 -04001109 int res;
1110 if (!st->st_cur->ste_directives) {
1111 st->st_cur->ste_directives = PyList_New(0);
1112 if (!st->st_cur->ste_directives)
1113 return 0;
1114 }
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -06001115 mangled = _Py_Mangle(st->st_private, name);
1116 if (!mangled)
1117 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001118 data = Py_BuildValue("(Nii)", mangled, lineno, col_offset);
Benjamin Petersond9c87022012-10-31 20:26:20 -04001119 if (!data)
1120 return 0;
1121 res = PyList_Append(st->st_cur->ste_directives, data);
1122 Py_DECREF(data);
1123 return res == 0;
1124}
1125
1126
1127static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128symtable_visit_stmt(struct symtable *st, stmt_ty s)
1129{
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001130 if (++st->recursion_depth > st->recursion_limit) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04001131 PyErr_SetString(PyExc_RecursionError,
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001132 "maximum recursion depth exceeded during compilation");
1133 VISIT_QUIT(st, 0);
1134 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 switch (s->kind) {
1136 case FunctionDef_kind:
1137 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001138 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 if (s->v.FunctionDef.args->defaults)
1140 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
1141 if (s->v.FunctionDef.args->kw_defaults)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001142 VISIT_SEQ_WITH_NULL(st, expr, s->v.FunctionDef.args->kw_defaults);
Yury Selivanov75445082015-05-11 22:57:16 -04001143 if (!symtable_visit_annotations(st, s, s->v.FunctionDef.args,
1144 s->v.FunctionDef.returns))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001145 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 if (s->v.FunctionDef.decorator_list)
1147 VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
1148 if (!symtable_enter_block(st, s->v.FunctionDef.name,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001149 FunctionBlock, (void *)s, s->lineno,
1150 s->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001151 VISIT_QUIT(st, 0);
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001152 VISIT(st, arguments, s->v.FunctionDef.args);
1153 VISIT_SEQ(st, stmt, s->v.FunctionDef.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 if (!symtable_exit_block(st, s))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001155 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 break;
1157 case ClassDef_kind: {
1158 PyObject *tmp;
1159 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001160 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
1162 VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 if (s->v.ClassDef.decorator_list)
1164 VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
1165 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001166 (void *)s, s->lineno, s->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001167 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 tmp = st->st_private;
1169 st->st_private = s->v.ClassDef.name;
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001170 VISIT_SEQ(st, stmt, s->v.ClassDef.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 st->st_private = tmp;
1172 if (!symtable_exit_block(st, s))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001173 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 break;
1175 }
1176 case Return_kind:
1177 if (s->v.Return.value) {
1178 VISIT(st, expr, s->v.Return.value);
1179 st->st_cur->ste_returns_value = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 }
1181 break;
1182 case Delete_kind:
1183 VISIT_SEQ(st, expr, s->v.Delete.targets);
1184 break;
1185 case Assign_kind:
1186 VISIT_SEQ(st, expr, s->v.Assign.targets);
1187 VISIT(st, expr, s->v.Assign.value);
1188 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001189 case AnnAssign_kind:
1190 if (s->v.AnnAssign.target->kind == Name_kind) {
1191 expr_ty e_name = s->v.AnnAssign.target;
1192 long cur = symtable_lookup(st, e_name->v.Name.id);
1193 if (cur < 0) {
1194 VISIT_QUIT(st, 0);
1195 }
1196 if ((cur & (DEF_GLOBAL | DEF_NONLOCAL))
Pablo Galindode2aea02018-10-14 18:01:03 +01001197 && (st->st_cur->ste_symbols != st->st_global)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001198 && s->v.AnnAssign.simple) {
1199 PyErr_Format(PyExc_SyntaxError,
Guido van Rossum6cff8742016-09-09 09:36:26 -07001200 cur & DEF_GLOBAL ? GLOBAL_ANNOT : NONLOCAL_ANNOT,
1201 e_name->v.Name.id);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001202 PyErr_SyntaxLocationObject(st->st_filename,
1203 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001204 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001205 VISIT_QUIT(st, 0);
1206 }
1207 if (s->v.AnnAssign.simple &&
1208 !symtable_add_def(st, e_name->v.Name.id,
1209 DEF_ANNOT | DEF_LOCAL)) {
1210 VISIT_QUIT(st, 0);
1211 }
1212 else {
1213 if (s->v.AnnAssign.value
1214 && !symtable_add_def(st, e_name->v.Name.id, DEF_LOCAL)) {
1215 VISIT_QUIT(st, 0);
1216 }
1217 }
1218 }
1219 else {
1220 VISIT(st, expr, s->v.AnnAssign.target);
1221 }
1222 VISIT(st, expr, s->v.AnnAssign.annotation);
1223 if (s->v.AnnAssign.value) {
1224 VISIT(st, expr, s->v.AnnAssign.value);
1225 }
1226 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 case AugAssign_kind:
1228 VISIT(st, expr, s->v.AugAssign.target);
1229 VISIT(st, expr, s->v.AugAssign.value);
1230 break;
1231 case For_kind:
1232 VISIT(st, expr, s->v.For.target);
1233 VISIT(st, expr, s->v.For.iter);
1234 VISIT_SEQ(st, stmt, s->v.For.body);
1235 if (s->v.For.orelse)
1236 VISIT_SEQ(st, stmt, s->v.For.orelse);
1237 break;
1238 case While_kind:
1239 VISIT(st, expr, s->v.While.test);
1240 VISIT_SEQ(st, stmt, s->v.While.body);
1241 if (s->v.While.orelse)
1242 VISIT_SEQ(st, stmt, s->v.While.orelse);
1243 break;
1244 case If_kind:
1245 /* XXX if 0: and lookup_yield() hacks */
1246 VISIT(st, expr, s->v.If.test);
1247 VISIT_SEQ(st, stmt, s->v.If.body);
1248 if (s->v.If.orelse)
1249 VISIT_SEQ(st, stmt, s->v.If.orelse);
1250 break;
1251 case Raise_kind:
1252 if (s->v.Raise.exc) {
1253 VISIT(st, expr, s->v.Raise.exc);
Eli Benderskydd97fbb2011-04-10 07:37:26 +03001254 if (s->v.Raise.cause) {
1255 VISIT(st, expr, s->v.Raise.cause);
1256 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 }
1258 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001259 case Try_kind:
1260 VISIT_SEQ(st, stmt, s->v.Try.body);
1261 VISIT_SEQ(st, stmt, s->v.Try.orelse);
1262 VISIT_SEQ(st, excepthandler, s->v.Try.handlers);
1263 VISIT_SEQ(st, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 break;
1265 case Assert_kind:
1266 VISIT(st, expr, s->v.Assert.test);
1267 if (s->v.Assert.msg)
1268 VISIT(st, expr, s->v.Assert.msg);
1269 break;
1270 case Import_kind:
1271 VISIT_SEQ(st, alias, s->v.Import.names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 break;
1273 case ImportFrom_kind:
1274 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 break;
1276 case Global_kind: {
1277 int i;
1278 asdl_seq *seq = s->v.Global.names;
1279 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1280 identifier name = (identifier)asdl_seq_GET(seq, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 long cur = symtable_lookup(st, name);
1282 if (cur < 0)
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001283 VISIT_QUIT(st, 0);
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001284 if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT)) {
1285 const char* msg;
1286 if (cur & DEF_PARAM) {
1287 msg = GLOBAL_PARAM;
1288 } else if (cur & USE) {
Guido van Rossum6cff8742016-09-09 09:36:26 -07001289 msg = GLOBAL_AFTER_USE;
Christian Heimes517507c2016-09-23 20:26:30 +02001290 } else if (cur & DEF_ANNOT) {
1291 msg = GLOBAL_ANNOT;
1292 } else { /* DEF_LOCAL */
1293 msg = GLOBAL_AFTER_ASSIGN;
Guido van Rossum6cff8742016-09-09 09:36:26 -07001294 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001295 PyErr_Format(PyExc_SyntaxError,
Guido van Rossum6cff8742016-09-09 09:36:26 -07001296 msg, name);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001297 PyErr_SyntaxLocationObject(st->st_filename,
1298 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001299 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001300 VISIT_QUIT(st, 0);
1301 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 if (!symtable_add_def(st, name, DEF_GLOBAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001303 VISIT_QUIT(st, 0);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001304 if (!symtable_record_directive(st, name, s->lineno, s->col_offset))
Nick Coghlane69bfc32012-11-04 23:53:15 +10001305 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 }
1307 break;
1308 }
1309 case Nonlocal_kind: {
1310 int i;
1311 asdl_seq *seq = s->v.Nonlocal.names;
1312 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1313 identifier name = (identifier)asdl_seq_GET(seq, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 long cur = symtable_lookup(st, name);
1315 if (cur < 0)
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001316 VISIT_QUIT(st, 0);
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001317 if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT)) {
1318 const char* msg;
1319 if (cur & DEF_PARAM) {
1320 msg = NONLOCAL_PARAM;
1321 } else if (cur & USE) {
Guido van Rossum6cff8742016-09-09 09:36:26 -07001322 msg = NONLOCAL_AFTER_USE;
Christian Heimes517507c2016-09-23 20:26:30 +02001323 } else if (cur & DEF_ANNOT) {
1324 msg = NONLOCAL_ANNOT;
1325 } else { /* DEF_LOCAL */
1326 msg = NONLOCAL_AFTER_ASSIGN;
Guido van Rossum6cff8742016-09-09 09:36:26 -07001327 }
1328 PyErr_Format(PyExc_SyntaxError, msg, name);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001329 PyErr_SyntaxLocationObject(st->st_filename,
1330 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001331 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001332 VISIT_QUIT(st, 0);
1333 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 if (!symtable_add_def(st, name, DEF_NONLOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001335 VISIT_QUIT(st, 0);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001336 if (!symtable_record_directive(st, name, s->lineno, s->col_offset))
Nick Coghlane69bfc32012-11-04 23:53:15 +10001337 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 }
1339 break;
1340 }
1341 case Expr_kind:
1342 VISIT(st, expr, s->v.Expr.value);
1343 break;
1344 case Pass_kind:
1345 case Break_kind:
1346 case Continue_kind:
1347 /* nothing to do here */
1348 break;
1349 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001350 VISIT_SEQ(st, withitem, s->v.With.items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 VISIT_SEQ(st, stmt, s->v.With.body);
1352 break;
Yury Selivanov75445082015-05-11 22:57:16 -04001353 case AsyncFunctionDef_kind:
1354 if (!symtable_add_def(st, s->v.AsyncFunctionDef.name, DEF_LOCAL))
1355 VISIT_QUIT(st, 0);
1356 if (s->v.AsyncFunctionDef.args->defaults)
1357 VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.args->defaults);
1358 if (s->v.AsyncFunctionDef.args->kw_defaults)
1359 VISIT_SEQ_WITH_NULL(st, expr,
1360 s->v.AsyncFunctionDef.args->kw_defaults);
1361 if (!symtable_visit_annotations(st, s, s->v.AsyncFunctionDef.args,
1362 s->v.AsyncFunctionDef.returns))
1363 VISIT_QUIT(st, 0);
1364 if (s->v.AsyncFunctionDef.decorator_list)
1365 VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.decorator_list);
1366 if (!symtable_enter_block(st, s->v.AsyncFunctionDef.name,
1367 FunctionBlock, (void *)s, s->lineno,
1368 s->col_offset))
1369 VISIT_QUIT(st, 0);
Yury Selivanoveb636452016-09-08 22:01:51 -07001370 st->st_cur->ste_coroutine = 1;
Yury Selivanov75445082015-05-11 22:57:16 -04001371 VISIT(st, arguments, s->v.AsyncFunctionDef.args);
1372 VISIT_SEQ(st, stmt, s->v.AsyncFunctionDef.body);
1373 if (!symtable_exit_block(st, s))
1374 VISIT_QUIT(st, 0);
1375 break;
1376 case AsyncWith_kind:
1377 VISIT_SEQ(st, withitem, s->v.AsyncWith.items);
1378 VISIT_SEQ(st, stmt, s->v.AsyncWith.body);
1379 break;
1380 case AsyncFor_kind:
1381 VISIT(st, expr, s->v.AsyncFor.target);
1382 VISIT(st, expr, s->v.AsyncFor.iter);
1383 VISIT_SEQ(st, stmt, s->v.AsyncFor.body);
1384 if (s->v.AsyncFor.orelse)
1385 VISIT_SEQ(st, stmt, s->v.AsyncFor.orelse);
1386 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 }
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001388 VISIT_QUIT(st, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389}
1390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001392symtable_extend_namedexpr_scope(struct symtable *st, expr_ty e)
1393{
1394 assert(st->st_stack);
1395
1396 Py_ssize_t i, size;
1397 struct _symtable_entry *ste;
1398 size = PyList_GET_SIZE(st->st_stack);
1399 assert(size);
1400
1401 /* Iterate over the stack in reverse and add to the nearest adequate scope */
1402 for (i = size - 1; i >= 0; i--) {
1403 ste = (struct _symtable_entry *) PyList_GET_ITEM(st->st_stack, i);
1404
1405 /* If our current entry is a comprehension, skip it */
1406 if (ste->ste_comprehension) {
1407 continue;
1408 }
1409
1410 /* If we find a FunctionBlock entry, add as NONLOCAL/LOCAL */
1411 if (ste->ste_type == FunctionBlock) {
1412 if (!symtable_add_def(st, e->v.Name.id, DEF_NONLOCAL))
1413 VISIT_QUIT(st, 0);
1414 if (!symtable_record_directive(st, e->v.Name.id, e->lineno, e->col_offset))
1415 VISIT_QUIT(st, 0);
1416
1417 return symtable_add_def_helper(st, e->v.Name.id, DEF_LOCAL, ste);
1418 }
1419 /* If we find a ModuleBlock entry, add as GLOBAL */
1420 if (ste->ste_type == ModuleBlock) {
1421 if (!symtable_add_def(st, e->v.Name.id, DEF_GLOBAL))
1422 VISIT_QUIT(st, 0);
1423 if (!symtable_record_directive(st, e->v.Name.id, e->lineno, e->col_offset))
1424 VISIT_QUIT(st, 0);
1425
1426 return symtable_add_def_helper(st, e->v.Name.id, DEF_GLOBAL, ste);
1427 }
1428 /* Disallow usage in ClassBlock */
1429 if (ste->ste_type == ClassBlock) {
1430 PyErr_Format(PyExc_TargetScopeError, NAMED_EXPR_COMP_IN_CLASS, e->v.Name.id);
1431 PyErr_SyntaxLocationObject(st->st_filename,
1432 e->lineno,
1433 e->col_offset);
1434 VISIT_QUIT(st, 0);
1435 }
1436 }
1437
1438 /* We should always find either a FunctionBlock, ModuleBlock or ClassBlock
1439 and should never fall to this case
1440 */
1441 assert(0);
1442 return 0;
1443}
1444
1445static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446symtable_visit_expr(struct symtable *st, expr_ty e)
1447{
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001448 if (++st->recursion_depth > st->recursion_limit) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04001449 PyErr_SetString(PyExc_RecursionError,
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001450 "maximum recursion depth exceeded during compilation");
1451 VISIT_QUIT(st, 0);
1452 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001454 case NamedExpr_kind:
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02001455 if (st->st_cur->ste_comprehension) {
1456 if (!symtable_extend_namedexpr_scope(st, e->v.NamedExpr.target))
1457 VISIT_QUIT(st, 0);
1458 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001459 VISIT(st, expr, e->v.NamedExpr.value);
1460 VISIT(st, expr, e->v.NamedExpr.target);
1461 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 case BoolOp_kind:
1463 VISIT_SEQ(st, expr, e->v.BoolOp.values);
1464 break;
1465 case BinOp_kind:
1466 VISIT(st, expr, e->v.BinOp.left);
1467 VISIT(st, expr, e->v.BinOp.right);
1468 break;
1469 case UnaryOp_kind:
1470 VISIT(st, expr, e->v.UnaryOp.operand);
1471 break;
1472 case Lambda_kind: {
1473 if (!GET_IDENTIFIER(lambda))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001474 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 if (e->v.Lambda.args->defaults)
1476 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
Amaury Forgeot d'Arc97c1bef2011-11-04 22:17:45 +01001477 if (e->v.Lambda.args->kw_defaults)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001478 VISIT_SEQ_WITH_NULL(st, expr, e->v.Lambda.args->kw_defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 if (!symtable_enter_block(st, lambda,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001480 FunctionBlock, (void *)e, e->lineno,
1481 e->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001482 VISIT_QUIT(st, 0);
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001483 VISIT(st, arguments, e->v.Lambda.args);
1484 VISIT(st, expr, e->v.Lambda.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 if (!symtable_exit_block(st, (void *)e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001486 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 break;
1488 }
1489 case IfExp_kind:
1490 VISIT(st, expr, e->v.IfExp.test);
1491 VISIT(st, expr, e->v.IfExp.body);
1492 VISIT(st, expr, e->v.IfExp.orelse);
1493 break;
1494 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001495 VISIT_SEQ_WITH_NULL(st, expr, e->v.Dict.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 VISIT_SEQ(st, expr, e->v.Dict.values);
1497 break;
1498 case Set_kind:
1499 VISIT_SEQ(st, expr, e->v.Set.elts);
1500 break;
1501 case GeneratorExp_kind:
1502 if (!symtable_visit_genexp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001503 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 break;
1505 case ListComp_kind:
1506 if (!symtable_visit_listcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001507 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 break;
1509 case SetComp_kind:
1510 if (!symtable_visit_setcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001511 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 break;
1513 case DictComp_kind:
1514 if (!symtable_visit_dictcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001515 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 break;
1517 case Yield_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +00001518 if (e->v.Yield.value)
1519 VISIT(st, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 st->st_cur->ste_generator = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00001522 case YieldFrom_kind:
1523 VISIT(st, expr, e->v.YieldFrom.value);
1524 st->st_cur->ste_generator = 1;
1525 break;
Yury Selivanov75445082015-05-11 22:57:16 -04001526 case Await_kind:
1527 VISIT(st, expr, e->v.Await.value);
Yury Selivanoveb636452016-09-08 22:01:51 -07001528 st->st_cur->ste_coroutine = 1;
Yury Selivanov75445082015-05-11 22:57:16 -04001529 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 case Compare_kind:
1531 VISIT(st, expr, e->v.Compare.left);
1532 VISIT_SEQ(st, expr, e->v.Compare.comparators);
1533 break;
1534 case Call_kind:
1535 VISIT(st, expr, e->v.Call.func);
1536 VISIT_SEQ(st, expr, e->v.Call.args);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001537 VISIT_SEQ_WITH_NULL(st, keyword, e->v.Call.keywords);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04001539 case FormattedValue_kind:
1540 VISIT(st, expr, e->v.FormattedValue.value);
1541 if (e->v.FormattedValue.format_spec)
1542 VISIT(st, expr, e->v.FormattedValue.format_spec);
1543 break;
1544 case JoinedStr_kind:
1545 VISIT_SEQ(st, expr, e->v.JoinedStr.values);
1546 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001547 case Constant_kind:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 /* Nothing to do here. */
1549 break;
1550 /* The following exprs can be assignment targets. */
1551 case Attribute_kind:
1552 VISIT(st, expr, e->v.Attribute.value);
1553 break;
1554 case Subscript_kind:
1555 VISIT(st, expr, e->v.Subscript.value);
1556 VISIT(st, slice, e->v.Subscript.slice);
1557 break;
1558 case Starred_kind:
1559 VISIT(st, expr, e->v.Starred.value);
1560 break;
1561 case Name_kind:
1562 if (!symtable_add_def(st, e->v.Name.id,
1563 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001564 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 /* Special-case super: it counts as a use of __class__ */
1566 if (e->v.Name.ctx == Load &&
1567 st->st_cur->ste_type == FunctionBlock &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001568 _PyUnicode_EqualToASCIIString(e->v.Name.id, "super")) {
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10001569 if (!GET_IDENTIFIER(__class__) ||
1570 !symtable_add_def(st, __class__, USE))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001571 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 }
1573 break;
1574 /* child nodes of List and Tuple will have expr_context set */
1575 case List_kind:
1576 VISIT_SEQ(st, expr, e->v.List.elts);
1577 break;
1578 case Tuple_kind:
1579 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1580 break;
1581 }
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001582 VISIT_QUIT(st, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583}
1584
1585static int
1586symtable_implicit_arg(struct symtable *st, int pos)
1587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 PyObject *id = PyUnicode_FromFormat(".%d", pos);
1589 if (id == NULL)
1590 return 0;
1591 if (!symtable_add_def(st, id, DEF_PARAM)) {
1592 Py_DECREF(id);
1593 return 0;
1594 }
1595 Py_DECREF(id);
1596 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001597}
1598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599static int
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001600symtable_visit_params(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 int i;
Neal Norwitzc1505362006-12-28 06:47:50 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 if (!args)
1605 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 for (i = 0; i < asdl_seq_LEN(args); i++) {
1608 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1609 if (!symtable_add_def(st, arg->arg, DEF_PARAM))
1610 return 0;
1611 }
1612
1613 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001614}
1615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616static int
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001617symtable_visit_argannotations(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 int i;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 if (!args)
1622 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 for (i = 0; i < asdl_seq_LEN(args); i++) {
1625 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1626 if (arg->annotation)
1627 VISIT(st, expr, arg->annotation);
1628 }
1629
1630 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001631}
1632
Neal Norwitzc1505362006-12-28 06:47:50 +00001633static int
Yury Selivanov75445082015-05-11 22:57:16 -04001634symtable_visit_annotations(struct symtable *st, stmt_ty s,
1635 arguments_ty a, expr_ty returns)
Neal Norwitzc1505362006-12-28 06:47:50 +00001636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 if (a->args && !symtable_visit_argannotations(st, a->args))
1638 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001639 if (a->vararg && a->vararg->annotation)
1640 VISIT(st, expr, a->vararg->annotation);
1641 if (a->kwarg && a->kwarg->annotation)
1642 VISIT(st, expr, a->kwarg->annotation);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 if (a->kwonlyargs && !symtable_visit_argannotations(st, a->kwonlyargs))
1644 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001645 if (returns)
Yury Selivanovb7666a32015-07-22 14:48:57 +03001646 VISIT(st, expr, returns);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648}
1649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001651symtable_visit_arguments(struct symtable *st, arguments_ty a)
1652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 /* skip default arguments inside function block
1654 XXX should ast be different?
1655 */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001656 if (a->posonlyargs && !symtable_visit_params(st, a->posonlyargs))
1657 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 if (a->args && !symtable_visit_params(st, a->args))
1659 return 0;
1660 if (a->kwonlyargs && !symtable_visit_params(st, a->kwonlyargs))
1661 return 0;
1662 if (a->vararg) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001663 if (!symtable_add_def(st, a->vararg->arg, DEF_PARAM))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 return 0;
1665 st->st_cur->ste_varargs = 1;
1666 }
1667 if (a->kwarg) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001668 if (!symtable_add_def(st, a->kwarg->arg, DEF_PARAM))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 return 0;
1670 st->st_cur->ste_varkeywords = 1;
1671 }
1672 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673}
1674
1675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 if (eh->v.ExceptHandler.type)
1680 VISIT(st, expr, eh->v.ExceptHandler.type);
1681 if (eh->v.ExceptHandler.name)
1682 if (!symtable_add_def(st, eh->v.ExceptHandler.name, DEF_LOCAL))
1683 return 0;
1684 VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
1685 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686}
1687
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001688static int
1689symtable_visit_withitem(struct symtable *st, withitem_ty item)
1690{
1691 VISIT(st, expr, item->context_expr);
1692 if (item->optional_vars) {
1693 VISIT(st, expr, item->optional_vars);
1694 }
1695 return 1;
1696}
1697
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700symtable_visit_alias(struct symtable *st, alias_ty a)
1701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 /* Compute store_name, the name actually bound by the import
Benjamin Petersonc629d512010-06-11 21:53:07 +00001703 operation. It is different than a->name when a->name is a
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 dotted package name (e.g. spam.eggs)
1705 */
1706 PyObject *store_name;
1707 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001708 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
1709 PyUnicode_GET_LENGTH(name), 1);
1710 if (dot != -1) {
1711 store_name = PyUnicode_Substring(name, 0, dot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 if (!store_name)
1713 return 0;
1714 }
1715 else {
1716 store_name = name;
1717 Py_INCREF(store_name);
1718 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001719 if (!_PyUnicode_EqualToASCIIString(name, "*")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1721 Py_DECREF(store_name);
1722 return r;
1723 }
1724 else {
1725 if (st->st_cur->ste_type != ModuleBlock) {
Benjamin Petersonb7149ca2011-06-20 22:09:13 -05001726 int lineno = st->st_cur->ste_lineno;
1727 int col_offset = st->st_cur->ste_col_offset;
1728 PyErr_SetString(PyExc_SyntaxError, IMPORT_STAR_WARNING);
Ammar Askar025eb982018-09-24 17:12:49 -04001729 PyErr_SyntaxLocationObject(st->st_filename, lineno, col_offset + 1);
Benjamin Petersonb7149ca2011-06-20 22:09:13 -05001730 Py_DECREF(store_name);
1731 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 Py_DECREF(store_name);
1734 return 1;
1735 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736}
1737
1738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 VISIT(st, expr, lc->target);
1743 VISIT(st, expr, lc->iter);
1744 VISIT_SEQ(st, expr, lc->ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001745 if (lc->is_async) {
1746 st->st_cur->ste_coroutine = 1;
1747 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749}
1750
1751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753symtable_visit_keyword(struct symtable *st, keyword_ty k)
1754{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 VISIT(st, expr, k->value);
1756 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757}
1758
1759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001761symtable_visit_slice(struct symtable *st, slice_ty s)
1762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 switch (s->kind) {
1764 case Slice_kind:
1765 if (s->v.Slice.lower)
1766 VISIT(st, expr, s->v.Slice.lower)
1767 if (s->v.Slice.upper)
1768 VISIT(st, expr, s->v.Slice.upper)
1769 if (s->v.Slice.step)
1770 VISIT(st, expr, s->v.Slice.step)
1771 break;
1772 case ExtSlice_kind:
1773 VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
1774 break;
1775 case Index_kind:
1776 VISIT(st, expr, s->v.Index.value)
1777 break;
1778 }
1779 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780}
1781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001783symtable_handle_comprehension(struct symtable *st, expr_ty e,
Guido van Rossum992d4a32007-07-11 13:09:30 +00001784 identifier scope_name, asdl_seq *generators,
1785 expr_ty elt, expr_ty value)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 int is_generator = (e->kind == GeneratorExp_kind);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 comprehension_ty outermost = ((comprehension_ty)
1789 asdl_seq_GET(generators, 0));
1790 /* Outermost iterator is evaluated in current scope */
1791 VISIT(st, expr, outermost->iter);
1792 /* Create comprehension scope for the rest */
1793 if (!scope_name ||
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001794 !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e,
1795 e->lineno, e->col_offset)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 return 0;
1797 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001798 if (outermost->is_async) {
1799 st->st_cur->ste_coroutine = 1;
1800 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001801 st->st_cur->ste_comprehension = 1;
1802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 /* Outermost iter is received as an argument */
1804 if (!symtable_implicit_arg(st, 0)) {
1805 symtable_exit_block(st, (void *)e);
1806 return 0;
1807 }
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001808 VISIT(st, expr, outermost->target);
1809 VISIT_SEQ(st, expr, outermost->ifs);
1810 VISIT_SEQ_TAIL(st, comprehension, generators, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 if (value)
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001812 VISIT(st, expr, value);
1813 VISIT(st, expr, elt);
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001814 if (st->st_cur->ste_generator) {
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001815 PyErr_SetString(PyExc_SyntaxError,
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001816 (e->kind == ListComp_kind) ? "'yield' inside list comprehension" :
1817 (e->kind == SetComp_kind) ? "'yield' inside set comprehension" :
1818 (e->kind == DictComp_kind) ? "'yield' inside dict comprehension" :
1819 "'yield' inside generator expression");
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001820 PyErr_SyntaxLocationObject(st->st_filename,
1821 st->st_cur->ste_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001822 st->st_cur->ste_col_offset + 1);
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001823 symtable_exit_block(st, (void *)e);
1824 return 0;
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001825 }
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001826 st->st_cur->ste_generator = is_generator;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 return symtable_exit_block(st, (void *)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828}
Nick Coghlan650f0d02007-04-15 12:05:43 +00001829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001831symtable_visit_genexp(struct symtable *st, expr_ty e)
1832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
1834 e->v.GeneratorExp.generators,
1835 e->v.GeneratorExp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001836}
1837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001839symtable_visit_listcomp(struct symtable *st, expr_ty e)
1840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(listcomp),
1842 e->v.ListComp.generators,
1843 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001844}
1845
1846static int
1847symtable_visit_setcomp(struct symtable *st, expr_ty e)
1848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
1850 e->v.SetComp.generators,
1851 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001852}
1853
1854static int
1855symtable_visit_dictcomp(struct symtable *st, expr_ty e)
1856{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp),
1858 e->v.DictComp.generators,
1859 e->v.DictComp.key,
1860 e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001861}