blob: f2453db69dd7dd07addab8abc18d9314f1f95db2 [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 \
Nick Coghlan6ca03072019-08-26 00:41:47 +100035"assignment expression within a comprehension cannot be used in a class body"
36
37#define NAMED_EXPR_COMP_CONFLICT \
38"assignment expression cannot rebind comprehension iteration variable '%U'"
39
40#define NAMED_EXPR_COMP_INNER_LOOP_CONFLICT \
41"comprehension inner loop cannot rebind assignment expression target '%U'"
42
43#define NAMED_EXPR_COMP_ITER_EXPR \
44"assignment expression cannot be used in a comprehension iterable expression"
Emily Morehouse8f59ee02019-01-24 16:49:56 -070045
Neal Norwitz090b3dd2006-02-28 22:36:46 +000046static PySTEntryObject *
Benjamin Peterson55e00f22008-08-17 18:02:44 +000047ste_new(struct symtable *st, identifier name, _Py_block_ty block,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000048 void *key, int lineno, int col_offset)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 PySTEntryObject *ste = NULL;
Christian Heimes837e53a2012-09-10 03:08:46 +020051 PyObject *k = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 k = PyLong_FromVoidPtr(key);
54 if (k == NULL)
55 goto fail;
56 ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
Christian Heimes55ad6512012-09-12 17:58:10 +020057 if (ste == NULL) {
58 Py_DECREF(k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 goto fail;
Christian Heimes55ad6512012-09-12 17:58:10 +020060 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 ste->ste_table = st;
Christian Heimes15265822012-09-12 17:52:46 +020062 ste->ste_id = k; /* ste owns reference to k */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 Py_INCREF(name);
Victor Stinner9a4fb662013-07-11 22:49:00 +020065 ste->ste_name = name;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 ste->ste_symbols = NULL;
68 ste->ste_varnames = NULL;
69 ste->ste_children = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000070
Benjamin Petersond9c87022012-10-31 20:26:20 -040071 ste->ste_directives = NULL;
72
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 ste->ste_type = block;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 ste->ste_nested = 0;
75 ste->ste_free = 0;
76 ste->ste_varargs = 0;
77 ste->ste_varkeywords = 0;
78 ste->ste_opt_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000079 ste->ste_opt_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 ste->ste_lineno = lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000081 ste->ste_col_offset = col_offset;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 if (st->st_cur != NULL &&
84 (st->st_cur->ste_nested ||
85 st->st_cur->ste_type == FunctionBlock))
86 ste->ste_nested = 1;
87 ste->ste_child_free = 0;
88 ste->ste_generator = 0;
Yury Selivanoveb636452016-09-08 22:01:51 -070089 ste->ste_coroutine = 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -070090 ste->ste_comprehension = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 ste->ste_returns_value = 0;
Benjamin Peterson312595c2013-05-15 15:26:42 -050092 ste->ste_needs_class_closure = 0;
Nick Coghlan6ca03072019-08-26 00:41:47 +100093 ste->ste_comp_iter_target = 0;
94 ste->ste_comp_iter_expr = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000095
Victor Stinner9a4fb662013-07-11 22:49:00 +020096 ste->ste_symbols = PyDict_New();
97 ste->ste_varnames = PyList_New(0);
98 ste->ste_children = PyList_New(0);
99 if (ste->ste_symbols == NULL
100 || ste->ste_varnames == NULL
101 || ste->ste_children == NULL)
102 goto fail;
103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0)
105 goto fail;
106
107 return ste;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000108 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 Py_XDECREF(ste);
110 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000111}
112
113static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114ste_repr(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 return PyUnicode_FromFormat("<symtable entry %U(%ld), line %d>",
117 ste->ste_name,
118 PyLong_AS_LONG(ste->ste_id), ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000119}
120
121static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000122ste_dealloc(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 ste->ste_table = NULL;
125 Py_XDECREF(ste->ste_id);
126 Py_XDECREF(ste->ste_name);
127 Py_XDECREF(ste->ste_symbols);
128 Py_XDECREF(ste->ste_varnames);
129 Py_XDECREF(ste->ste_children);
Benjamin Petersond9c87022012-10-31 20:26:20 -0400130 Py_XDECREF(ste->ste_directives);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 PyObject_Del(ste);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000132}
133
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000134#define OFF(x) offsetof(PySTEntryObject, x)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000135
Guido van Rossum6f799372001-09-20 20:46:19 +0000136static PyMemberDef ste_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 {"id", T_OBJECT, OFF(ste_id), READONLY},
138 {"name", T_OBJECT, OFF(ste_name), READONLY},
139 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
140 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
141 {"children", T_OBJECT, OFF(ste_children), READONLY},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 {"nested", T_INT, OFF(ste_nested), READONLY},
143 {"type", T_INT, OFF(ste_type), READONLY},
144 {"lineno", T_INT, OFF(ste_lineno), READONLY},
145 {NULL}
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000146};
147
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000148PyTypeObject PySTEntry_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 PyVarObject_HEAD_INIT(&PyType_Type, 0)
150 "symtable entry",
151 sizeof(PySTEntryObject),
152 0,
153 (destructor)ste_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200154 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 0, /* tp_getattr */
156 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200157 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 (reprfunc)ste_repr, /* tp_repr */
159 0, /* tp_as_number */
160 0, /* tp_as_sequence */
161 0, /* tp_as_mapping */
162 0, /* tp_hash */
163 0, /* tp_call */
164 0, /* tp_str */
165 PyObject_GenericGetAttr, /* tp_getattro */
166 0, /* tp_setattro */
167 0, /* tp_as_buffer */
168 Py_TPFLAGS_DEFAULT, /* tp_flags */
169 0, /* tp_doc */
170 0, /* tp_traverse */
171 0, /* tp_clear */
172 0, /* tp_richcompare */
173 0, /* tp_weaklistoffset */
174 0, /* tp_iter */
175 0, /* tp_iternext */
176 0, /* tp_methods */
177 ste_memberlist, /* tp_members */
178 0, /* tp_getset */
179 0, /* tp_base */
180 0, /* tp_dict */
181 0, /* tp_descr_get */
182 0, /* tp_descr_set */
183 0, /* tp_dictoffset */
184 0, /* tp_init */
185 0, /* tp_alloc */
186 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000187};
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188
189static int symtable_analyze(struct symtable *st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190static int symtable_enter_block(struct symtable *st, identifier name,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000191 _Py_block_ty block, void *ast, int lineno,
192 int col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000193static int symtable_exit_block(struct symtable *st, void *ast);
194static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
195static int symtable_visit_expr(struct symtable *st, expr_ty s);
196static int symtable_visit_genexp(struct symtable *st, expr_ty s);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000197static int symtable_visit_listcomp(struct symtable *st, expr_ty s);
198static int symtable_visit_setcomp(struct symtable *st, expr_ty s);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000199static int symtable_visit_dictcomp(struct symtable *st, expr_ty s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200static int symtable_visit_arguments(struct symtable *st, arguments_ty);
201static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
202static int symtable_visit_alias(struct symtable *st, alias_ty);
203static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
204static int symtable_visit_keyword(struct symtable *st, keyword_ty);
205static int symtable_visit_slice(struct symtable *st, slice_ty);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000206static int symtable_visit_params(struct symtable *st, asdl_seq *args);
207static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208static int symtable_implicit_arg(struct symtable *st, int pos);
Yury Selivanov75445082015-05-11 22:57:16 -0400209static int symtable_visit_annotations(struct symtable *st, stmt_ty s, arguments_ty, expr_ty);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500210static int symtable_visit_withitem(struct symtable *st, withitem_ty item);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211
212
Nick Coghlan650f0d02007-04-15 12:05:43 +0000213static identifier top = NULL, lambda = NULL, genexpr = NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 listcomp = NULL, setcomp = NULL, dictcomp = NULL,
Benjamin Petersone8e14592013-05-16 14:37:25 -0500215 __class__ = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216
217#define GET_IDENTIFIER(VAR) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000219
220#define DUPLICATE_ARGUMENT \
Neal Norwitza5d16a32007-08-24 22:53:58 +0000221"duplicate argument '%U' in function definition"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222
223static struct symtable *
224symtable_new(void)
225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 struct symtable *st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
Zackery Spytzad65f152018-11-16 08:58:55 -0700229 if (st == NULL) {
230 PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 return NULL;
Zackery Spytzad65f152018-11-16 08:58:55 -0700232 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 st->st_filename = NULL;
235 st->st_blocks = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 if ((st->st_stack = PyList_New(0)) == NULL)
238 goto fail;
239 if ((st->st_blocks = PyDict_New()) == NULL)
240 goto fail;
241 st->st_cur = NULL;
242 st->st_private = NULL;
243 return st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 PySymtable_Free(st);
246 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000247}
248
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000249/* When compiling the use of C stack is probably going to be a lot
250 lighter than when executing Python code but still can overflow
251 and causing a Python crash if not checked (e.g. eval("()"*300000)).
252 Using the current recursion limit for the compiler seems too
253 restrictive (it caused at least one test to fail) so a factor is
254 used to allow deeper recursion when compiling an expression.
255
256 Using a scaling factor means this should automatically adjust when
257 the recursion limit is adjusted for small or large C stack allocations.
258*/
259#define COMPILER_STACK_FRAME_SCALE 3
260
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261struct symtable *
Victor Stinner14e461d2013-08-26 22:28:21 +0200262PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000263{
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000264 struct symtable *st = symtable_new();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 asdl_seq *seq;
266 int i;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000267 PyThreadState *tstate;
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400268 int recursion_limit = Py_GetRecursionLimit();
Miss Islington (bot)384c6d72019-08-29 06:46:20 -0700269 int starting_recursion_depth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 if (st == NULL)
Victor Stinner14e461d2013-08-26 22:28:21 +0200272 return NULL;
273 if (filename == NULL) {
274 PySymtable_Free(st);
275 return NULL;
276 }
277 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 st->st_filename = filename;
279 st->st_future = future;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000280
281 /* Setup recursion depth check counters */
Victor Stinner50b48572018-11-01 01:51:40 +0100282 tstate = _PyThreadState_GET();
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000283 if (!tstate) {
284 PySymtable_Free(st);
285 return NULL;
286 }
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400287 /* Be careful here to prevent overflow. */
Miss Islington (bot)384c6d72019-08-29 06:46:20 -0700288 starting_recursion_depth = (tstate->recursion_depth < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400289 tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE : tstate->recursion_depth;
Miss Islington (bot)384c6d72019-08-29 06:46:20 -0700290 st->recursion_depth = starting_recursion_depth;
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400291 st->recursion_limit = (recursion_limit < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
292 recursion_limit * COMPILER_STACK_FRAME_SCALE : recursion_limit;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 /* Make the initial symbol information gathering pass */
295 if (!GET_IDENTIFIER(top) ||
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000296 !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 PySymtable_Free(st);
298 return NULL;
299 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 st->st_top = st->st_cur;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 switch (mod->kind) {
303 case Module_kind:
304 seq = mod->v.Module.body;
305 for (i = 0; i < asdl_seq_LEN(seq); i++)
306 if (!symtable_visit_stmt(st,
307 (stmt_ty)asdl_seq_GET(seq, i)))
308 goto error;
309 break;
310 case Expression_kind:
311 if (!symtable_visit_expr(st, mod->v.Expression.body))
312 goto error;
313 break;
314 case Interactive_kind:
315 seq = mod->v.Interactive.body;
316 for (i = 0; i < asdl_seq_LEN(seq); i++)
317 if (!symtable_visit_stmt(st,
318 (stmt_ty)asdl_seq_GET(seq, i)))
319 goto error;
320 break;
321 case Suite_kind:
322 PyErr_SetString(PyExc_RuntimeError,
323 "this compiler does not handle Suites");
324 goto error;
Guido van Rossum522346d2019-02-11 11:34:50 -0800325 case FunctionType_kind:
326 PyErr_SetString(PyExc_RuntimeError,
327 "this compiler does not handle FunctionTypes");
328 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 }
330 if (!symtable_exit_block(st, (void *)mod)) {
331 PySymtable_Free(st);
332 return NULL;
333 }
Miss Islington (bot)384c6d72019-08-29 06:46:20 -0700334 /* Check that the recursion depth counting balanced correctly */
335 if (st->recursion_depth != starting_recursion_depth) {
336 PyErr_Format(PyExc_SystemError,
337 "symtable analysis recursion depth mismatch (before=%d, after=%d)",
338 starting_recursion_depth, st->recursion_depth);
339 PySymtable_Free(st);
340 return NULL;
341 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 /* Make the second symbol analysis pass */
343 if (symtable_analyze(st))
344 return st;
345 PySymtable_Free(st);
346 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 (void) symtable_exit_block(st, (void *)mod);
349 PySymtable_Free(st);
350 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000351}
352
Victor Stinner14e461d2013-08-26 22:28:21 +0200353struct symtable *
354PySymtable_Build(mod_ty mod, const char *filename_str, PyFutureFeatures *future)
355{
356 PyObject *filename;
357 struct symtable *st;
358 filename = PyUnicode_DecodeFSDefault(filename_str);
359 if (filename == NULL)
360 return NULL;
361 st = PySymtable_BuildObject(mod, filename, future);
362 Py_DECREF(filename);
363 return st;
364}
365
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000366void
367PySymtable_Free(struct symtable *st)
368{
Victor Stinner14e461d2013-08-26 22:28:21 +0200369 Py_XDECREF(st->st_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 Py_XDECREF(st->st_blocks);
371 Py_XDECREF(st->st_stack);
372 PyMem_Free((void *)st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000373}
374
375PySTEntryObject *
376PySymtable_Lookup(struct symtable *st, void *key)
377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 PyObject *k, *v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 k = PyLong_FromVoidPtr(key);
381 if (k == NULL)
382 return NULL;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200383 v = PyDict_GetItemWithError(st->st_blocks, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 if (v) {
385 assert(PySTEntry_Check(v));
386 Py_INCREF(v);
387 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200388 else if (!PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 PyErr_SetString(PyExc_KeyError,
390 "unknown symbol table entry");
391 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 Py_DECREF(k);
394 return (PySTEntryObject *)v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000395}
396
Nick Coghlan6ca03072019-08-26 00:41:47 +1000397static long
398_PyST_GetSymbol(PySTEntryObject *ste, PyObject *name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000399{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
401 if (!v)
402 return 0;
403 assert(PyLong_Check(v));
Nick Coghlan6ca03072019-08-26 00:41:47 +1000404 return PyLong_AS_LONG(v);
405}
406
407int
408PyST_GetScope(PySTEntryObject *ste, PyObject *name)
409{
410 long symbol = _PyST_GetSymbol(ste, name);
411 return (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412}
413
Benjamin Petersond9c87022012-10-31 20:26:20 -0400414static int
415error_at_directive(PySTEntryObject *ste, PyObject *name)
416{
417 Py_ssize_t i;
418 PyObject *data;
419 assert(ste->ste_directives);
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600420 for (i = 0; i < PyList_GET_SIZE(ste->ste_directives); i++) {
Benjamin Petersond9c87022012-10-31 20:26:20 -0400421 data = PyList_GET_ITEM(ste->ste_directives, i);
422 assert(PyTuple_CheckExact(data));
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600423 assert(PyUnicode_CheckExact(PyTuple_GET_ITEM(data, 0)));
424 if (PyUnicode_Compare(PyTuple_GET_ITEM(data, 0), name) == 0) {
425 PyErr_SyntaxLocationObject(ste->ste_table->st_filename,
426 PyLong_AsLong(PyTuple_GET_ITEM(data, 1)),
Ammar Askar025eb982018-09-24 17:12:49 -0400427 PyLong_AsLong(PyTuple_GET_ITEM(data, 2)) + 1);
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600428
429 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -0700430 }
Benjamin Petersond9c87022012-10-31 20:26:20 -0400431 }
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600432 PyErr_SetString(PyExc_RuntimeError,
433 "BUG: internal directive bookkeeping broken");
Benjamin Petersond9c87022012-10-31 20:26:20 -0400434 return 0;
435}
436
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000437
438/* Analyze raw symbol information to determine scope of each name.
439
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000440 The next several functions are helpers for symtable_analyze(),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 which determines whether a name is local, global, or free. In addition,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000442 it determines which local variables are cell variables; they provide
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 bindings that are used for free variables in enclosed blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 There are also two kinds of global variables, implicit and explicit. An
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000446 explicit global is declared with the global statement. An implicit
447 global is a free variable for which the compiler has found no binding
448 in an enclosing function scope. The implicit global is either a global
449 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
450 to handle these names to implement slightly odd semantics. In such a
451 block, the name is treated as global until it is assigned to; then it
452 is treated as a local.
453
454 The symbol table requires two passes to determine the scope of each name.
Nick Coghlan650f0d02007-04-15 12:05:43 +0000455 The first pass collects raw facts from the AST via the symtable_visit_*
456 functions: the name is a parameter here, the name is used but not defined
457 here, etc. The second pass analyzes these facts during a pass over the
458 PySTEntryObjects created during pass 1.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000459
460 When a function is entered during the second pass, the parent passes
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 the set of all name bindings visible to its children. These bindings
Nick Coghlan650f0d02007-04-15 12:05:43 +0000462 are used to determine if non-local variables are free or implicit globals.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000463 Names which are explicitly declared nonlocal must exist in this set of
464 visible names - if they do not, a syntax error is raised. After doing
465 the local analysis, it analyzes each of its child blocks using an
466 updated set of name bindings.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467
Nick Coghlan650f0d02007-04-15 12:05:43 +0000468 The children update the free variable set. If a local variable is added to
469 the free variable set by the child, the variable is marked as a cell. The
470 function object being defined must provide runtime storage for the variable
471 that may outlive the function's frame. Cell variables are removed from the
472 free set before the analyze function returns to its parent.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000473
Nick Coghlan650f0d02007-04-15 12:05:43 +0000474 During analysis, the names are:
475 symbols: dict mapping from symbol names to flag values (including offset scope values)
476 scopes: dict mapping from symbol names to scope values (no offset)
477 local: set of all symbol names local to the current scope
478 bound: set of all symbol names local to a containing function scope
479 free: set of all symbol names referenced but not bound in child scopes
480 global: set of all symbol names explicitly declared as global
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000481*/
482
483#define SET_SCOPE(DICT, NAME, I) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 PyObject *o = PyLong_FromLong(I); \
485 if (!o) \
486 return 0; \
487 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
488 Py_DECREF(o); \
489 return 0; \
490 } \
491 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000492}
493
494/* Decide on scope of name, given flags.
495
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000496 The namespace dictionaries may be modified to record information
497 about the new name. For example, a new global will add an entry to
498 global. A name that was global can be changed to local.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499*/
500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000502analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 PyObject *bound, PyObject *local, PyObject *free,
504 PyObject *global)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 if (flags & DEF_GLOBAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 if (flags & DEF_NONLOCAL) {
508 PyErr_Format(PyExc_SyntaxError,
509 "name '%U' is nonlocal and global",
510 name);
Benjamin Petersond9c87022012-10-31 20:26:20 -0400511 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 }
513 SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
514 if (PySet_Add(global, name) < 0)
515 return 0;
516 if (bound && (PySet_Discard(bound, name) < 0))
517 return 0;
518 return 1;
519 }
520 if (flags & DEF_NONLOCAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 if (!bound) {
522 PyErr_Format(PyExc_SyntaxError,
523 "nonlocal declaration not allowed at module level");
Benjamin Petersond9c87022012-10-31 20:26:20 -0400524 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 }
526 if (!PySet_Contains(bound, name)) {
527 PyErr_Format(PyExc_SyntaxError,
528 "no binding for nonlocal '%U' found",
529 name);
530
Benjamin Petersond9c87022012-10-31 20:26:20 -0400531 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 }
533 SET_SCOPE(scopes, name, FREE);
534 ste->ste_free = 1;
535 return PySet_Add(free, name) >= 0;
536 }
537 if (flags & DEF_BOUND) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +0000538 SET_SCOPE(scopes, name, LOCAL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 if (PySet_Add(local, name) < 0)
540 return 0;
541 if (PySet_Discard(global, name) < 0)
542 return 0;
543 return 1;
544 }
545 /* If an enclosing block has a binding for this name, it
546 is a free variable rather than a global variable.
547 Note that having a non-NULL bound implies that the block
548 is nested.
549 */
550 if (bound && PySet_Contains(bound, name)) {
551 SET_SCOPE(scopes, name, FREE);
552 ste->ste_free = 1;
553 return PySet_Add(free, name) >= 0;
554 }
555 /* If a parent has a global statement, then call it global
556 explicit? It could also be global implicit.
557 */
558 if (global && PySet_Contains(global, name)) {
559 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
560 return 1;
561 }
562 if (ste->ste_nested)
563 ste->ste_free = 1;
564 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
565 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566}
567
568#undef SET_SCOPE
569
570/* If a name is defined in free and also in locals, then this block
571 provides the binding for the free variable. The name should be
572 marked CELL in this block and removed from the free list.
573
574 Note that the current block's free variables are included in free.
575 That's safe because no name can be free and local in the same scope.
576*/
577
578static int
Benjamin Peterson312595c2013-05-15 15:26:42 -0500579analyze_cells(PyObject *scopes, PyObject *free)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 PyObject *name, *v, *v_cell;
582 int success = 0;
583 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 v_cell = PyLong_FromLong(CELL);
586 if (!v_cell)
587 return 0;
588 while (PyDict_Next(scopes, &pos, &name, &v)) {
589 long scope;
590 assert(PyLong_Check(v));
591 scope = PyLong_AS_LONG(v);
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +0000592 if (scope != LOCAL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 continue;
594 if (!PySet_Contains(free, name))
595 continue;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 /* Replace LOCAL with CELL for this name, and remove
597 from free. It is safe to replace the value of name
598 in the dict, because it will not cause a resize.
599 */
600 if (PyDict_SetItem(scopes, name, v_cell) < 0)
601 goto error;
602 if (PySet_Discard(free, name) < 0)
603 goto error;
604 }
605 success = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 Py_DECREF(v_cell);
608 return success;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609}
610
Benjamin Peterson312595c2013-05-15 15:26:42 -0500611static int
612drop_class_free(PySTEntryObject *ste, PyObject *free)
613{
614 int res;
615 if (!GET_IDENTIFIER(__class__))
616 return 0;
617 res = PySet_Discard(free, __class__);
618 if (res < 0)
619 return 0;
620 if (res)
621 ste->ste_needs_class_closure = 1;
622 return 1;
623}
624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625/* Enter the final scope information into the ste_symbols dict.
626 *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627 * All arguments are dicts. Modifies symbols, others are read-only.
628*/
629static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630update_symbols(PyObject *symbols, PyObject *scopes,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000631 PyObject *bound, PyObject *free, int classflag)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 PyObject *name = NULL, *itr = NULL;
634 PyObject *v = NULL, *v_scope = NULL, *v_new = NULL, *v_free = NULL;
635 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 /* Update scope information for all symbols in this scope */
638 while (PyDict_Next(symbols, &pos, &name, &v)) {
639 long scope, flags;
640 assert(PyLong_Check(v));
641 flags = PyLong_AS_LONG(v);
642 v_scope = PyDict_GetItem(scopes, name);
643 assert(v_scope && PyLong_Check(v_scope));
644 scope = PyLong_AS_LONG(v_scope);
645 flags |= (scope << SCOPE_OFFSET);
646 v_new = PyLong_FromLong(flags);
647 if (!v_new)
648 return 0;
649 if (PyDict_SetItem(symbols, name, v_new) < 0) {
650 Py_DECREF(v_new);
651 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000652 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_DECREF(v_new);
654 }
655
656 /* Record not yet resolved free variables from children (if any) */
657 v_free = PyLong_FromLong(FREE << SCOPE_OFFSET);
658 if (!v_free)
659 return 0;
660
661 itr = PyObject_GetIter(free);
Zackery Spytzfc439d22018-10-10 23:05:35 -0600662 if (itr == NULL) {
663 Py_DECREF(v_free);
664 return 0;
665 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666
667 while ((name = PyIter_Next(itr))) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200668 v = PyDict_GetItemWithError(symbols, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669
670 /* Handle symbol that already exists in this scope */
671 if (v) {
672 /* Handle a free variable in a method of
673 the class that has the same name as a local
674 or global in the class scope.
675 */
676 if (classflag &&
677 PyLong_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) {
678 long flags = PyLong_AS_LONG(v) | DEF_FREE_CLASS;
679 v_new = PyLong_FromLong(flags);
680 if (!v_new) {
681 goto error;
682 }
683 if (PyDict_SetItem(symbols, name, v_new) < 0) {
684 Py_DECREF(v_new);
685 goto error;
686 }
687 Py_DECREF(v_new);
688 }
689 /* It's a cell, or already free in this scope */
690 Py_DECREF(name);
691 continue;
692 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200693 else if (PyErr_Occurred()) {
694 goto error;
695 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 /* Handle global symbol */
Christian Heimes45af0c82016-09-09 00:22:28 +0200697 if (bound && !PySet_Contains(bound, name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 Py_DECREF(name);
699 continue; /* it's a global */
700 }
701 /* Propagate new free symbol up the lexical stack */
702 if (PyDict_SetItem(symbols, name, v_free) < 0) {
703 goto error;
704 }
705 Py_DECREF(name);
706 }
707 Py_DECREF(itr);
708 Py_DECREF(v_free);
709 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000710error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 Py_XDECREF(v_free);
712 Py_XDECREF(itr);
713 Py_XDECREF(name);
714 return 0;
715}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716
717/* Make final symbol table decisions for block of ste.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000718
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000719 Arguments:
720 ste -- current symtable entry (input/output)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000721 bound -- set of variables bound in enclosing scopes (input). bound
722 is NULL for module blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 free -- set of free variables in enclosed scopes (output)
724 globals -- set of declared global variables in enclosing scopes (input)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000725
726 The implementation uses two mutually recursive functions,
727 analyze_block() and analyze_child_block(). analyze_block() is
728 responsible for analyzing the individual names defined in a block.
729 analyze_child_block() prepares temporary namespace dictionaries
730 used to evaluated nested blocks.
731
732 The two functions exist because a child block should see the name
733 bindings of its enclosing blocks, but those bindings should not
734 propagate back to a parent block.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735*/
736
737static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
739 PyObject *global, PyObject* child_free);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000740
741static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
743 PyObject *global)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 PyObject *name, *v, *local = NULL, *scopes = NULL, *newbound = NULL;
746 PyObject *newglobal = NULL, *newfree = NULL, *allfree = NULL;
747 PyObject *temp;
748 int i, success = 0;
749 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 local = PySet_New(NULL); /* collect new names bound in block */
752 if (!local)
753 goto error;
754 scopes = PyDict_New(); /* collect scopes defined for each name */
755 if (!scopes)
756 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 /* Allocate new global and bound variable dictionaries. These
759 dictionaries hold the names visible in nested blocks. For
760 ClassBlocks, the bound and global names are initialized
761 before analyzing names, because class bindings aren't
762 visible in methods. For other blocks, they are initialized
763 after names are analyzed.
764 */
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 /* TODO(jhylton): Package these dicts in a struct so that we
767 can write reasonable helper functions?
768 */
769 newglobal = PySet_New(NULL);
770 if (!newglobal)
771 goto error;
772 newfree = PySet_New(NULL);
773 if (!newfree)
774 goto error;
775 newbound = PySet_New(NULL);
776 if (!newbound)
777 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 /* Class namespace has no effect on names visible in
780 nested functions, so populate the global and bound
781 sets to be passed to child blocks before analyzing
782 this one.
783 */
784 if (ste->ste_type == ClassBlock) {
785 /* Pass down known globals */
786 temp = PyNumber_InPlaceOr(newglobal, global);
787 if (!temp)
788 goto error;
789 Py_DECREF(temp);
790 /* Pass down previously bound symbols */
791 if (bound) {
792 temp = PyNumber_InPlaceOr(newbound, bound);
793 if (!temp)
794 goto error;
795 Py_DECREF(temp);
796 }
797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
800 long flags = PyLong_AS_LONG(v);
801 if (!analyze_name(ste, scopes, name, flags,
802 bound, local, free, global))
803 goto error;
804 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 /* Populate global and bound sets to be passed to children. */
807 if (ste->ste_type != ClassBlock) {
808 /* Add function locals to bound set */
809 if (ste->ste_type == FunctionBlock) {
810 temp = PyNumber_InPlaceOr(newbound, local);
811 if (!temp)
812 goto error;
813 Py_DECREF(temp);
814 }
815 /* Pass down previously bound symbols */
816 if (bound) {
817 temp = PyNumber_InPlaceOr(newbound, bound);
818 if (!temp)
819 goto error;
820 Py_DECREF(temp);
821 }
822 /* Pass down known globals */
823 temp = PyNumber_InPlaceOr(newglobal, global);
824 if (!temp)
825 goto error;
826 Py_DECREF(temp);
827 }
828 else {
829 /* Special-case __class__ */
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000830 if (!GET_IDENTIFIER(__class__))
831 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 if (PySet_Add(newbound, __class__) < 0)
833 goto error;
834 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835
Eli Benderskydd97fbb2011-04-10 07:37:26 +0300836 /* Recursively call analyze_child_block() on each child block.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 newbound, newglobal now contain the names visible in
839 nested blocks. The free variables in the children will
840 be collected in allfree.
841 */
842 allfree = PySet_New(NULL);
843 if (!allfree)
844 goto error;
845 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
846 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
847 PySTEntryObject* entry;
848 assert(c && PySTEntry_Check(c));
849 entry = (PySTEntryObject*)c;
850 if (!analyze_child_block(entry, newbound, newfree, newglobal,
851 allfree))
852 goto error;
853 /* Check if any children have free variables */
854 if (entry->ste_free || entry->ste_child_free)
855 ste->ste_child_free = 1;
856 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 temp = PyNumber_InPlaceOr(newfree, allfree);
859 if (!temp)
860 goto error;
861 Py_DECREF(temp);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 /* Check if any local variables must be converted to cell variables */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500864 if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 goto error;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500866 else if (ste->ste_type == ClassBlock && !drop_class_free(ste, newfree))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 goto error;
868 /* Records the results of the analysis in the symbol table entry */
869 if (!update_symbols(ste->ste_symbols, scopes, bound, newfree,
870 ste->ste_type == ClassBlock))
871 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 temp = PyNumber_InPlaceOr(free, newfree);
874 if (!temp)
875 goto error;
876 Py_DECREF(temp);
877 success = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000878 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 Py_XDECREF(scopes);
880 Py_XDECREF(local);
881 Py_XDECREF(newbound);
882 Py_XDECREF(newglobal);
883 Py_XDECREF(newfree);
884 Py_XDECREF(allfree);
885 if (!success)
886 assert(PyErr_Occurred());
887 return success;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888}
889
890static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
892 PyObject *global, PyObject* child_free)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
895 PyObject *temp;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 /* Copy the bound and global dictionaries.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000898
Martin Panter3ee62702016-06-04 04:57:19 +0000899 These dictionaries are used by all blocks enclosed by the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 current block. The analyze_block() call modifies these
901 dictionaries.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 */
904 temp_bound = PySet_New(bound);
905 if (!temp_bound)
906 goto error;
907 temp_free = PySet_New(free);
908 if (!temp_free)
909 goto error;
910 temp_global = PySet_New(global);
911 if (!temp_global)
912 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 if (!analyze_block(entry, temp_bound, temp_free, temp_global))
915 goto error;
916 temp = PyNumber_InPlaceOr(child_free, temp_free);
917 if (!temp)
918 goto error;
919 Py_DECREF(temp);
920 Py_DECREF(temp_bound);
921 Py_DECREF(temp_free);
922 Py_DECREF(temp_global);
923 return 1;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000924 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 Py_XDECREF(temp_bound);
926 Py_XDECREF(temp_free);
927 Py_XDECREF(temp_global);
928 return 0;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000929}
930
931static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932symtable_analyze(struct symtable *st)
933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 PyObject *free, *global;
935 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 free = PySet_New(NULL);
938 if (!free)
939 return 0;
940 global = PySet_New(NULL);
941 if (!global) {
942 Py_DECREF(free);
943 return 0;
944 }
945 r = analyze_block(st->st_top, NULL, free, global);
946 Py_DECREF(free);
947 Py_DECREF(global);
948 return r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949}
950
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000951/* symtable_enter_block() gets a reference via ste_new.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000952 This reference is released when the block is exited, via the DECREF
953 in symtable_exit_block().
954*/
955
956static int
957symtable_exit_block(struct symtable *st, void *ast)
958{
Benjamin Peterson609da582011-06-29 22:52:39 -0500959 Py_ssize_t size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960
Benjamin Peterson609da582011-06-29 22:52:39 -0500961 st->st_cur = NULL;
962 size = PyList_GET_SIZE(st->st_stack);
963 if (size) {
Benjamin Peterson609da582011-06-29 22:52:39 -0500964 if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 return 0;
Benjamin Peterson9d872e12011-07-02 09:22:13 -0500966 if (--size)
967 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, size - 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 }
969 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970}
971
972static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000974 void *ast, int lineno, int col_offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975{
Benjamin Peterson609da582011-06-29 22:52:39 -0500976 PySTEntryObject *prev = NULL, *ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977
Benjamin Peterson609da582011-06-29 22:52:39 -0500978 ste = ste_new(st, name, block, ast, lineno, col_offset);
979 if (ste == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 return 0;
Benjamin Peterson609da582011-06-29 22:52:39 -0500981 if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) {
982 Py_DECREF(ste);
983 return 0;
984 }
985 prev = st->st_cur;
Nick Coghlan6ca03072019-08-26 00:41:47 +1000986 /* bpo-37757: For now, disallow *all* assignment expressions in the
987 * outermost iterator expression of a comprehension, even those inside
988 * a nested comprehension or a lambda expression.
989 */
990 if (prev) {
991 ste->ste_comp_iter_expr = prev->ste_comp_iter_expr;
992 }
Benjamin Peterson609da582011-06-29 22:52:39 -0500993 /* The entry is owned by the stack. Borrow it for st_cur. */
994 Py_DECREF(ste);
995 st->st_cur = ste;
Benjamin Peterson230b2062010-10-16 03:45:45 +0000996 if (block == ModuleBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 st->st_global = st->st_cur->ste_symbols;
998 if (prev) {
Benjamin Peterson609da582011-06-29 22:52:39 -0500999 if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 return 0;
1001 }
1002 }
1003 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004}
1005
Neal Norwitz46b7bda2006-01-08 01:06:06 +00001006static long
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007symtable_lookup(struct symtable *st, PyObject *name)
1008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 PyObject *mangled = _Py_Mangle(st->st_private, name);
1010 if (!mangled)
1011 return 0;
Miss Islington (bot)ed8af332019-08-26 08:49:44 -07001012 long ret = _PyST_GetSymbol(st->st_cur, mangled);
1013 Py_DECREF(mangled);
1014 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015}
1016
1017static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001018symtable_add_def_helper(struct symtable *st, PyObject *name, int flag, struct _symtable_entry *ste)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 PyObject *o;
1021 PyObject *dict;
1022 long val;
1023 PyObject *mangled = _Py_Mangle(st->st_private, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024
Jeremy Hylton81e95022007-02-27 06:50:52 +00001025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 if (!mangled)
1027 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001028 dict = ste->ste_symbols;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001029 if ((o = PyDict_GetItemWithError(dict, mangled))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 val = PyLong_AS_LONG(o);
1031 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
1032 /* Is it better to use 'mangled' or 'name' here? */
1033 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, name);
Victor Stinner14e461d2013-08-26 22:28:21 +02001034 PyErr_SyntaxLocationObject(st->st_filename,
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001035 ste->ste_lineno,
1036 ste->ste_col_offset + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 goto error;
1038 }
1039 val |= flag;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001040 }
1041 else if (PyErr_Occurred()) {
1042 goto error;
1043 }
1044 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 val = flag;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001046 }
Nick Coghlan6ca03072019-08-26 00:41:47 +10001047 if (ste->ste_comp_iter_target) {
1048 /* This name is an iteration variable in a comprehension,
1049 * so check for a binding conflict with any named expressions.
1050 * Otherwise, mark it as an iteration variable so subsequent
1051 * named expressions can check for conflicts.
1052 */
1053 if (val & (DEF_GLOBAL | DEF_NONLOCAL)) {
1054 PyErr_Format(PyExc_SyntaxError,
1055 NAMED_EXPR_COMP_INNER_LOOP_CONFLICT, name);
1056 PyErr_SyntaxLocationObject(st->st_filename,
1057 ste->ste_lineno,
1058 ste->ste_col_offset + 1);
1059 goto error;
1060 }
1061 val |= DEF_COMP_ITER;
1062 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 o = PyLong_FromLong(val);
1064 if (o == NULL)
1065 goto error;
1066 if (PyDict_SetItem(dict, mangled, o) < 0) {
1067 Py_DECREF(o);
1068 goto error;
1069 }
1070 Py_DECREF(o);
1071
1072 if (flag & DEF_PARAM) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001073 if (PyList_Append(ste->ste_varnames, mangled) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 goto error;
1075 } else if (flag & DEF_GLOBAL) {
1076 /* XXX need to update DEF_GLOBAL for other flags too;
1077 perhaps only DEF_FREE_GLOBAL */
1078 val = flag;
1079 if ((o = PyDict_GetItem(st->st_global, mangled))) {
1080 val |= PyLong_AS_LONG(o);
1081 }
1082 o = PyLong_FromLong(val);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 if (o == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 goto error;
1085 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
1086 Py_DECREF(o);
1087 goto error;
1088 }
1089 Py_DECREF(o);
1090 }
1091 Py_DECREF(mangled);
1092 return 1;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001093
1094error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 Py_DECREF(mangled);
1096 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097}
1098
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001099static int
1100symtable_add_def(struct symtable *st, PyObject *name, int flag) {
1101 return symtable_add_def_helper(st, name, flag, st->st_cur);
1102}
1103
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
1105 They use the ASDL name to synthesize the name of the C type and the visit
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 function.
1107
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
1109 useful if the first node in the sequence requires special treatment.
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001110
1111 VISIT_QUIT macro returns the specified value exiting from the function but
1112 first adjusts current recursion counter depth.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113*/
1114
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001115#define VISIT_QUIT(ST, X) \
1116 return --(ST)->recursion_depth,(X)
1117
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118#define VISIT(ST, TYPE, V) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 if (!symtable_visit_ ## TYPE((ST), (V))) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001120 VISIT_QUIT((ST), 0);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001121
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122#define VISIT_SEQ(ST, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 int i; \
1124 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1125 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
1126 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1127 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001128 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001131
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 int i; \
1134 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1135 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
1136 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1137 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001138 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001141
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001142#define VISIT_SEQ_WITH_NULL(ST, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 int i = 0; \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001144 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001146 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 if (!elt) continue; /* can be NULL */ \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001148 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001149 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 } \
Guido van Rossum4f72a782006-10-27 23:31:49 +00001151}
1152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001154symtable_record_directive(struct symtable *st, identifier name, int lineno, int col_offset)
Benjamin Petersond9c87022012-10-31 20:26:20 -04001155{
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -06001156 PyObject *data, *mangled;
Benjamin Petersond9c87022012-10-31 20:26:20 -04001157 int res;
1158 if (!st->st_cur->ste_directives) {
1159 st->st_cur->ste_directives = PyList_New(0);
1160 if (!st->st_cur->ste_directives)
1161 return 0;
1162 }
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -06001163 mangled = _Py_Mangle(st->st_private, name);
1164 if (!mangled)
1165 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001166 data = Py_BuildValue("(Nii)", mangled, lineno, col_offset);
Benjamin Petersond9c87022012-10-31 20:26:20 -04001167 if (!data)
1168 return 0;
1169 res = PyList_Append(st->st_cur->ste_directives, data);
1170 Py_DECREF(data);
1171 return res == 0;
1172}
1173
1174
1175static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176symtable_visit_stmt(struct symtable *st, stmt_ty s)
1177{
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001178 if (++st->recursion_depth > st->recursion_limit) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04001179 PyErr_SetString(PyExc_RecursionError,
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001180 "maximum recursion depth exceeded during compilation");
1181 VISIT_QUIT(st, 0);
1182 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 switch (s->kind) {
1184 case FunctionDef_kind:
1185 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001186 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 if (s->v.FunctionDef.args->defaults)
1188 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
1189 if (s->v.FunctionDef.args->kw_defaults)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001190 VISIT_SEQ_WITH_NULL(st, expr, s->v.FunctionDef.args->kw_defaults);
Yury Selivanov75445082015-05-11 22:57:16 -04001191 if (!symtable_visit_annotations(st, s, s->v.FunctionDef.args,
1192 s->v.FunctionDef.returns))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001193 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 if (s->v.FunctionDef.decorator_list)
1195 VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
1196 if (!symtable_enter_block(st, s->v.FunctionDef.name,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001197 FunctionBlock, (void *)s, s->lineno,
1198 s->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001199 VISIT_QUIT(st, 0);
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001200 VISIT(st, arguments, s->v.FunctionDef.args);
1201 VISIT_SEQ(st, stmt, s->v.FunctionDef.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 if (!symtable_exit_block(st, s))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001203 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 break;
1205 case ClassDef_kind: {
1206 PyObject *tmp;
1207 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001208 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
1210 VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 if (s->v.ClassDef.decorator_list)
1212 VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
1213 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001214 (void *)s, s->lineno, s->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001215 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 tmp = st->st_private;
1217 st->st_private = s->v.ClassDef.name;
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001218 VISIT_SEQ(st, stmt, s->v.ClassDef.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 st->st_private = tmp;
1220 if (!symtable_exit_block(st, s))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001221 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 break;
1223 }
1224 case Return_kind:
1225 if (s->v.Return.value) {
1226 VISIT(st, expr, s->v.Return.value);
1227 st->st_cur->ste_returns_value = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 }
1229 break;
1230 case Delete_kind:
1231 VISIT_SEQ(st, expr, s->v.Delete.targets);
1232 break;
1233 case Assign_kind:
1234 VISIT_SEQ(st, expr, s->v.Assign.targets);
1235 VISIT(st, expr, s->v.Assign.value);
1236 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001237 case AnnAssign_kind:
1238 if (s->v.AnnAssign.target->kind == Name_kind) {
1239 expr_ty e_name = s->v.AnnAssign.target;
1240 long cur = symtable_lookup(st, e_name->v.Name.id);
1241 if (cur < 0) {
1242 VISIT_QUIT(st, 0);
1243 }
1244 if ((cur & (DEF_GLOBAL | DEF_NONLOCAL))
Pablo Galindode2aea02018-10-14 18:01:03 +01001245 && (st->st_cur->ste_symbols != st->st_global)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001246 && s->v.AnnAssign.simple) {
1247 PyErr_Format(PyExc_SyntaxError,
Guido van Rossum6cff8742016-09-09 09:36:26 -07001248 cur & DEF_GLOBAL ? GLOBAL_ANNOT : NONLOCAL_ANNOT,
1249 e_name->v.Name.id);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001250 PyErr_SyntaxLocationObject(st->st_filename,
1251 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001252 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001253 VISIT_QUIT(st, 0);
1254 }
1255 if (s->v.AnnAssign.simple &&
1256 !symtable_add_def(st, e_name->v.Name.id,
1257 DEF_ANNOT | DEF_LOCAL)) {
1258 VISIT_QUIT(st, 0);
1259 }
1260 else {
1261 if (s->v.AnnAssign.value
1262 && !symtable_add_def(st, e_name->v.Name.id, DEF_LOCAL)) {
1263 VISIT_QUIT(st, 0);
1264 }
1265 }
1266 }
1267 else {
1268 VISIT(st, expr, s->v.AnnAssign.target);
1269 }
1270 VISIT(st, expr, s->v.AnnAssign.annotation);
1271 if (s->v.AnnAssign.value) {
1272 VISIT(st, expr, s->v.AnnAssign.value);
1273 }
1274 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 case AugAssign_kind:
1276 VISIT(st, expr, s->v.AugAssign.target);
1277 VISIT(st, expr, s->v.AugAssign.value);
1278 break;
1279 case For_kind:
1280 VISIT(st, expr, s->v.For.target);
1281 VISIT(st, expr, s->v.For.iter);
1282 VISIT_SEQ(st, stmt, s->v.For.body);
1283 if (s->v.For.orelse)
1284 VISIT_SEQ(st, stmt, s->v.For.orelse);
1285 break;
1286 case While_kind:
1287 VISIT(st, expr, s->v.While.test);
1288 VISIT_SEQ(st, stmt, s->v.While.body);
1289 if (s->v.While.orelse)
1290 VISIT_SEQ(st, stmt, s->v.While.orelse);
1291 break;
1292 case If_kind:
1293 /* XXX if 0: and lookup_yield() hacks */
1294 VISIT(st, expr, s->v.If.test);
1295 VISIT_SEQ(st, stmt, s->v.If.body);
1296 if (s->v.If.orelse)
1297 VISIT_SEQ(st, stmt, s->v.If.orelse);
1298 break;
1299 case Raise_kind:
1300 if (s->v.Raise.exc) {
1301 VISIT(st, expr, s->v.Raise.exc);
Eli Benderskydd97fbb2011-04-10 07:37:26 +03001302 if (s->v.Raise.cause) {
1303 VISIT(st, expr, s->v.Raise.cause);
1304 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 }
1306 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001307 case Try_kind:
1308 VISIT_SEQ(st, stmt, s->v.Try.body);
1309 VISIT_SEQ(st, stmt, s->v.Try.orelse);
1310 VISIT_SEQ(st, excepthandler, s->v.Try.handlers);
1311 VISIT_SEQ(st, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 break;
1313 case Assert_kind:
1314 VISIT(st, expr, s->v.Assert.test);
1315 if (s->v.Assert.msg)
1316 VISIT(st, expr, s->v.Assert.msg);
1317 break;
1318 case Import_kind:
1319 VISIT_SEQ(st, alias, s->v.Import.names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 break;
1321 case ImportFrom_kind:
1322 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 break;
1324 case Global_kind: {
1325 int i;
1326 asdl_seq *seq = s->v.Global.names;
1327 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1328 identifier name = (identifier)asdl_seq_GET(seq, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 long cur = symtable_lookup(st, name);
1330 if (cur < 0)
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001331 VISIT_QUIT(st, 0);
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001332 if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT)) {
1333 const char* msg;
1334 if (cur & DEF_PARAM) {
1335 msg = GLOBAL_PARAM;
1336 } else if (cur & USE) {
Guido van Rossum6cff8742016-09-09 09:36:26 -07001337 msg = GLOBAL_AFTER_USE;
Christian Heimes517507c2016-09-23 20:26:30 +02001338 } else if (cur & DEF_ANNOT) {
1339 msg = GLOBAL_ANNOT;
1340 } else { /* DEF_LOCAL */
1341 msg = GLOBAL_AFTER_ASSIGN;
Guido van Rossum6cff8742016-09-09 09:36:26 -07001342 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001343 PyErr_Format(PyExc_SyntaxError,
Guido van Rossum6cff8742016-09-09 09:36:26 -07001344 msg, name);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001345 PyErr_SyntaxLocationObject(st->st_filename,
1346 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001347 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001348 VISIT_QUIT(st, 0);
1349 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 if (!symtable_add_def(st, name, DEF_GLOBAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001351 VISIT_QUIT(st, 0);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001352 if (!symtable_record_directive(st, name, s->lineno, s->col_offset))
Nick Coghlane69bfc32012-11-04 23:53:15 +10001353 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 }
1355 break;
1356 }
1357 case Nonlocal_kind: {
1358 int i;
1359 asdl_seq *seq = s->v.Nonlocal.names;
1360 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1361 identifier name = (identifier)asdl_seq_GET(seq, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 long cur = symtable_lookup(st, name);
1363 if (cur < 0)
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001364 VISIT_QUIT(st, 0);
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001365 if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT)) {
1366 const char* msg;
1367 if (cur & DEF_PARAM) {
1368 msg = NONLOCAL_PARAM;
1369 } else if (cur & USE) {
Guido van Rossum6cff8742016-09-09 09:36:26 -07001370 msg = NONLOCAL_AFTER_USE;
Christian Heimes517507c2016-09-23 20:26:30 +02001371 } else if (cur & DEF_ANNOT) {
1372 msg = NONLOCAL_ANNOT;
1373 } else { /* DEF_LOCAL */
1374 msg = NONLOCAL_AFTER_ASSIGN;
Guido van Rossum6cff8742016-09-09 09:36:26 -07001375 }
1376 PyErr_Format(PyExc_SyntaxError, msg, name);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001377 PyErr_SyntaxLocationObject(st->st_filename,
1378 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001379 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001380 VISIT_QUIT(st, 0);
1381 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 if (!symtable_add_def(st, name, DEF_NONLOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001383 VISIT_QUIT(st, 0);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001384 if (!symtable_record_directive(st, name, s->lineno, s->col_offset))
Nick Coghlane69bfc32012-11-04 23:53:15 +10001385 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 }
1387 break;
1388 }
1389 case Expr_kind:
1390 VISIT(st, expr, s->v.Expr.value);
1391 break;
1392 case Pass_kind:
1393 case Break_kind:
1394 case Continue_kind:
1395 /* nothing to do here */
1396 break;
1397 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001398 VISIT_SEQ(st, withitem, s->v.With.items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 VISIT_SEQ(st, stmt, s->v.With.body);
1400 break;
Yury Selivanov75445082015-05-11 22:57:16 -04001401 case AsyncFunctionDef_kind:
1402 if (!symtable_add_def(st, s->v.AsyncFunctionDef.name, DEF_LOCAL))
1403 VISIT_QUIT(st, 0);
1404 if (s->v.AsyncFunctionDef.args->defaults)
1405 VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.args->defaults);
1406 if (s->v.AsyncFunctionDef.args->kw_defaults)
1407 VISIT_SEQ_WITH_NULL(st, expr,
1408 s->v.AsyncFunctionDef.args->kw_defaults);
1409 if (!symtable_visit_annotations(st, s, s->v.AsyncFunctionDef.args,
1410 s->v.AsyncFunctionDef.returns))
1411 VISIT_QUIT(st, 0);
1412 if (s->v.AsyncFunctionDef.decorator_list)
1413 VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.decorator_list);
1414 if (!symtable_enter_block(st, s->v.AsyncFunctionDef.name,
1415 FunctionBlock, (void *)s, s->lineno,
1416 s->col_offset))
1417 VISIT_QUIT(st, 0);
Yury Selivanoveb636452016-09-08 22:01:51 -07001418 st->st_cur->ste_coroutine = 1;
Yury Selivanov75445082015-05-11 22:57:16 -04001419 VISIT(st, arguments, s->v.AsyncFunctionDef.args);
1420 VISIT_SEQ(st, stmt, s->v.AsyncFunctionDef.body);
1421 if (!symtable_exit_block(st, s))
1422 VISIT_QUIT(st, 0);
1423 break;
1424 case AsyncWith_kind:
1425 VISIT_SEQ(st, withitem, s->v.AsyncWith.items);
1426 VISIT_SEQ(st, stmt, s->v.AsyncWith.body);
1427 break;
1428 case AsyncFor_kind:
1429 VISIT(st, expr, s->v.AsyncFor.target);
1430 VISIT(st, expr, s->v.AsyncFor.iter);
1431 VISIT_SEQ(st, stmt, s->v.AsyncFor.body);
1432 if (s->v.AsyncFor.orelse)
1433 VISIT_SEQ(st, stmt, s->v.AsyncFor.orelse);
1434 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 }
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001436 VISIT_QUIT(st, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437}
1438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001440symtable_extend_namedexpr_scope(struct symtable *st, expr_ty e)
1441{
1442 assert(st->st_stack);
Nick Coghlan6ca03072019-08-26 00:41:47 +10001443 assert(e->kind == Name_kind);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001444
Nick Coghlan6ca03072019-08-26 00:41:47 +10001445 PyObject *target_name = e->v.Name.id;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001446 Py_ssize_t i, size;
1447 struct _symtable_entry *ste;
1448 size = PyList_GET_SIZE(st->st_stack);
1449 assert(size);
1450
1451 /* Iterate over the stack in reverse and add to the nearest adequate scope */
1452 for (i = size - 1; i >= 0; i--) {
1453 ste = (struct _symtable_entry *) PyList_GET_ITEM(st->st_stack, i);
1454
Nick Coghlan6ca03072019-08-26 00:41:47 +10001455 /* If we find a comprehension scope, check for a target
1456 * binding conflict with iteration variables, otherwise skip it
1457 */
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001458 if (ste->ste_comprehension) {
Nick Coghlan6ca03072019-08-26 00:41:47 +10001459 long target_in_scope = _PyST_GetSymbol(ste, target_name);
1460 if (target_in_scope & DEF_COMP_ITER) {
1461 PyErr_Format(PyExc_SyntaxError, NAMED_EXPR_COMP_CONFLICT, target_name);
1462 PyErr_SyntaxLocationObject(st->st_filename,
1463 e->lineno,
1464 e->col_offset);
1465 VISIT_QUIT(st, 0);
1466 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001467 continue;
1468 }
1469
1470 /* If we find a FunctionBlock entry, add as NONLOCAL/LOCAL */
1471 if (ste->ste_type == FunctionBlock) {
Nick Coghlan6ca03072019-08-26 00:41:47 +10001472 if (!symtable_add_def(st, target_name, DEF_NONLOCAL))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001473 VISIT_QUIT(st, 0);
Nick Coghlan6ca03072019-08-26 00:41:47 +10001474 if (!symtable_record_directive(st, target_name, e->lineno, e->col_offset))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001475 VISIT_QUIT(st, 0);
1476
Nick Coghlan6ca03072019-08-26 00:41:47 +10001477 return symtable_add_def_helper(st, target_name, DEF_LOCAL, ste);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001478 }
1479 /* If we find a ModuleBlock entry, add as GLOBAL */
1480 if (ste->ste_type == ModuleBlock) {
Nick Coghlan6ca03072019-08-26 00:41:47 +10001481 if (!symtable_add_def(st, target_name, DEF_GLOBAL))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001482 VISIT_QUIT(st, 0);
Nick Coghlan6ca03072019-08-26 00:41:47 +10001483 if (!symtable_record_directive(st, target_name, e->lineno, e->col_offset))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001484 VISIT_QUIT(st, 0);
1485
Nick Coghlan6ca03072019-08-26 00:41:47 +10001486 return symtable_add_def_helper(st, target_name, DEF_GLOBAL, ste);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001487 }
1488 /* Disallow usage in ClassBlock */
1489 if (ste->ste_type == ClassBlock) {
Nick Coghlan6ca03072019-08-26 00:41:47 +10001490 PyErr_Format(PyExc_SyntaxError, NAMED_EXPR_COMP_IN_CLASS);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001491 PyErr_SyntaxLocationObject(st->st_filename,
1492 e->lineno,
1493 e->col_offset);
1494 VISIT_QUIT(st, 0);
1495 }
1496 }
1497
1498 /* We should always find either a FunctionBlock, ModuleBlock or ClassBlock
1499 and should never fall to this case
1500 */
1501 assert(0);
1502 return 0;
1503}
1504
1505static int
Nick Coghlan6ca03072019-08-26 00:41:47 +10001506symtable_handle_namedexpr(struct symtable *st, expr_ty e)
1507{
1508 if (st->st_cur->ste_comp_iter_expr > 0) {
1509 /* Assignment isn't allowed in a comprehension iterable expression */
1510 PyErr_Format(PyExc_SyntaxError, NAMED_EXPR_COMP_ITER_EXPR);
1511 PyErr_SyntaxLocationObject(st->st_filename,
1512 e->lineno,
1513 e->col_offset);
Miss Islington (bot)384c6d72019-08-29 06:46:20 -07001514 return 0;
Nick Coghlan6ca03072019-08-26 00:41:47 +10001515 }
1516 if (st->st_cur->ste_comprehension) {
1517 /* Inside a comprehension body, so find the right target scope */
1518 if (!symtable_extend_namedexpr_scope(st, e->v.NamedExpr.target))
Miss Islington (bot)384c6d72019-08-29 06:46:20 -07001519 return 0;
Nick Coghlan6ca03072019-08-26 00:41:47 +10001520 }
1521 VISIT(st, expr, e->v.NamedExpr.value);
1522 VISIT(st, expr, e->v.NamedExpr.target);
Miss Islington (bot)384c6d72019-08-29 06:46:20 -07001523 return 1;
Nick Coghlan6ca03072019-08-26 00:41:47 +10001524}
1525
1526static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527symtable_visit_expr(struct symtable *st, expr_ty e)
1528{
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001529 if (++st->recursion_depth > st->recursion_limit) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04001530 PyErr_SetString(PyExc_RecursionError,
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001531 "maximum recursion depth exceeded during compilation");
1532 VISIT_QUIT(st, 0);
1533 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001535 case NamedExpr_kind:
Pablo Galindo37694252019-08-26 16:27:31 +01001536 if(!symtable_handle_namedexpr(st, e))
1537 VISIT_QUIT(st, 0);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001538 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 case BoolOp_kind:
1540 VISIT_SEQ(st, expr, e->v.BoolOp.values);
1541 break;
1542 case BinOp_kind:
1543 VISIT(st, expr, e->v.BinOp.left);
1544 VISIT(st, expr, e->v.BinOp.right);
1545 break;
1546 case UnaryOp_kind:
1547 VISIT(st, expr, e->v.UnaryOp.operand);
1548 break;
1549 case Lambda_kind: {
1550 if (!GET_IDENTIFIER(lambda))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001551 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 if (e->v.Lambda.args->defaults)
1553 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
Amaury Forgeot d'Arc97c1bef2011-11-04 22:17:45 +01001554 if (e->v.Lambda.args->kw_defaults)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001555 VISIT_SEQ_WITH_NULL(st, expr, e->v.Lambda.args->kw_defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 if (!symtable_enter_block(st, lambda,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001557 FunctionBlock, (void *)e, e->lineno,
1558 e->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001559 VISIT_QUIT(st, 0);
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001560 VISIT(st, arguments, e->v.Lambda.args);
1561 VISIT(st, expr, e->v.Lambda.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 if (!symtable_exit_block(st, (void *)e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001563 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 break;
1565 }
1566 case IfExp_kind:
1567 VISIT(st, expr, e->v.IfExp.test);
1568 VISIT(st, expr, e->v.IfExp.body);
1569 VISIT(st, expr, e->v.IfExp.orelse);
1570 break;
1571 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001572 VISIT_SEQ_WITH_NULL(st, expr, e->v.Dict.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 VISIT_SEQ(st, expr, e->v.Dict.values);
1574 break;
1575 case Set_kind:
1576 VISIT_SEQ(st, expr, e->v.Set.elts);
1577 break;
1578 case GeneratorExp_kind:
1579 if (!symtable_visit_genexp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001580 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 break;
1582 case ListComp_kind:
1583 if (!symtable_visit_listcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001584 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 break;
1586 case SetComp_kind:
1587 if (!symtable_visit_setcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001588 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 break;
1590 case DictComp_kind:
1591 if (!symtable_visit_dictcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001592 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 break;
1594 case Yield_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +00001595 if (e->v.Yield.value)
1596 VISIT(st, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 st->st_cur->ste_generator = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00001599 case YieldFrom_kind:
1600 VISIT(st, expr, e->v.YieldFrom.value);
1601 st->st_cur->ste_generator = 1;
1602 break;
Yury Selivanov75445082015-05-11 22:57:16 -04001603 case Await_kind:
1604 VISIT(st, expr, e->v.Await.value);
Yury Selivanoveb636452016-09-08 22:01:51 -07001605 st->st_cur->ste_coroutine = 1;
Yury Selivanov75445082015-05-11 22:57:16 -04001606 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 case Compare_kind:
1608 VISIT(st, expr, e->v.Compare.left);
1609 VISIT_SEQ(st, expr, e->v.Compare.comparators);
1610 break;
1611 case Call_kind:
1612 VISIT(st, expr, e->v.Call.func);
1613 VISIT_SEQ(st, expr, e->v.Call.args);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001614 VISIT_SEQ_WITH_NULL(st, keyword, e->v.Call.keywords);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04001616 case FormattedValue_kind:
1617 VISIT(st, expr, e->v.FormattedValue.value);
1618 if (e->v.FormattedValue.format_spec)
1619 VISIT(st, expr, e->v.FormattedValue.format_spec);
1620 break;
1621 case JoinedStr_kind:
1622 VISIT_SEQ(st, expr, e->v.JoinedStr.values);
1623 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001624 case Constant_kind:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 /* Nothing to do here. */
1626 break;
1627 /* The following exprs can be assignment targets. */
1628 case Attribute_kind:
1629 VISIT(st, expr, e->v.Attribute.value);
1630 break;
1631 case Subscript_kind:
1632 VISIT(st, expr, e->v.Subscript.value);
1633 VISIT(st, slice, e->v.Subscript.slice);
1634 break;
1635 case Starred_kind:
1636 VISIT(st, expr, e->v.Starred.value);
1637 break;
1638 case Name_kind:
1639 if (!symtable_add_def(st, e->v.Name.id,
1640 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001641 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 /* Special-case super: it counts as a use of __class__ */
1643 if (e->v.Name.ctx == Load &&
1644 st->st_cur->ste_type == FunctionBlock &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001645 _PyUnicode_EqualToASCIIString(e->v.Name.id, "super")) {
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10001646 if (!GET_IDENTIFIER(__class__) ||
1647 !symtable_add_def(st, __class__, USE))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001648 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 }
1650 break;
1651 /* child nodes of List and Tuple will have expr_context set */
1652 case List_kind:
1653 VISIT_SEQ(st, expr, e->v.List.elts);
1654 break;
1655 case Tuple_kind:
1656 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1657 break;
1658 }
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001659 VISIT_QUIT(st, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660}
1661
1662static int
1663symtable_implicit_arg(struct symtable *st, int pos)
1664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 PyObject *id = PyUnicode_FromFormat(".%d", pos);
1666 if (id == NULL)
1667 return 0;
1668 if (!symtable_add_def(st, id, DEF_PARAM)) {
1669 Py_DECREF(id);
1670 return 0;
1671 }
1672 Py_DECREF(id);
1673 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674}
1675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676static int
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001677symtable_visit_params(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 int i;
Neal Norwitzc1505362006-12-28 06:47:50 +00001680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 if (!args)
1682 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 for (i = 0; i < asdl_seq_LEN(args); i++) {
1685 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1686 if (!symtable_add_def(st, arg->arg, DEF_PARAM))
1687 return 0;
1688 }
1689
1690 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691}
1692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693static int
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001694symtable_visit_argannotations(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 int i;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 if (!args)
1699 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 for (i = 0; i < asdl_seq_LEN(args); i++) {
1702 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1703 if (arg->annotation)
1704 VISIT(st, expr, arg->annotation);
1705 }
1706
1707 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001708}
1709
Neal Norwitzc1505362006-12-28 06:47:50 +00001710static int
Yury Selivanov75445082015-05-11 22:57:16 -04001711symtable_visit_annotations(struct symtable *st, stmt_ty s,
1712 arguments_ty a, expr_ty returns)
Neal Norwitzc1505362006-12-28 06:47:50 +00001713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 if (a->args && !symtable_visit_argannotations(st, a->args))
1715 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001716 if (a->vararg && a->vararg->annotation)
1717 VISIT(st, expr, a->vararg->annotation);
1718 if (a->kwarg && a->kwarg->annotation)
1719 VISIT(st, expr, a->kwarg->annotation);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 if (a->kwonlyargs && !symtable_visit_argannotations(st, a->kwonlyargs))
1721 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001722 if (returns)
Yury Selivanovb7666a32015-07-22 14:48:57 +03001723 VISIT(st, expr, returns);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725}
1726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728symtable_visit_arguments(struct symtable *st, arguments_ty a)
1729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 /* skip default arguments inside function block
1731 XXX should ast be different?
1732 */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001733 if (a->posonlyargs && !symtable_visit_params(st, a->posonlyargs))
1734 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 if (a->args && !symtable_visit_params(st, a->args))
1736 return 0;
1737 if (a->kwonlyargs && !symtable_visit_params(st, a->kwonlyargs))
1738 return 0;
1739 if (a->vararg) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001740 if (!symtable_add_def(st, a->vararg->arg, DEF_PARAM))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 return 0;
1742 st->st_cur->ste_varargs = 1;
1743 }
1744 if (a->kwarg) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001745 if (!symtable_add_def(st, a->kwarg->arg, DEF_PARAM))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 return 0;
1747 st->st_cur->ste_varkeywords = 1;
1748 }
1749 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750}
1751
1752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 if (eh->v.ExceptHandler.type)
1757 VISIT(st, expr, eh->v.ExceptHandler.type);
1758 if (eh->v.ExceptHandler.name)
1759 if (!symtable_add_def(st, eh->v.ExceptHandler.name, DEF_LOCAL))
1760 return 0;
1761 VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
1762 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763}
1764
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001765static int
1766symtable_visit_withitem(struct symtable *st, withitem_ty item)
1767{
1768 VISIT(st, expr, item->context_expr);
1769 if (item->optional_vars) {
1770 VISIT(st, expr, item->optional_vars);
1771 }
1772 return 1;
1773}
1774
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777symtable_visit_alias(struct symtable *st, alias_ty a)
1778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 /* Compute store_name, the name actually bound by the import
Benjamin Petersonc629d512010-06-11 21:53:07 +00001780 operation. It is different than a->name when a->name is a
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 dotted package name (e.g. spam.eggs)
1782 */
1783 PyObject *store_name;
1784 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001785 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
1786 PyUnicode_GET_LENGTH(name), 1);
1787 if (dot != -1) {
1788 store_name = PyUnicode_Substring(name, 0, dot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 if (!store_name)
1790 return 0;
1791 }
1792 else {
1793 store_name = name;
1794 Py_INCREF(store_name);
1795 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001796 if (!_PyUnicode_EqualToASCIIString(name, "*")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1798 Py_DECREF(store_name);
1799 return r;
1800 }
1801 else {
1802 if (st->st_cur->ste_type != ModuleBlock) {
Benjamin Petersonb7149ca2011-06-20 22:09:13 -05001803 int lineno = st->st_cur->ste_lineno;
1804 int col_offset = st->st_cur->ste_col_offset;
1805 PyErr_SetString(PyExc_SyntaxError, IMPORT_STAR_WARNING);
Ammar Askar025eb982018-09-24 17:12:49 -04001806 PyErr_SyntaxLocationObject(st->st_filename, lineno, col_offset + 1);
Benjamin Petersonb7149ca2011-06-20 22:09:13 -05001807 Py_DECREF(store_name);
1808 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 Py_DECREF(store_name);
1811 return 1;
1812 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813}
1814
1815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1818{
Nick Coghlan6ca03072019-08-26 00:41:47 +10001819 st->st_cur->ste_comp_iter_target = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 VISIT(st, expr, lc->target);
Nick Coghlan6ca03072019-08-26 00:41:47 +10001821 st->st_cur->ste_comp_iter_target = 0;
1822 st->st_cur->ste_comp_iter_expr++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 VISIT(st, expr, lc->iter);
Nick Coghlan6ca03072019-08-26 00:41:47 +10001824 st->st_cur->ste_comp_iter_expr--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 VISIT_SEQ(st, expr, lc->ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001826 if (lc->is_async) {
1827 st->st_cur->ste_coroutine = 1;
1828 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830}
1831
1832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834symtable_visit_keyword(struct symtable *st, keyword_ty k)
1835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 VISIT(st, expr, k->value);
1837 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001838}
1839
1840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842symtable_visit_slice(struct symtable *st, slice_ty s)
1843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 switch (s->kind) {
1845 case Slice_kind:
1846 if (s->v.Slice.lower)
1847 VISIT(st, expr, s->v.Slice.lower)
1848 if (s->v.Slice.upper)
1849 VISIT(st, expr, s->v.Slice.upper)
1850 if (s->v.Slice.step)
1851 VISIT(st, expr, s->v.Slice.step)
1852 break;
1853 case ExtSlice_kind:
1854 VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
1855 break;
1856 case Index_kind:
1857 VISIT(st, expr, s->v.Index.value)
1858 break;
1859 }
1860 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861}
1862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001864symtable_handle_comprehension(struct symtable *st, expr_ty e,
Guido van Rossum992d4a32007-07-11 13:09:30 +00001865 identifier scope_name, asdl_seq *generators,
1866 expr_ty elt, expr_ty value)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 int is_generator = (e->kind == GeneratorExp_kind);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 comprehension_ty outermost = ((comprehension_ty)
1870 asdl_seq_GET(generators, 0));
1871 /* Outermost iterator is evaluated in current scope */
Nick Coghlan6ca03072019-08-26 00:41:47 +10001872 st->st_cur->ste_comp_iter_expr++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 VISIT(st, expr, outermost->iter);
Nick Coghlan6ca03072019-08-26 00:41:47 +10001874 st->st_cur->ste_comp_iter_expr--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 /* Create comprehension scope for the rest */
1876 if (!scope_name ||
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001877 !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e,
1878 e->lineno, e->col_offset)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 return 0;
1880 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001881 if (outermost->is_async) {
1882 st->st_cur->ste_coroutine = 1;
1883 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001884 st->st_cur->ste_comprehension = 1;
1885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 /* Outermost iter is received as an argument */
1887 if (!symtable_implicit_arg(st, 0)) {
1888 symtable_exit_block(st, (void *)e);
1889 return 0;
1890 }
Nick Coghlan6ca03072019-08-26 00:41:47 +10001891 /* Visit iteration variable target, and mark them as such */
1892 st->st_cur->ste_comp_iter_target = 1;
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001893 VISIT(st, expr, outermost->target);
Nick Coghlan6ca03072019-08-26 00:41:47 +10001894 st->st_cur->ste_comp_iter_target = 0;
1895 /* Visit the rest of the comprehension body */
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001896 VISIT_SEQ(st, expr, outermost->ifs);
1897 VISIT_SEQ_TAIL(st, comprehension, generators, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 if (value)
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001899 VISIT(st, expr, value);
1900 VISIT(st, expr, elt);
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001901 if (st->st_cur->ste_generator) {
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001902 PyErr_SetString(PyExc_SyntaxError,
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001903 (e->kind == ListComp_kind) ? "'yield' inside list comprehension" :
1904 (e->kind == SetComp_kind) ? "'yield' inside set comprehension" :
1905 (e->kind == DictComp_kind) ? "'yield' inside dict comprehension" :
1906 "'yield' inside generator expression");
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001907 PyErr_SyntaxLocationObject(st->st_filename,
1908 st->st_cur->ste_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001909 st->st_cur->ste_col_offset + 1);
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001910 symtable_exit_block(st, (void *)e);
1911 return 0;
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001912 }
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001913 st->st_cur->ste_generator = is_generator;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 return symtable_exit_block(st, (void *)e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915}
Nick Coghlan650f0d02007-04-15 12:05:43 +00001916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001918symtable_visit_genexp(struct symtable *st, expr_ty e)
1919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
1921 e->v.GeneratorExp.generators,
1922 e->v.GeneratorExp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923}
1924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001926symtable_visit_listcomp(struct symtable *st, expr_ty e)
1927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(listcomp),
1929 e->v.ListComp.generators,
1930 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931}
1932
1933static int
1934symtable_visit_setcomp(struct symtable *st, expr_ty e)
1935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
1937 e->v.SetComp.generators,
1938 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001939}
1940
1941static int
1942symtable_visit_dictcomp(struct symtable *st, expr_ty e)
1943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp),
1945 e->v.DictComp.generators,
1946 e->v.DictComp.key,
1947 e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001948}