blob: efe6d50f3505b32047718522064d35d0a97c7003 [file] [log] [blame]
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001#include "Python.h"
Victor Stinner94faa072021-03-23 20:47:40 +01002#include "pycore_ast.h" // identifier, stmt_ty
Victor Stinnera81fca62021-03-24 00:51:50 +01003#undef Yield /* undefine macro conflicting with <winbase.h> */
4#include "pycore_compile.h" // _Py_Mangle()
Victor Stinner57364ce2021-03-24 01:29:09 +01005#include "pycore_parser.h" // _PyParser_ASTFromString()
Victor Stinner28ad12f2021-03-19 12:41:49 +01006#include "pycore_pystate.h" // _PyThreadState_GET()
7#include "pycore_symtable.h" // PySTEntryObject
Victor Stinner4a21e572020-04-15 02:35:41 +02008#include "structmember.h" // PyMemberDef
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00009
Neal Norwitz5d0ad502005-12-19 04:27:42 +000010/* error strings used for warnings */
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +020011#define GLOBAL_PARAM \
12"name '%U' is parameter and global"
13
14#define NONLOCAL_PARAM \
15"name '%U' is parameter and nonlocal"
16
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000017#define GLOBAL_AFTER_ASSIGN \
Guido van Rossum6cff8742016-09-09 09:36:26 -070018"name '%U' is assigned to before global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000019
Jeremy Hylton81e95022007-02-27 06:50:52 +000020#define NONLOCAL_AFTER_ASSIGN \
Guido van Rossum6cff8742016-09-09 09:36:26 -070021"name '%U' is assigned to before nonlocal declaration"
Jeremy Hylton81e95022007-02-27 06:50:52 +000022
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023#define GLOBAL_AFTER_USE \
Guido van Rossum6cff8742016-09-09 09:36:26 -070024"name '%U' is used prior to global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000025
Jeremy Hylton81e95022007-02-27 06:50:52 +000026#define NONLOCAL_AFTER_USE \
Guido van Rossum6cff8742016-09-09 09:36:26 -070027"name '%U' is used prior to nonlocal declaration"
28
29#define GLOBAL_ANNOT \
30"annotated name '%U' can't be global"
31
32#define NONLOCAL_ANNOT \
33"annotated name '%U' can't be nonlocal"
Jeremy Hylton81e95022007-02-27 06:50:52 +000034
Neal Norwitz5d0ad502005-12-19 04:27:42 +000035#define IMPORT_STAR_WARNING "import * only allowed at module level"
36
Emily Morehouse8f59ee02019-01-24 16:49:56 -070037#define NAMED_EXPR_COMP_IN_CLASS \
Nick Coghlan5dbe0f52019-08-25 23:45:40 +100038"assignment expression within a comprehension cannot be used in a class body"
39
40#define NAMED_EXPR_COMP_CONFLICT \
41"assignment expression cannot rebind comprehension iteration variable '%U'"
42
43#define NAMED_EXPR_COMP_INNER_LOOP_CONFLICT \
44"comprehension inner loop cannot rebind assignment expression target '%U'"
45
46#define NAMED_EXPR_COMP_ITER_EXPR \
47"assignment expression cannot be used in a comprehension iterable expression"
Emily Morehouse8f59ee02019-01-24 16:49:56 -070048
Neal Norwitz090b3dd2006-02-28 22:36:46 +000049static PySTEntryObject *
Benjamin Peterson55e00f22008-08-17 18:02:44 +000050ste_new(struct symtable *st, identifier name, _Py_block_ty block,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000051 void *key, int lineno, int col_offset)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 PySTEntryObject *ste = NULL;
Christian Heimes837e53a2012-09-10 03:08:46 +020054 PyObject *k = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 k = PyLong_FromVoidPtr(key);
57 if (k == NULL)
58 goto fail;
59 ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
Christian Heimes55ad6512012-09-12 17:58:10 +020060 if (ste == NULL) {
61 Py_DECREF(k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 goto fail;
Christian Heimes55ad6512012-09-12 17:58:10 +020063 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 ste->ste_table = st;
Christian Heimes15265822012-09-12 17:52:46 +020065 ste->ste_id = k; /* ste owns reference to k */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 Py_INCREF(name);
Victor Stinner9a4fb662013-07-11 22:49:00 +020068 ste->ste_name = name;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 ste->ste_symbols = NULL;
71 ste->ste_varnames = NULL;
72 ste->ste_children = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000073
Benjamin Petersond9c87022012-10-31 20:26:20 -040074 ste->ste_directives = NULL;
75
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 ste->ste_type = block;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 ste->ste_nested = 0;
78 ste->ste_free = 0;
79 ste->ste_varargs = 0;
80 ste->ste_varkeywords = 0;
81 ste->ste_opt_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000082 ste->ste_opt_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 ste->ste_lineno = lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000084 ste->ste_col_offset = col_offset;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 if (st->st_cur != NULL &&
87 (st->st_cur->ste_nested ||
88 st->st_cur->ste_type == FunctionBlock))
89 ste->ste_nested = 1;
90 ste->ste_child_free = 0;
91 ste->ste_generator = 0;
Yury Selivanoveb636452016-09-08 22:01:51 -070092 ste->ste_coroutine = 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -070093 ste->ste_comprehension = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 ste->ste_returns_value = 0;
Benjamin Peterson312595c2013-05-15 15:26:42 -050095 ste->ste_needs_class_closure = 0;
Nick Coghlan5dbe0f52019-08-25 23:45:40 +100096 ste->ste_comp_iter_target = 0;
97 ste->ste_comp_iter_expr = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000098
Victor Stinner9a4fb662013-07-11 22:49:00 +020099 ste->ste_symbols = PyDict_New();
100 ste->ste_varnames = PyList_New(0);
101 ste->ste_children = PyList_New(0);
102 if (ste->ste_symbols == NULL
103 || ste->ste_varnames == NULL
104 || ste->ste_children == NULL)
105 goto fail;
106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0)
108 goto fail;
109
110 return ste;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000111 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 Py_XDECREF(ste);
113 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000114}
115
116static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000117ste_repr(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 return PyUnicode_FromFormat("<symtable entry %U(%ld), line %d>",
120 ste->ste_name,
121 PyLong_AS_LONG(ste->ste_id), ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000122}
123
124static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000125ste_dealloc(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 ste->ste_table = NULL;
128 Py_XDECREF(ste->ste_id);
129 Py_XDECREF(ste->ste_name);
130 Py_XDECREF(ste->ste_symbols);
131 Py_XDECREF(ste->ste_varnames);
132 Py_XDECREF(ste->ste_children);
Benjamin Petersond9c87022012-10-31 20:26:20 -0400133 Py_XDECREF(ste->ste_directives);
Victor Stinner32bd68c2020-12-01 10:37:39 +0100134 PyObject_Free(ste);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000135}
136
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000137#define OFF(x) offsetof(PySTEntryObject, x)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000138
Guido van Rossum6f799372001-09-20 20:46:19 +0000139static PyMemberDef ste_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 {"id", T_OBJECT, OFF(ste_id), READONLY},
141 {"name", T_OBJECT, OFF(ste_name), READONLY},
142 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
143 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
144 {"children", T_OBJECT, OFF(ste_children), READONLY},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 {"nested", T_INT, OFF(ste_nested), READONLY},
146 {"type", T_INT, OFF(ste_type), READONLY},
147 {"lineno", T_INT, OFF(ste_lineno), READONLY},
148 {NULL}
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000149};
150
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000151PyTypeObject PySTEntry_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 PyVarObject_HEAD_INIT(&PyType_Type, 0)
153 "symtable entry",
154 sizeof(PySTEntryObject),
155 0,
156 (destructor)ste_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200157 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 0, /* tp_getattr */
159 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200160 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 (reprfunc)ste_repr, /* tp_repr */
162 0, /* tp_as_number */
163 0, /* tp_as_sequence */
164 0, /* tp_as_mapping */
165 0, /* tp_hash */
166 0, /* tp_call */
167 0, /* tp_str */
168 PyObject_GenericGetAttr, /* tp_getattro */
169 0, /* tp_setattro */
170 0, /* tp_as_buffer */
171 Py_TPFLAGS_DEFAULT, /* tp_flags */
172 0, /* tp_doc */
173 0, /* tp_traverse */
174 0, /* tp_clear */
175 0, /* tp_richcompare */
176 0, /* tp_weaklistoffset */
177 0, /* tp_iter */
178 0, /* tp_iternext */
179 0, /* tp_methods */
180 ste_memberlist, /* tp_members */
181 0, /* tp_getset */
182 0, /* tp_base */
183 0, /* tp_dict */
184 0, /* tp_descr_get */
185 0, /* tp_descr_set */
186 0, /* tp_dictoffset */
187 0, /* tp_init */
188 0, /* tp_alloc */
189 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000190};
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000191
192static int symtable_analyze(struct symtable *st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193static int symtable_enter_block(struct symtable *st, identifier name,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000194 _Py_block_ty block, void *ast, int lineno,
195 int col_offset);
Andy Lester95668422020-03-06 09:46:04 -0600196static int symtable_exit_block(struct symtable *st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000197static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
198static int symtable_visit_expr(struct symtable *st, expr_ty s);
199static int symtable_visit_genexp(struct symtable *st, expr_ty s);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000200static int symtable_visit_listcomp(struct symtable *st, expr_ty s);
201static int symtable_visit_setcomp(struct symtable *st, expr_ty s);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000202static int symtable_visit_dictcomp(struct symtable *st, expr_ty s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000203static int symtable_visit_arguments(struct symtable *st, arguments_ty);
204static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
205static int symtable_visit_alias(struct symtable *st, alias_ty);
206static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
207static int symtable_visit_keyword(struct symtable *st, keyword_ty);
Pablo Galindoa5634c42020-09-16 19:42:00 +0100208static int symtable_visit_params(struct symtable *st, asdl_arg_seq *args);
209static int symtable_visit_argannotations(struct symtable *st, asdl_arg_seq *args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210static int symtable_implicit_arg(struct symtable *st, int pos);
Andy Lester95668422020-03-06 09:46:04 -0600211static int symtable_visit_annotations(struct symtable *st, arguments_ty, expr_ty);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500212static int symtable_visit_withitem(struct symtable *st, withitem_ty item);
Brandt Bucher145bf262021-02-26 14:51:55 -0800213static int symtable_visit_match_case(struct symtable *st, match_case_ty m);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000214
215
Nick Coghlan650f0d02007-04-15 12:05:43 +0000216static identifier top = NULL, lambda = NULL, genexpr = NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 listcomp = NULL, setcomp = NULL, dictcomp = NULL,
Benjamin Petersone8e14592013-05-16 14:37:25 -0500218 __class__ = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000219
220#define GET_IDENTIFIER(VAR) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222
223#define DUPLICATE_ARGUMENT \
Neal Norwitza5d16a32007-08-24 22:53:58 +0000224"duplicate argument '%U' in function definition"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225
226static struct symtable *
227symtable_new(void)
228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 struct symtable *st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
Zackery Spytzad65f152018-11-16 08:58:55 -0700232 if (st == NULL) {
233 PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 return NULL;
Zackery Spytzad65f152018-11-16 08:58:55 -0700235 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 st->st_filename = NULL;
238 st->st_blocks = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 if ((st->st_stack = PyList_New(0)) == NULL)
241 goto fail;
242 if ((st->st_blocks = PyDict_New()) == NULL)
243 goto fail;
244 st->st_cur = NULL;
245 st->st_private = NULL;
Brandt Bucher145bf262021-02-26 14:51:55 -0800246 st->in_pattern = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 return st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 fail:
Victor Stinner28ad12f2021-03-19 12:41:49 +0100249 _PySymtable_Free(st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251}
252
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000253/* When compiling the use of C stack is probably going to be a lot
254 lighter than when executing Python code but still can overflow
255 and causing a Python crash if not checked (e.g. eval("()"*300000)).
256 Using the current recursion limit for the compiler seems too
257 restrictive (it caused at least one test to fail) so a factor is
258 used to allow deeper recursion when compiling an expression.
259
260 Using a scaling factor means this should automatically adjust when
261 the recursion limit is adjusted for small or large C stack allocations.
262*/
263#define COMPILER_STACK_FRAME_SCALE 3
264
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265struct symtable *
Victor Stinner28ad12f2021-03-19 12:41:49 +0100266_PySymtable_Build(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267{
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000268 struct symtable *st = symtable_new();
Pablo Galindoa5634c42020-09-16 19:42:00 +0100269 asdl_stmt_seq *seq;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 int i;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000271 PyThreadState *tstate;
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400272 int recursion_limit = Py_GetRecursionLimit();
Nick Coghlan06145232019-08-29 23:26:53 +1000273 int starting_recursion_depth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 if (st == NULL)
Victor Stinner14e461d2013-08-26 22:28:21 +0200276 return NULL;
277 if (filename == NULL) {
Victor Stinner28ad12f2021-03-19 12:41:49 +0100278 _PySymtable_Free(st);
Victor Stinner14e461d2013-08-26 22:28:21 +0200279 return NULL;
280 }
281 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 st->st_filename = filename;
283 st->st_future = future;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000284
285 /* Setup recursion depth check counters */
Victor Stinner50b48572018-11-01 01:51:40 +0100286 tstate = _PyThreadState_GET();
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000287 if (!tstate) {
Victor Stinner28ad12f2021-03-19 12:41:49 +0100288 _PySymtable_Free(st);
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000289 return NULL;
290 }
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400291 /* Be careful here to prevent overflow. */
Nick Coghlan06145232019-08-29 23:26:53 +1000292 starting_recursion_depth = (tstate->recursion_depth < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400293 tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE : tstate->recursion_depth;
Nick Coghlan06145232019-08-29 23:26:53 +1000294 st->recursion_depth = starting_recursion_depth;
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400295 st->recursion_limit = (recursion_limit < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
296 recursion_limit * COMPILER_STACK_FRAME_SCALE : recursion_limit;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 /* Make the initial symbol information gathering pass */
299 if (!GET_IDENTIFIER(top) ||
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000300 !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) {
Victor Stinner28ad12f2021-03-19 12:41:49 +0100301 _PySymtable_Free(st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 return NULL;
303 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 st->st_top = st->st_cur;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 switch (mod->kind) {
307 case Module_kind:
308 seq = mod->v.Module.body;
309 for (i = 0; i < asdl_seq_LEN(seq); i++)
310 if (!symtable_visit_stmt(st,
311 (stmt_ty)asdl_seq_GET(seq, i)))
312 goto error;
313 break;
314 case Expression_kind:
315 if (!symtable_visit_expr(st, mod->v.Expression.body))
316 goto error;
317 break;
318 case Interactive_kind:
319 seq = mod->v.Interactive.body;
320 for (i = 0; i < asdl_seq_LEN(seq); i++)
321 if (!symtable_visit_stmt(st,
322 (stmt_ty)asdl_seq_GET(seq, i)))
323 goto error;
324 break;
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 }
Andy Lester95668422020-03-06 09:46:04 -0600330 if (!symtable_exit_block(st)) {
Victor Stinner28ad12f2021-03-19 12:41:49 +0100331 _PySymtable_Free(st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 return NULL;
333 }
Nick Coghlan06145232019-08-29 23:26:53 +1000334 /* 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);
Victor Stinner28ad12f2021-03-19 12:41:49 +0100339 _PySymtable_Free(st);
Nick Coghlan06145232019-08-29 23:26:53 +1000340 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;
Victor Stinner28ad12f2021-03-19 12:41:49 +0100345 _PySymtable_Free(st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347 error:
Andy Lester95668422020-03-06 09:46:04 -0600348 (void) symtable_exit_block(st);
Victor Stinner28ad12f2021-03-19 12:41:49 +0100349 _PySymtable_Free(st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000351}
352
Victor Stinner14e461d2013-08-26 22:28:21 +0200353
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000354void
Victor Stinner28ad12f2021-03-19 12:41:49 +0100355_PySymtable_Free(struct symtable *st)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356{
Victor Stinner14e461d2013-08-26 22:28:21 +0200357 Py_XDECREF(st->st_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 Py_XDECREF(st->st_blocks);
359 Py_XDECREF(st->st_stack);
360 PyMem_Free((void *)st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000361}
362
363PySTEntryObject *
364PySymtable_Lookup(struct symtable *st, void *key)
365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 PyObject *k, *v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 k = PyLong_FromVoidPtr(key);
369 if (k == NULL)
370 return NULL;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200371 v = PyDict_GetItemWithError(st->st_blocks, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 if (v) {
373 assert(PySTEntry_Check(v));
374 Py_INCREF(v);
375 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200376 else if (!PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 PyErr_SetString(PyExc_KeyError,
378 "unknown symbol table entry");
379 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 Py_DECREF(k);
382 return (PySTEntryObject *)v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383}
384
Nick Coghlan5dbe0f52019-08-25 23:45:40 +1000385static long
386_PyST_GetSymbol(PySTEntryObject *ste, PyObject *name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387{
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200388 PyObject *v = PyDict_GetItemWithError(ste->ste_symbols, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 if (!v)
390 return 0;
391 assert(PyLong_Check(v));
Nick Coghlan5dbe0f52019-08-25 23:45:40 +1000392 return PyLong_AS_LONG(v);
393}
394
395int
Victor Stinner28ad12f2021-03-19 12:41:49 +0100396_PyST_GetScope(PySTEntryObject *ste, PyObject *name)
Nick Coghlan5dbe0f52019-08-25 23:45:40 +1000397{
398 long symbol = _PyST_GetSymbol(ste, name);
399 return (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000400}
401
Benjamin Petersond9c87022012-10-31 20:26:20 -0400402static int
403error_at_directive(PySTEntryObject *ste, PyObject *name)
404{
405 Py_ssize_t i;
406 PyObject *data;
407 assert(ste->ste_directives);
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600408 for (i = 0; i < PyList_GET_SIZE(ste->ste_directives); i++) {
Benjamin Petersond9c87022012-10-31 20:26:20 -0400409 data = PyList_GET_ITEM(ste->ste_directives, i);
410 assert(PyTuple_CheckExact(data));
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600411 assert(PyUnicode_CheckExact(PyTuple_GET_ITEM(data, 0)));
412 if (PyUnicode_Compare(PyTuple_GET_ITEM(data, 0), name) == 0) {
413 PyErr_SyntaxLocationObject(ste->ste_table->st_filename,
414 PyLong_AsLong(PyTuple_GET_ITEM(data, 1)),
Ammar Askar025eb982018-09-24 17:12:49 -0400415 PyLong_AsLong(PyTuple_GET_ITEM(data, 2)) + 1);
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600416
417 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -0700418 }
Benjamin Petersond9c87022012-10-31 20:26:20 -0400419 }
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600420 PyErr_SetString(PyExc_RuntimeError,
421 "BUG: internal directive bookkeeping broken");
Benjamin Petersond9c87022012-10-31 20:26:20 -0400422 return 0;
423}
424
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425
426/* Analyze raw symbol information to determine scope of each name.
427
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000428 The next several functions are helpers for symtable_analyze(),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 which determines whether a name is local, global, or free. In addition,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000430 it determines which local variables are cell variables; they provide
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 bindings that are used for free variables in enclosed blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 There are also two kinds of global variables, implicit and explicit. An
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 explicit global is declared with the global statement. An implicit
435 global is a free variable for which the compiler has found no binding
436 in an enclosing function scope. The implicit global is either a global
437 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
438 to handle these names to implement slightly odd semantics. In such a
439 block, the name is treated as global until it is assigned to; then it
440 is treated as a local.
441
442 The symbol table requires two passes to determine the scope of each name.
Nick Coghlan650f0d02007-04-15 12:05:43 +0000443 The first pass collects raw facts from the AST via the symtable_visit_*
444 functions: the name is a parameter here, the name is used but not defined
445 here, etc. The second pass analyzes these facts during a pass over the
446 PySTEntryObjects created during pass 1.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000447
448 When a function is entered during the second pass, the parent passes
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 the set of all name bindings visible to its children. These bindings
Nick Coghlan650f0d02007-04-15 12:05:43 +0000450 are used to determine if non-local variables are free or implicit globals.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000451 Names which are explicitly declared nonlocal must exist in this set of
452 visible names - if they do not, a syntax error is raised. After doing
453 the local analysis, it analyzes each of its child blocks using an
454 updated set of name bindings.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000455
Nick Coghlan650f0d02007-04-15 12:05:43 +0000456 The children update the free variable set. If a local variable is added to
457 the free variable set by the child, the variable is marked as a cell. The
458 function object being defined must provide runtime storage for the variable
459 that may outlive the function's frame. Cell variables are removed from the
460 free set before the analyze function returns to its parent.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000461
Nick Coghlan650f0d02007-04-15 12:05:43 +0000462 During analysis, the names are:
463 symbols: dict mapping from symbol names to flag values (including offset scope values)
464 scopes: dict mapping from symbol names to scope values (no offset)
465 local: set of all symbol names local to the current scope
466 bound: set of all symbol names local to a containing function scope
467 free: set of all symbol names referenced but not bound in child scopes
468 global: set of all symbol names explicitly declared as global
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000469*/
470
471#define SET_SCOPE(DICT, NAME, I) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 PyObject *o = PyLong_FromLong(I); \
473 if (!o) \
474 return 0; \
475 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
476 Py_DECREF(o); \
477 return 0; \
478 } \
479 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000480}
481
482/* Decide on scope of name, given flags.
483
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000484 The namespace dictionaries may be modified to record information
485 about the new name. For example, a new global will add an entry to
486 global. A name that was global can be changed to local.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487*/
488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000490analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 PyObject *bound, PyObject *local, PyObject *free,
492 PyObject *global)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 if (flags & DEF_GLOBAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 if (flags & DEF_NONLOCAL) {
496 PyErr_Format(PyExc_SyntaxError,
497 "name '%U' is nonlocal and global",
498 name);
Benjamin Petersond9c87022012-10-31 20:26:20 -0400499 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 }
501 SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
502 if (PySet_Add(global, name) < 0)
503 return 0;
504 if (bound && (PySet_Discard(bound, name) < 0))
505 return 0;
506 return 1;
507 }
508 if (flags & DEF_NONLOCAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 if (!bound) {
510 PyErr_Format(PyExc_SyntaxError,
511 "nonlocal declaration not allowed at module level");
Benjamin Petersond9c87022012-10-31 20:26:20 -0400512 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 }
514 if (!PySet_Contains(bound, name)) {
515 PyErr_Format(PyExc_SyntaxError,
516 "no binding for nonlocal '%U' found",
517 name);
518
Benjamin Petersond9c87022012-10-31 20:26:20 -0400519 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 }
521 SET_SCOPE(scopes, name, FREE);
522 ste->ste_free = 1;
523 return PySet_Add(free, name) >= 0;
524 }
525 if (flags & DEF_BOUND) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +0000526 SET_SCOPE(scopes, name, LOCAL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 if (PySet_Add(local, name) < 0)
528 return 0;
529 if (PySet_Discard(global, name) < 0)
530 return 0;
531 return 1;
532 }
533 /* If an enclosing block has a binding for this name, it
534 is a free variable rather than a global variable.
535 Note that having a non-NULL bound implies that the block
536 is nested.
537 */
538 if (bound && PySet_Contains(bound, name)) {
539 SET_SCOPE(scopes, name, FREE);
540 ste->ste_free = 1;
541 return PySet_Add(free, name) >= 0;
542 }
543 /* If a parent has a global statement, then call it global
544 explicit? It could also be global implicit.
545 */
546 if (global && PySet_Contains(global, name)) {
547 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
548 return 1;
549 }
550 if (ste->ste_nested)
551 ste->ste_free = 1;
552 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
553 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554}
555
556#undef SET_SCOPE
557
558/* If a name is defined in free and also in locals, then this block
559 provides the binding for the free variable. The name should be
560 marked CELL in this block and removed from the free list.
561
562 Note that the current block's free variables are included in free.
563 That's safe because no name can be free and local in the same scope.
564*/
565
566static int
Benjamin Peterson312595c2013-05-15 15:26:42 -0500567analyze_cells(PyObject *scopes, PyObject *free)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 PyObject *name, *v, *v_cell;
570 int success = 0;
571 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 v_cell = PyLong_FromLong(CELL);
574 if (!v_cell)
575 return 0;
576 while (PyDict_Next(scopes, &pos, &name, &v)) {
577 long scope;
578 assert(PyLong_Check(v));
579 scope = PyLong_AS_LONG(v);
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +0000580 if (scope != LOCAL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 continue;
582 if (!PySet_Contains(free, name))
583 continue;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* Replace LOCAL with CELL for this name, and remove
585 from free. It is safe to replace the value of name
586 in the dict, because it will not cause a resize.
587 */
588 if (PyDict_SetItem(scopes, name, v_cell) < 0)
589 goto error;
590 if (PySet_Discard(free, name) < 0)
591 goto error;
592 }
593 success = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 Py_DECREF(v_cell);
596 return success;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597}
598
Benjamin Peterson312595c2013-05-15 15:26:42 -0500599static int
600drop_class_free(PySTEntryObject *ste, PyObject *free)
601{
602 int res;
603 if (!GET_IDENTIFIER(__class__))
604 return 0;
605 res = PySet_Discard(free, __class__);
606 if (res < 0)
607 return 0;
608 if (res)
609 ste->ste_needs_class_closure = 1;
610 return 1;
611}
612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613/* Enter the final scope information into the ste_symbols dict.
614 *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615 * All arguments are dicts. Modifies symbols, others are read-only.
616*/
617static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618update_symbols(PyObject *symbols, PyObject *scopes,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000619 PyObject *bound, PyObject *free, int classflag)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 PyObject *name = NULL, *itr = NULL;
622 PyObject *v = NULL, *v_scope = NULL, *v_new = NULL, *v_free = NULL;
623 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 /* Update scope information for all symbols in this scope */
626 while (PyDict_Next(symbols, &pos, &name, &v)) {
627 long scope, flags;
628 assert(PyLong_Check(v));
629 flags = PyLong_AS_LONG(v);
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200630 v_scope = PyDict_GetItemWithError(scopes, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 assert(v_scope && PyLong_Check(v_scope));
632 scope = PyLong_AS_LONG(v_scope);
633 flags |= (scope << SCOPE_OFFSET);
634 v_new = PyLong_FromLong(flags);
635 if (!v_new)
636 return 0;
637 if (PyDict_SetItem(symbols, name, v_new) < 0) {
638 Py_DECREF(v_new);
639 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000640 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 Py_DECREF(v_new);
642 }
643
644 /* Record not yet resolved free variables from children (if any) */
645 v_free = PyLong_FromLong(FREE << SCOPE_OFFSET);
646 if (!v_free)
647 return 0;
648
649 itr = PyObject_GetIter(free);
Zackery Spytzfc439d22018-10-10 23:05:35 -0600650 if (itr == NULL) {
651 Py_DECREF(v_free);
652 return 0;
653 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654
655 while ((name = PyIter_Next(itr))) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200656 v = PyDict_GetItemWithError(symbols, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657
658 /* Handle symbol that already exists in this scope */
659 if (v) {
660 /* Handle a free variable in a method of
661 the class that has the same name as a local
662 or global in the class scope.
663 */
664 if (classflag &&
665 PyLong_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) {
666 long flags = PyLong_AS_LONG(v) | DEF_FREE_CLASS;
667 v_new = PyLong_FromLong(flags);
668 if (!v_new) {
669 goto error;
670 }
671 if (PyDict_SetItem(symbols, name, v_new) < 0) {
672 Py_DECREF(v_new);
673 goto error;
674 }
675 Py_DECREF(v_new);
676 }
677 /* It's a cell, or already free in this scope */
678 Py_DECREF(name);
679 continue;
680 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200681 else if (PyErr_Occurred()) {
682 goto error;
683 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 /* Handle global symbol */
Christian Heimes45af0c82016-09-09 00:22:28 +0200685 if (bound && !PySet_Contains(bound, name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 Py_DECREF(name);
687 continue; /* it's a global */
688 }
689 /* Propagate new free symbol up the lexical stack */
690 if (PyDict_SetItem(symbols, name, v_free) < 0) {
691 goto error;
692 }
693 Py_DECREF(name);
694 }
695 Py_DECREF(itr);
696 Py_DECREF(v_free);
697 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000698error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 Py_XDECREF(v_free);
700 Py_XDECREF(itr);
701 Py_XDECREF(name);
702 return 0;
703}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704
705/* Make final symbol table decisions for block of ste.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000706
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707 Arguments:
708 ste -- current symtable entry (input/output)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000709 bound -- set of variables bound in enclosing scopes (input). bound
710 is NULL for module blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711 free -- set of free variables in enclosed scopes (output)
712 globals -- set of declared global variables in enclosing scopes (input)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000713
714 The implementation uses two mutually recursive functions,
715 analyze_block() and analyze_child_block(). analyze_block() is
716 responsible for analyzing the individual names defined in a block.
717 analyze_child_block() prepares temporary namespace dictionaries
718 used to evaluated nested blocks.
719
720 The two functions exist because a child block should see the name
721 bindings of its enclosing blocks, but those bindings should not
722 propagate back to a parent block.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723*/
724
725static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
727 PyObject *global, PyObject* child_free);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000728
729static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
731 PyObject *global)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 PyObject *name, *v, *local = NULL, *scopes = NULL, *newbound = NULL;
734 PyObject *newglobal = NULL, *newfree = NULL, *allfree = NULL;
735 PyObject *temp;
736 int i, success = 0;
737 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 local = PySet_New(NULL); /* collect new names bound in block */
740 if (!local)
741 goto error;
742 scopes = PyDict_New(); /* collect scopes defined for each name */
743 if (!scopes)
744 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 /* Allocate new global and bound variable dictionaries. These
747 dictionaries hold the names visible in nested blocks. For
748 ClassBlocks, the bound and global names are initialized
749 before analyzing names, because class bindings aren't
750 visible in methods. For other blocks, they are initialized
751 after names are analyzed.
752 */
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 /* TODO(jhylton): Package these dicts in a struct so that we
755 can write reasonable helper functions?
756 */
757 newglobal = PySet_New(NULL);
758 if (!newglobal)
759 goto error;
760 newfree = PySet_New(NULL);
761 if (!newfree)
762 goto error;
763 newbound = PySet_New(NULL);
764 if (!newbound)
765 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 /* Class namespace has no effect on names visible in
768 nested functions, so populate the global and bound
769 sets to be passed to child blocks before analyzing
770 this one.
771 */
772 if (ste->ste_type == ClassBlock) {
773 /* Pass down known globals */
774 temp = PyNumber_InPlaceOr(newglobal, global);
775 if (!temp)
776 goto error;
777 Py_DECREF(temp);
778 /* Pass down previously bound symbols */
779 if (bound) {
780 temp = PyNumber_InPlaceOr(newbound, bound);
781 if (!temp)
782 goto error;
783 Py_DECREF(temp);
784 }
785 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
788 long flags = PyLong_AS_LONG(v);
789 if (!analyze_name(ste, scopes, name, flags,
790 bound, local, free, global))
791 goto error;
792 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 /* Populate global and bound sets to be passed to children. */
795 if (ste->ste_type != ClassBlock) {
796 /* Add function locals to bound set */
797 if (ste->ste_type == FunctionBlock) {
798 temp = PyNumber_InPlaceOr(newbound, local);
799 if (!temp)
800 goto error;
801 Py_DECREF(temp);
802 }
803 /* Pass down previously bound symbols */
804 if (bound) {
805 temp = PyNumber_InPlaceOr(newbound, bound);
806 if (!temp)
807 goto error;
808 Py_DECREF(temp);
809 }
810 /* Pass down known globals */
811 temp = PyNumber_InPlaceOr(newglobal, global);
812 if (!temp)
813 goto error;
814 Py_DECREF(temp);
815 }
816 else {
817 /* Special-case __class__ */
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000818 if (!GET_IDENTIFIER(__class__))
819 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 if (PySet_Add(newbound, __class__) < 0)
821 goto error;
822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823
Eli Benderskydd97fbb2011-04-10 07:37:26 +0300824 /* Recursively call analyze_child_block() on each child block.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 newbound, newglobal now contain the names visible in
827 nested blocks. The free variables in the children will
828 be collected in allfree.
829 */
830 allfree = PySet_New(NULL);
831 if (!allfree)
832 goto error;
833 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
834 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
835 PySTEntryObject* entry;
836 assert(c && PySTEntry_Check(c));
837 entry = (PySTEntryObject*)c;
838 if (!analyze_child_block(entry, newbound, newfree, newglobal,
839 allfree))
840 goto error;
841 /* Check if any children have free variables */
842 if (entry->ste_free || entry->ste_child_free)
843 ste->ste_child_free = 1;
844 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 temp = PyNumber_InPlaceOr(newfree, allfree);
847 if (!temp)
848 goto error;
849 Py_DECREF(temp);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 /* Check if any local variables must be converted to cell variables */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500852 if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 goto error;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500854 else if (ste->ste_type == ClassBlock && !drop_class_free(ste, newfree))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 goto error;
856 /* Records the results of the analysis in the symbol table entry */
857 if (!update_symbols(ste->ste_symbols, scopes, bound, newfree,
858 ste->ste_type == ClassBlock))
859 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 temp = PyNumber_InPlaceOr(free, newfree);
862 if (!temp)
863 goto error;
864 Py_DECREF(temp);
865 success = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 Py_XDECREF(scopes);
868 Py_XDECREF(local);
869 Py_XDECREF(newbound);
870 Py_XDECREF(newglobal);
871 Py_XDECREF(newfree);
872 Py_XDECREF(allfree);
873 if (!success)
874 assert(PyErr_Occurred());
875 return success;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876}
877
878static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
880 PyObject *global, PyObject* child_free)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
883 PyObject *temp;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 /* Copy the bound and global dictionaries.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000886
Martin Panter3ee62702016-06-04 04:57:19 +0000887 These dictionaries are used by all blocks enclosed by the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 current block. The analyze_block() call modifies these
889 dictionaries.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 */
892 temp_bound = PySet_New(bound);
893 if (!temp_bound)
894 goto error;
895 temp_free = PySet_New(free);
896 if (!temp_free)
897 goto error;
898 temp_global = PySet_New(global);
899 if (!temp_global)
900 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 if (!analyze_block(entry, temp_bound, temp_free, temp_global))
903 goto error;
904 temp = PyNumber_InPlaceOr(child_free, temp_free);
905 if (!temp)
906 goto error;
907 Py_DECREF(temp);
908 Py_DECREF(temp_bound);
909 Py_DECREF(temp_free);
910 Py_DECREF(temp_global);
911 return 1;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000912 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 Py_XDECREF(temp_bound);
914 Py_XDECREF(temp_free);
915 Py_XDECREF(temp_global);
916 return 0;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000917}
918
919static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920symtable_analyze(struct symtable *st)
921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 PyObject *free, *global;
923 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 free = PySet_New(NULL);
926 if (!free)
927 return 0;
928 global = PySet_New(NULL);
929 if (!global) {
930 Py_DECREF(free);
931 return 0;
932 }
933 r = analyze_block(st->st_top, NULL, free, global);
934 Py_DECREF(free);
935 Py_DECREF(global);
936 return r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937}
938
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000939/* symtable_enter_block() gets a reference via ste_new.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 This reference is released when the block is exited, via the DECREF
941 in symtable_exit_block().
942*/
943
944static int
Andy Lester95668422020-03-06 09:46:04 -0600945symtable_exit_block(struct symtable *st)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946{
Benjamin Peterson609da582011-06-29 22:52:39 -0500947 Py_ssize_t size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948
Benjamin Peterson609da582011-06-29 22:52:39 -0500949 st->st_cur = NULL;
950 size = PyList_GET_SIZE(st->st_stack);
951 if (size) {
Benjamin Peterson609da582011-06-29 22:52:39 -0500952 if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 return 0;
Benjamin Peterson9d872e12011-07-02 09:22:13 -0500954 if (--size)
955 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, size - 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 }
957 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958}
959
960static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000962 void *ast, int lineno, int col_offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963{
Benjamin Peterson609da582011-06-29 22:52:39 -0500964 PySTEntryObject *prev = NULL, *ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965
Benjamin Peterson609da582011-06-29 22:52:39 -0500966 ste = ste_new(st, name, block, ast, lineno, col_offset);
967 if (ste == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 return 0;
Benjamin Peterson609da582011-06-29 22:52:39 -0500969 if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) {
970 Py_DECREF(ste);
971 return 0;
972 }
973 prev = st->st_cur;
Nick Coghlan5dbe0f52019-08-25 23:45:40 +1000974 /* bpo-37757: For now, disallow *all* assignment expressions in the
975 * outermost iterator expression of a comprehension, even those inside
976 * a nested comprehension or a lambda expression.
977 */
978 if (prev) {
979 ste->ste_comp_iter_expr = prev->ste_comp_iter_expr;
980 }
Benjamin Peterson609da582011-06-29 22:52:39 -0500981 /* The entry is owned by the stack. Borrow it for st_cur. */
982 Py_DECREF(ste);
983 st->st_cur = ste;
Benjamin Peterson230b2062010-10-16 03:45:45 +0000984 if (block == ModuleBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 st->st_global = st->st_cur->ste_symbols;
986 if (prev) {
Benjamin Peterson609da582011-06-29 22:52:39 -0500987 if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 return 0;
989 }
990 }
991 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992}
993
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000994static long
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995symtable_lookup(struct symtable *st, PyObject *name)
996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 PyObject *mangled = _Py_Mangle(st->st_private, name);
998 if (!mangled)
999 return 0;
Pablo Galindo4901dc42019-08-26 16:14:07 +01001000 long ret = _PyST_GetSymbol(st->st_cur, mangled);
1001 Py_DECREF(mangled);
1002 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003}
1004
1005static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001006symtable_add_def_helper(struct symtable *st, PyObject *name, int flag, struct _symtable_entry *ste)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 PyObject *o;
1009 PyObject *dict;
1010 long val;
1011 PyObject *mangled = _Py_Mangle(st->st_private, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012
Jeremy Hylton81e95022007-02-27 06:50:52 +00001013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 if (!mangled)
1015 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001016 dict = ste->ste_symbols;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001017 if ((o = PyDict_GetItemWithError(dict, mangled))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 val = PyLong_AS_LONG(o);
1019 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
1020 /* Is it better to use 'mangled' or 'name' here? */
1021 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, name);
Victor Stinner14e461d2013-08-26 22:28:21 +02001022 PyErr_SyntaxLocationObject(st->st_filename,
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001023 ste->ste_lineno,
1024 ste->ste_col_offset + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 goto error;
1026 }
1027 val |= flag;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001028 }
1029 else if (PyErr_Occurred()) {
1030 goto error;
1031 }
1032 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 val = flag;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001034 }
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001035 if (ste->ste_comp_iter_target) {
1036 /* This name is an iteration variable in a comprehension,
1037 * so check for a binding conflict with any named expressions.
1038 * Otherwise, mark it as an iteration variable so subsequent
1039 * named expressions can check for conflicts.
1040 */
1041 if (val & (DEF_GLOBAL | DEF_NONLOCAL)) {
1042 PyErr_Format(PyExc_SyntaxError,
1043 NAMED_EXPR_COMP_INNER_LOOP_CONFLICT, name);
1044 PyErr_SyntaxLocationObject(st->st_filename,
1045 ste->ste_lineno,
1046 ste->ste_col_offset + 1);
1047 goto error;
1048 }
1049 val |= DEF_COMP_ITER;
1050 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 o = PyLong_FromLong(val);
1052 if (o == NULL)
1053 goto error;
1054 if (PyDict_SetItem(dict, mangled, o) < 0) {
1055 Py_DECREF(o);
1056 goto error;
1057 }
1058 Py_DECREF(o);
1059
1060 if (flag & DEF_PARAM) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001061 if (PyList_Append(ste->ste_varnames, mangled) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 goto error;
1063 } else if (flag & DEF_GLOBAL) {
1064 /* XXX need to update DEF_GLOBAL for other flags too;
1065 perhaps only DEF_FREE_GLOBAL */
1066 val = flag;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001067 if ((o = PyDict_GetItemWithError(st->st_global, mangled))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 val |= PyLong_AS_LONG(o);
1069 }
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001070 else if (PyErr_Occurred()) {
1071 goto error;
1072 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 o = PyLong_FromLong(val);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074 if (o == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 goto error;
1076 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
1077 Py_DECREF(o);
1078 goto error;
1079 }
1080 Py_DECREF(o);
1081 }
1082 Py_DECREF(mangled);
1083 return 1;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001084
1085error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 Py_DECREF(mangled);
1087 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088}
1089
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001090static int
1091symtable_add_def(struct symtable *st, PyObject *name, int flag) {
1092 return symtable_add_def_helper(st, name, flag, st->st_cur);
1093}
1094
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
1096 They use the ASDL name to synthesize the name of the C type and the visit
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 function.
1098
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
1100 useful if the first node in the sequence requires special treatment.
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001101
1102 VISIT_QUIT macro returns the specified value exiting from the function but
1103 first adjusts current recursion counter depth.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104*/
1105
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001106#define VISIT_QUIT(ST, X) \
1107 return --(ST)->recursion_depth,(X)
1108
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109#define VISIT(ST, TYPE, V) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 if (!symtable_visit_ ## TYPE((ST), (V))) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001111 VISIT_QUIT((ST), 0);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001112
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113#define VISIT_SEQ(ST, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 int i; \
Pablo Galindoa5634c42020-09-16 19:42:00 +01001115 asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
1117 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1118 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001119 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001122
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 int i; \
Pablo Galindoa5634c42020-09-16 19:42:00 +01001125 asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
1127 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1128 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001129 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001132
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001133#define VISIT_SEQ_WITH_NULL(ST, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 int i = 0; \
Pablo Galindoa5634c42020-09-16 19:42:00 +01001135 asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001137 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 if (!elt) continue; /* can be NULL */ \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001139 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001140 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 } \
Guido van Rossum4f72a782006-10-27 23:31:49 +00001142}
1143
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001145symtable_record_directive(struct symtable *st, identifier name, int lineno, int col_offset)
Benjamin Petersond9c87022012-10-31 20:26:20 -04001146{
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -06001147 PyObject *data, *mangled;
Benjamin Petersond9c87022012-10-31 20:26:20 -04001148 int res;
1149 if (!st->st_cur->ste_directives) {
1150 st->st_cur->ste_directives = PyList_New(0);
1151 if (!st->st_cur->ste_directives)
1152 return 0;
1153 }
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -06001154 mangled = _Py_Mangle(st->st_private, name);
1155 if (!mangled)
1156 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001157 data = Py_BuildValue("(Nii)", mangled, lineno, col_offset);
Benjamin Petersond9c87022012-10-31 20:26:20 -04001158 if (!data)
1159 return 0;
1160 res = PyList_Append(st->st_cur->ste_directives, data);
1161 Py_DECREF(data);
1162 return res == 0;
1163}
1164
1165
1166static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167symtable_visit_stmt(struct symtable *st, stmt_ty s)
1168{
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001169 if (++st->recursion_depth > st->recursion_limit) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04001170 PyErr_SetString(PyExc_RecursionError,
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001171 "maximum recursion depth exceeded during compilation");
1172 VISIT_QUIT(st, 0);
1173 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 switch (s->kind) {
1175 case FunctionDef_kind:
1176 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001177 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 if (s->v.FunctionDef.args->defaults)
1179 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
1180 if (s->v.FunctionDef.args->kw_defaults)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001181 VISIT_SEQ_WITH_NULL(st, expr, s->v.FunctionDef.args->kw_defaults);
Andy Lester95668422020-03-06 09:46:04 -06001182 if (!symtable_visit_annotations(st, s->v.FunctionDef.args,
Yury Selivanov75445082015-05-11 22:57:16 -04001183 s->v.FunctionDef.returns))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001184 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 if (s->v.FunctionDef.decorator_list)
1186 VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
1187 if (!symtable_enter_block(st, s->v.FunctionDef.name,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001188 FunctionBlock, (void *)s, s->lineno,
1189 s->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001190 VISIT_QUIT(st, 0);
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001191 VISIT(st, arguments, s->v.FunctionDef.args);
1192 VISIT_SEQ(st, stmt, s->v.FunctionDef.body);
Andy Lester95668422020-03-06 09:46:04 -06001193 if (!symtable_exit_block(st))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001194 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 break;
1196 case ClassDef_kind: {
1197 PyObject *tmp;
1198 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001199 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
1201 VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 if (s->v.ClassDef.decorator_list)
1203 VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
1204 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001205 (void *)s, s->lineno, s->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001206 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 tmp = st->st_private;
1208 st->st_private = s->v.ClassDef.name;
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001209 VISIT_SEQ(st, stmt, s->v.ClassDef.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 st->st_private = tmp;
Andy Lester95668422020-03-06 09:46:04 -06001211 if (!symtable_exit_block(st))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001212 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 break;
1214 }
1215 case Return_kind:
1216 if (s->v.Return.value) {
1217 VISIT(st, expr, s->v.Return.value);
1218 st->st_cur->ste_returns_value = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 }
1220 break;
1221 case Delete_kind:
1222 VISIT_SEQ(st, expr, s->v.Delete.targets);
1223 break;
1224 case Assign_kind:
1225 VISIT_SEQ(st, expr, s->v.Assign.targets);
1226 VISIT(st, expr, s->v.Assign.value);
1227 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001228 case AnnAssign_kind:
1229 if (s->v.AnnAssign.target->kind == Name_kind) {
1230 expr_ty e_name = s->v.AnnAssign.target;
1231 long cur = symtable_lookup(st, e_name->v.Name.id);
1232 if (cur < 0) {
1233 VISIT_QUIT(st, 0);
1234 }
1235 if ((cur & (DEF_GLOBAL | DEF_NONLOCAL))
Pablo Galindode2aea02018-10-14 18:01:03 +01001236 && (st->st_cur->ste_symbols != st->st_global)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001237 && s->v.AnnAssign.simple) {
1238 PyErr_Format(PyExc_SyntaxError,
Guido van Rossum6cff8742016-09-09 09:36:26 -07001239 cur & DEF_GLOBAL ? GLOBAL_ANNOT : NONLOCAL_ANNOT,
1240 e_name->v.Name.id);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001241 PyErr_SyntaxLocationObject(st->st_filename,
1242 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001243 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001244 VISIT_QUIT(st, 0);
1245 }
1246 if (s->v.AnnAssign.simple &&
1247 !symtable_add_def(st, e_name->v.Name.id,
1248 DEF_ANNOT | DEF_LOCAL)) {
1249 VISIT_QUIT(st, 0);
1250 }
1251 else {
1252 if (s->v.AnnAssign.value
1253 && !symtable_add_def(st, e_name->v.Name.id, DEF_LOCAL)) {
1254 VISIT_QUIT(st, 0);
1255 }
1256 }
1257 }
1258 else {
1259 VISIT(st, expr, s->v.AnnAssign.target);
1260 }
1261 VISIT(st, expr, s->v.AnnAssign.annotation);
1262 if (s->v.AnnAssign.value) {
1263 VISIT(st, expr, s->v.AnnAssign.value);
1264 }
1265 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 case AugAssign_kind:
1267 VISIT(st, expr, s->v.AugAssign.target);
1268 VISIT(st, expr, s->v.AugAssign.value);
1269 break;
1270 case For_kind:
1271 VISIT(st, expr, s->v.For.target);
1272 VISIT(st, expr, s->v.For.iter);
1273 VISIT_SEQ(st, stmt, s->v.For.body);
1274 if (s->v.For.orelse)
1275 VISIT_SEQ(st, stmt, s->v.For.orelse);
1276 break;
1277 case While_kind:
1278 VISIT(st, expr, s->v.While.test);
1279 VISIT_SEQ(st, stmt, s->v.While.body);
1280 if (s->v.While.orelse)
1281 VISIT_SEQ(st, stmt, s->v.While.orelse);
1282 break;
1283 case If_kind:
1284 /* XXX if 0: and lookup_yield() hacks */
1285 VISIT(st, expr, s->v.If.test);
1286 VISIT_SEQ(st, stmt, s->v.If.body);
1287 if (s->v.If.orelse)
1288 VISIT_SEQ(st, stmt, s->v.If.orelse);
1289 break;
Brandt Bucher145bf262021-02-26 14:51:55 -08001290 case Match_kind:
1291 VISIT(st, expr, s->v.Match.subject);
1292 VISIT_SEQ(st, match_case, s->v.Match.cases);
1293 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 case Raise_kind:
1295 if (s->v.Raise.exc) {
1296 VISIT(st, expr, s->v.Raise.exc);
Eli Benderskydd97fbb2011-04-10 07:37:26 +03001297 if (s->v.Raise.cause) {
1298 VISIT(st, expr, s->v.Raise.cause);
1299 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 }
1301 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001302 case Try_kind:
1303 VISIT_SEQ(st, stmt, s->v.Try.body);
1304 VISIT_SEQ(st, stmt, s->v.Try.orelse);
1305 VISIT_SEQ(st, excepthandler, s->v.Try.handlers);
1306 VISIT_SEQ(st, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 break;
1308 case Assert_kind:
1309 VISIT(st, expr, s->v.Assert.test);
1310 if (s->v.Assert.msg)
1311 VISIT(st, expr, s->v.Assert.msg);
1312 break;
1313 case Import_kind:
1314 VISIT_SEQ(st, alias, s->v.Import.names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 break;
1316 case ImportFrom_kind:
1317 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 break;
1319 case Global_kind: {
1320 int i;
Pablo Galindoa5634c42020-09-16 19:42:00 +01001321 asdl_identifier_seq *seq = s->v.Global.names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1323 identifier name = (identifier)asdl_seq_GET(seq, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 long cur = symtable_lookup(st, name);
1325 if (cur < 0)
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001326 VISIT_QUIT(st, 0);
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001327 if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT)) {
1328 const char* msg;
1329 if (cur & DEF_PARAM) {
1330 msg = GLOBAL_PARAM;
1331 } else if (cur & USE) {
Guido van Rossum6cff8742016-09-09 09:36:26 -07001332 msg = GLOBAL_AFTER_USE;
Christian Heimes517507c2016-09-23 20:26:30 +02001333 } else if (cur & DEF_ANNOT) {
1334 msg = GLOBAL_ANNOT;
1335 } else { /* DEF_LOCAL */
1336 msg = GLOBAL_AFTER_ASSIGN;
Guido van Rossum6cff8742016-09-09 09:36:26 -07001337 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001338 PyErr_Format(PyExc_SyntaxError,
Guido van Rossum6cff8742016-09-09 09:36:26 -07001339 msg, name);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001340 PyErr_SyntaxLocationObject(st->st_filename,
1341 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001342 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001343 VISIT_QUIT(st, 0);
1344 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 if (!symtable_add_def(st, name, DEF_GLOBAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001346 VISIT_QUIT(st, 0);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001347 if (!symtable_record_directive(st, name, s->lineno, s->col_offset))
Nick Coghlane69bfc32012-11-04 23:53:15 +10001348 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 }
1350 break;
1351 }
1352 case Nonlocal_kind: {
1353 int i;
Pablo Galindoa5634c42020-09-16 19:42:00 +01001354 asdl_identifier_seq *seq = s->v.Nonlocal.names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1356 identifier name = (identifier)asdl_seq_GET(seq, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 long cur = symtable_lookup(st, name);
1358 if (cur < 0)
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001359 VISIT_QUIT(st, 0);
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001360 if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT)) {
1361 const char* msg;
1362 if (cur & DEF_PARAM) {
1363 msg = NONLOCAL_PARAM;
1364 } else if (cur & USE) {
Guido van Rossum6cff8742016-09-09 09:36:26 -07001365 msg = NONLOCAL_AFTER_USE;
Christian Heimes517507c2016-09-23 20:26:30 +02001366 } else if (cur & DEF_ANNOT) {
1367 msg = NONLOCAL_ANNOT;
1368 } else { /* DEF_LOCAL */
1369 msg = NONLOCAL_AFTER_ASSIGN;
Guido van Rossum6cff8742016-09-09 09:36:26 -07001370 }
1371 PyErr_Format(PyExc_SyntaxError, msg, name);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001372 PyErr_SyntaxLocationObject(st->st_filename,
1373 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001374 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001375 VISIT_QUIT(st, 0);
1376 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 if (!symtable_add_def(st, name, DEF_NONLOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001378 VISIT_QUIT(st, 0);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001379 if (!symtable_record_directive(st, name, s->lineno, s->col_offset))
Nick Coghlane69bfc32012-11-04 23:53:15 +10001380 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 }
1382 break;
1383 }
1384 case Expr_kind:
1385 VISIT(st, expr, s->v.Expr.value);
1386 break;
1387 case Pass_kind:
1388 case Break_kind:
1389 case Continue_kind:
1390 /* nothing to do here */
1391 break;
1392 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001393 VISIT_SEQ(st, withitem, s->v.With.items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 VISIT_SEQ(st, stmt, s->v.With.body);
1395 break;
Yury Selivanov75445082015-05-11 22:57:16 -04001396 case AsyncFunctionDef_kind:
1397 if (!symtable_add_def(st, s->v.AsyncFunctionDef.name, DEF_LOCAL))
1398 VISIT_QUIT(st, 0);
1399 if (s->v.AsyncFunctionDef.args->defaults)
1400 VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.args->defaults);
1401 if (s->v.AsyncFunctionDef.args->kw_defaults)
1402 VISIT_SEQ_WITH_NULL(st, expr,
1403 s->v.AsyncFunctionDef.args->kw_defaults);
Andy Lester95668422020-03-06 09:46:04 -06001404 if (!symtable_visit_annotations(st, s->v.AsyncFunctionDef.args,
Yury Selivanov75445082015-05-11 22:57:16 -04001405 s->v.AsyncFunctionDef.returns))
1406 VISIT_QUIT(st, 0);
1407 if (s->v.AsyncFunctionDef.decorator_list)
1408 VISIT_SEQ(st, expr, s->v.AsyncFunctionDef.decorator_list);
1409 if (!symtable_enter_block(st, s->v.AsyncFunctionDef.name,
1410 FunctionBlock, (void *)s, s->lineno,
1411 s->col_offset))
1412 VISIT_QUIT(st, 0);
Yury Selivanoveb636452016-09-08 22:01:51 -07001413 st->st_cur->ste_coroutine = 1;
Yury Selivanov75445082015-05-11 22:57:16 -04001414 VISIT(st, arguments, s->v.AsyncFunctionDef.args);
1415 VISIT_SEQ(st, stmt, s->v.AsyncFunctionDef.body);
Andy Lester95668422020-03-06 09:46:04 -06001416 if (!symtable_exit_block(st))
Yury Selivanov75445082015-05-11 22:57:16 -04001417 VISIT_QUIT(st, 0);
1418 break;
1419 case AsyncWith_kind:
1420 VISIT_SEQ(st, withitem, s->v.AsyncWith.items);
1421 VISIT_SEQ(st, stmt, s->v.AsyncWith.body);
1422 break;
1423 case AsyncFor_kind:
1424 VISIT(st, expr, s->v.AsyncFor.target);
1425 VISIT(st, expr, s->v.AsyncFor.iter);
1426 VISIT_SEQ(st, stmt, s->v.AsyncFor.body);
1427 if (s->v.AsyncFor.orelse)
1428 VISIT_SEQ(st, stmt, s->v.AsyncFor.orelse);
1429 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 }
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001431 VISIT_QUIT(st, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432}
1433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001435symtable_extend_namedexpr_scope(struct symtable *st, expr_ty e)
1436{
1437 assert(st->st_stack);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001438 assert(e->kind == Name_kind);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001439
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001440 PyObject *target_name = e->v.Name.id;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001441 Py_ssize_t i, size;
1442 struct _symtable_entry *ste;
1443 size = PyList_GET_SIZE(st->st_stack);
1444 assert(size);
1445
1446 /* Iterate over the stack in reverse and add to the nearest adequate scope */
1447 for (i = size - 1; i >= 0; i--) {
1448 ste = (struct _symtable_entry *) PyList_GET_ITEM(st->st_stack, i);
1449
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001450 /* If we find a comprehension scope, check for a target
1451 * binding conflict with iteration variables, otherwise skip it
1452 */
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001453 if (ste->ste_comprehension) {
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001454 long target_in_scope = _PyST_GetSymbol(ste, target_name);
1455 if (target_in_scope & DEF_COMP_ITER) {
1456 PyErr_Format(PyExc_SyntaxError, NAMED_EXPR_COMP_CONFLICT, target_name);
1457 PyErr_SyntaxLocationObject(st->st_filename,
1458 e->lineno,
1459 e->col_offset);
1460 VISIT_QUIT(st, 0);
1461 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001462 continue;
1463 }
1464
Pablo Galindofd5c4142019-10-14 05:18:05 +01001465 /* If we find a FunctionBlock entry, add as GLOBAL/LOCAL or NONLOCAL/LOCAL */
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001466 if (ste->ste_type == FunctionBlock) {
Pablo Galindofd5c4142019-10-14 05:18:05 +01001467 long target_in_scope = _PyST_GetSymbol(ste, target_name);
1468 if (target_in_scope & DEF_GLOBAL) {
1469 if (!symtable_add_def(st, target_name, DEF_GLOBAL))
1470 VISIT_QUIT(st, 0);
1471 } else {
1472 if (!symtable_add_def(st, target_name, DEF_NONLOCAL))
1473 VISIT_QUIT(st, 0);
1474 }
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001475 if (!symtable_record_directive(st, target_name, e->lineno, e->col_offset))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001476 VISIT_QUIT(st, 0);
1477
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001478 return symtable_add_def_helper(st, target_name, DEF_LOCAL, ste);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001479 }
1480 /* If we find a ModuleBlock entry, add as GLOBAL */
1481 if (ste->ste_type == ModuleBlock) {
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001482 if (!symtable_add_def(st, target_name, DEF_GLOBAL))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001483 VISIT_QUIT(st, 0);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001484 if (!symtable_record_directive(st, target_name, e->lineno, e->col_offset))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001485 VISIT_QUIT(st, 0);
1486
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001487 return symtable_add_def_helper(st, target_name, DEF_GLOBAL, ste);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001488 }
1489 /* Disallow usage in ClassBlock */
1490 if (ste->ste_type == ClassBlock) {
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001491 PyErr_Format(PyExc_SyntaxError, NAMED_EXPR_COMP_IN_CLASS);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001492 PyErr_SyntaxLocationObject(st->st_filename,
1493 e->lineno,
1494 e->col_offset);
1495 VISIT_QUIT(st, 0);
1496 }
1497 }
1498
1499 /* We should always find either a FunctionBlock, ModuleBlock or ClassBlock
1500 and should never fall to this case
1501 */
1502 assert(0);
1503 return 0;
1504}
1505
1506static int
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001507symtable_handle_namedexpr(struct symtable *st, expr_ty e)
1508{
1509 if (st->st_cur->ste_comp_iter_expr > 0) {
1510 /* Assignment isn't allowed in a comprehension iterable expression */
1511 PyErr_Format(PyExc_SyntaxError, NAMED_EXPR_COMP_ITER_EXPR);
1512 PyErr_SyntaxLocationObject(st->st_filename,
1513 e->lineno,
1514 e->col_offset);
Nick Coghlan06145232019-08-29 23:26:53 +10001515 return 0;
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001516 }
1517 if (st->st_cur->ste_comprehension) {
1518 /* Inside a comprehension body, so find the right target scope */
1519 if (!symtable_extend_namedexpr_scope(st, e->v.NamedExpr.target))
Nick Coghlan06145232019-08-29 23:26:53 +10001520 return 0;
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001521 }
1522 VISIT(st, expr, e->v.NamedExpr.value);
1523 VISIT(st, expr, e->v.NamedExpr.target);
Nick Coghlan06145232019-08-29 23:26:53 +10001524 return 1;
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001525}
1526
1527static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528symtable_visit_expr(struct symtable *st, expr_ty e)
1529{
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001530 if (++st->recursion_depth > st->recursion_limit) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04001531 PyErr_SetString(PyExc_RecursionError,
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001532 "maximum recursion depth exceeded during compilation");
1533 VISIT_QUIT(st, 0);
1534 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001536 case NamedExpr_kind:
Pablo Galindo0e4ea162019-08-26 15:52:25 +01001537 if(!symtable_handle_namedexpr(st, e))
1538 VISIT_QUIT(st, 0);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001539 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 case BoolOp_kind:
1541 VISIT_SEQ(st, expr, e->v.BoolOp.values);
1542 break;
1543 case BinOp_kind:
1544 VISIT(st, expr, e->v.BinOp.left);
1545 VISIT(st, expr, e->v.BinOp.right);
1546 break;
1547 case UnaryOp_kind:
1548 VISIT(st, expr, e->v.UnaryOp.operand);
1549 break;
1550 case Lambda_kind: {
1551 if (!GET_IDENTIFIER(lambda))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001552 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 if (e->v.Lambda.args->defaults)
1554 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
Amaury Forgeot d'Arc97c1bef2011-11-04 22:17:45 +01001555 if (e->v.Lambda.args->kw_defaults)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001556 VISIT_SEQ_WITH_NULL(st, expr, e->v.Lambda.args->kw_defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 if (!symtable_enter_block(st, lambda,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001558 FunctionBlock, (void *)e, e->lineno,
1559 e->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001560 VISIT_QUIT(st, 0);
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001561 VISIT(st, arguments, e->v.Lambda.args);
1562 VISIT(st, expr, e->v.Lambda.body);
Andy Lester95668422020-03-06 09:46:04 -06001563 if (!symtable_exit_block(st))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001564 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 break;
1566 }
1567 case IfExp_kind:
1568 VISIT(st, expr, e->v.IfExp.test);
1569 VISIT(st, expr, e->v.IfExp.body);
1570 VISIT(st, expr, e->v.IfExp.orelse);
1571 break;
1572 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001573 VISIT_SEQ_WITH_NULL(st, expr, e->v.Dict.keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 VISIT_SEQ(st, expr, e->v.Dict.values);
1575 break;
1576 case Set_kind:
1577 VISIT_SEQ(st, expr, e->v.Set.elts);
1578 break;
1579 case GeneratorExp_kind:
1580 if (!symtable_visit_genexp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001581 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 break;
1583 case ListComp_kind:
1584 if (!symtable_visit_listcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001585 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 break;
1587 case SetComp_kind:
1588 if (!symtable_visit_setcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001589 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 break;
1591 case DictComp_kind:
1592 if (!symtable_visit_dictcomp(st, e))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001593 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 break;
1595 case Yield_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +00001596 if (e->v.Yield.value)
1597 VISIT(st, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 st->st_cur->ste_generator = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00001600 case YieldFrom_kind:
1601 VISIT(st, expr, e->v.YieldFrom.value);
1602 st->st_cur->ste_generator = 1;
1603 break;
Yury Selivanov75445082015-05-11 22:57:16 -04001604 case Await_kind:
1605 VISIT(st, expr, e->v.Await.value);
Yury Selivanoveb636452016-09-08 22:01:51 -07001606 st->st_cur->ste_coroutine = 1;
Yury Selivanov75445082015-05-11 22:57:16 -04001607 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 case Compare_kind:
1609 VISIT(st, expr, e->v.Compare.left);
1610 VISIT_SEQ(st, expr, e->v.Compare.comparators);
1611 break;
1612 case Call_kind:
1613 VISIT(st, expr, e->v.Call.func);
1614 VISIT_SEQ(st, expr, e->v.Call.args);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001615 VISIT_SEQ_WITH_NULL(st, keyword, e->v.Call.keywords);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04001617 case FormattedValue_kind:
1618 VISIT(st, expr, e->v.FormattedValue.value);
1619 if (e->v.FormattedValue.format_spec)
1620 VISIT(st, expr, e->v.FormattedValue.format_spec);
1621 break;
1622 case JoinedStr_kind:
1623 VISIT_SEQ(st, expr, e->v.JoinedStr.values);
1624 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001625 case Constant_kind:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 /* Nothing to do here. */
1627 break;
1628 /* The following exprs can be assignment targets. */
1629 case Attribute_kind:
1630 VISIT(st, expr, e->v.Attribute.value);
1631 break;
1632 case Subscript_kind:
1633 VISIT(st, expr, e->v.Subscript.value);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001634 VISIT(st, expr, e->v.Subscript.slice);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 break;
1636 case Starred_kind:
1637 VISIT(st, expr, e->v.Starred.value);
1638 break;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001639 case Slice_kind:
1640 if (e->v.Slice.lower)
1641 VISIT(st, expr, e->v.Slice.lower)
1642 if (e->v.Slice.upper)
1643 VISIT(st, expr, e->v.Slice.upper)
1644 if (e->v.Slice.step)
1645 VISIT(st, expr, e->v.Slice.step)
1646 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 case Name_kind:
Brandt Bucher145bf262021-02-26 14:51:55 -08001648 // Don't make "_" a local when used in a pattern:
1649 if (st->in_pattern &&
1650 e->v.Name.ctx == Store &&
1651 _PyUnicode_EqualToASCIIString(e->v.Name.id, "_"))
1652 {
1653 break;
1654 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 if (!symtable_add_def(st, e->v.Name.id,
1656 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001657 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 /* Special-case super: it counts as a use of __class__ */
1659 if (e->v.Name.ctx == Load &&
1660 st->st_cur->ste_type == FunctionBlock &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001661 _PyUnicode_EqualToASCIIString(e->v.Name.id, "super")) {
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10001662 if (!GET_IDENTIFIER(__class__) ||
1663 !symtable_add_def(st, __class__, USE))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001664 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 }
1666 break;
1667 /* child nodes of List and Tuple will have expr_context set */
1668 case List_kind:
1669 VISIT_SEQ(st, expr, e->v.List.elts);
1670 break;
1671 case Tuple_kind:
1672 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1673 break;
Brandt Bucher145bf262021-02-26 14:51:55 -08001674 case MatchAs_kind:
1675 VISIT(st, expr, e->v.MatchAs.pattern);
1676 symtable_add_def(st, e->v.MatchAs.name, DEF_LOCAL);
1677 break;
1678 case MatchOr_kind:
1679 VISIT_SEQ(st, expr, e->v.MatchOr.patterns);
1680 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 }
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001682 VISIT_QUIT(st, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683}
1684
1685static int
1686symtable_implicit_arg(struct symtable *st, int pos)
1687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 PyObject *id = PyUnicode_FromFormat(".%d", pos);
1689 if (id == NULL)
1690 return 0;
1691 if (!symtable_add_def(st, id, DEF_PARAM)) {
1692 Py_DECREF(id);
1693 return 0;
1694 }
1695 Py_DECREF(id);
1696 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697}
1698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001700symtable_visit_params(struct symtable *st, asdl_arg_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 int i;
Neal Norwitzc1505362006-12-28 06:47:50 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (!args)
1705 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 for (i = 0; i < asdl_seq_LEN(args); i++) {
1708 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1709 if (!symtable_add_def(st, arg->arg, DEF_PARAM))
1710 return 0;
1711 }
1712
1713 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714}
1715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001717symtable_visit_argannotations(struct symtable *st, asdl_arg_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 int i;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 if (!args)
1722 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 for (i = 0; i < asdl_seq_LEN(args); i++) {
1725 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1726 if (arg->annotation)
1727 VISIT(st, expr, arg->annotation);
1728 }
1729
1730 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001731}
1732
Neal Norwitzc1505362006-12-28 06:47:50 +00001733static int
Andy Lester95668422020-03-06 09:46:04 -06001734symtable_visit_annotations(struct symtable *st, arguments_ty a, expr_ty returns)
Neal Norwitzc1505362006-12-28 06:47:50 +00001735{
Anthony Sottileec007cb2020-01-04 20:57:21 -05001736 if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs))
1737 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 if (a->args && !symtable_visit_argannotations(st, a->args))
1739 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001740 if (a->vararg && a->vararg->annotation)
1741 VISIT(st, expr, a->vararg->annotation);
1742 if (a->kwarg && a->kwarg->annotation)
1743 VISIT(st, expr, a->kwarg->annotation);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 if (a->kwonlyargs && !symtable_visit_argannotations(st, a->kwonlyargs))
1745 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001746 if (returns)
Yury Selivanovb7666a32015-07-22 14:48:57 +03001747 VISIT(st, expr, returns);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749}
1750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752symtable_visit_arguments(struct symtable *st, arguments_ty a)
1753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 /* skip default arguments inside function block
1755 XXX should ast be different?
1756 */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001757 if (a->posonlyargs && !symtable_visit_params(st, a->posonlyargs))
1758 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 if (a->args && !symtable_visit_params(st, a->args))
1760 return 0;
1761 if (a->kwonlyargs && !symtable_visit_params(st, a->kwonlyargs))
1762 return 0;
1763 if (a->vararg) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001764 if (!symtable_add_def(st, a->vararg->arg, DEF_PARAM))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 return 0;
1766 st->st_cur->ste_varargs = 1;
1767 }
1768 if (a->kwarg) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001769 if (!symtable_add_def(st, a->kwarg->arg, DEF_PARAM))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 return 0;
1771 st->st_cur->ste_varkeywords = 1;
1772 }
1773 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774}
1775
1776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 if (eh->v.ExceptHandler.type)
1781 VISIT(st, expr, eh->v.ExceptHandler.type);
1782 if (eh->v.ExceptHandler.name)
1783 if (!symtable_add_def(st, eh->v.ExceptHandler.name, DEF_LOCAL))
1784 return 0;
1785 VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
1786 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787}
1788
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001789static int
1790symtable_visit_withitem(struct symtable *st, withitem_ty item)
1791{
1792 VISIT(st, expr, item->context_expr);
1793 if (item->optional_vars) {
1794 VISIT(st, expr, item->optional_vars);
1795 }
1796 return 1;
1797}
1798
Brandt Bucher145bf262021-02-26 14:51:55 -08001799static int
1800symtable_visit_match_case(struct symtable *st, match_case_ty m)
1801{
1802 assert(!st->in_pattern);
1803 st->in_pattern = 1;
1804 VISIT(st, expr, m->pattern);
1805 assert(st->in_pattern);
1806 st->in_pattern = 0;
1807 if (m->guard) {
1808 VISIT(st, expr, m->guard);
1809 }
1810 VISIT_SEQ(st, stmt, m->body);
1811 return 1;
1812}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001815symtable_visit_alias(struct symtable *st, alias_ty a)
1816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 /* Compute store_name, the name actually bound by the import
Benjamin Petersonc629d512010-06-11 21:53:07 +00001818 operation. It is different than a->name when a->name is a
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 dotted package name (e.g. spam.eggs)
1820 */
1821 PyObject *store_name;
1822 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001823 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
1824 PyUnicode_GET_LENGTH(name), 1);
1825 if (dot != -1) {
1826 store_name = PyUnicode_Substring(name, 0, dot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 if (!store_name)
1828 return 0;
1829 }
1830 else {
1831 store_name = name;
1832 Py_INCREF(store_name);
1833 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001834 if (!_PyUnicode_EqualToASCIIString(name, "*")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1836 Py_DECREF(store_name);
1837 return r;
1838 }
1839 else {
1840 if (st->st_cur->ste_type != ModuleBlock) {
Benjamin Petersonb7149ca2011-06-20 22:09:13 -05001841 int lineno = st->st_cur->ste_lineno;
1842 int col_offset = st->st_cur->ste_col_offset;
1843 PyErr_SetString(PyExc_SyntaxError, IMPORT_STAR_WARNING);
Ammar Askar025eb982018-09-24 17:12:49 -04001844 PyErr_SyntaxLocationObject(st->st_filename, lineno, col_offset + 1);
Benjamin Petersonb7149ca2011-06-20 22:09:13 -05001845 Py_DECREF(store_name);
1846 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 Py_DECREF(store_name);
1849 return 1;
1850 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851}
1852
1853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1856{
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001857 st->st_cur->ste_comp_iter_target = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 VISIT(st, expr, lc->target);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001859 st->st_cur->ste_comp_iter_target = 0;
1860 st->st_cur->ste_comp_iter_expr++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 VISIT(st, expr, lc->iter);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001862 st->st_cur->ste_comp_iter_expr--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 VISIT_SEQ(st, expr, lc->ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001864 if (lc->is_async) {
1865 st->st_cur->ste_coroutine = 1;
1866 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868}
1869
1870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872symtable_visit_keyword(struct symtable *st, keyword_ty k)
1873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 VISIT(st, expr, k->value);
1875 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876}
1877
1878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001880symtable_handle_comprehension(struct symtable *st, expr_ty e,
Pablo Galindoa5634c42020-09-16 19:42:00 +01001881 identifier scope_name, asdl_comprehension_seq *generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00001882 expr_ty elt, expr_ty value)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 int is_generator = (e->kind == GeneratorExp_kind);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 comprehension_ty outermost = ((comprehension_ty)
1886 asdl_seq_GET(generators, 0));
1887 /* Outermost iterator is evaluated in current scope */
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001888 st->st_cur->ste_comp_iter_expr++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 VISIT(st, expr, outermost->iter);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001890 st->st_cur->ste_comp_iter_expr--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 /* Create comprehension scope for the rest */
1892 if (!scope_name ||
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001893 !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e,
1894 e->lineno, e->col_offset)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 return 0;
1896 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001897 if (outermost->is_async) {
1898 st->st_cur->ste_coroutine = 1;
1899 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001900 st->st_cur->ste_comprehension = 1;
1901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 /* Outermost iter is received as an argument */
1903 if (!symtable_implicit_arg(st, 0)) {
Andy Lester95668422020-03-06 09:46:04 -06001904 symtable_exit_block(st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 return 0;
1906 }
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001907 /* Visit iteration variable target, and mark them as such */
1908 st->st_cur->ste_comp_iter_target = 1;
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001909 VISIT(st, expr, outermost->target);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001910 st->st_cur->ste_comp_iter_target = 0;
1911 /* Visit the rest of the comprehension body */
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001912 VISIT_SEQ(st, expr, outermost->ifs);
1913 VISIT_SEQ_TAIL(st, comprehension, generators, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 if (value)
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001915 VISIT(st, expr, value);
1916 VISIT(st, expr, elt);
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001917 if (st->st_cur->ste_generator) {
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001918 PyErr_SetString(PyExc_SyntaxError,
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001919 (e->kind == ListComp_kind) ? "'yield' inside list comprehension" :
1920 (e->kind == SetComp_kind) ? "'yield' inside set comprehension" :
1921 (e->kind == DictComp_kind) ? "'yield' inside dict comprehension" :
1922 "'yield' inside generator expression");
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001923 PyErr_SyntaxLocationObject(st->st_filename,
1924 st->st_cur->ste_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001925 st->st_cur->ste_col_offset + 1);
Andy Lester95668422020-03-06 09:46:04 -06001926 symtable_exit_block(st);
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001927 return 0;
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001928 }
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001929 st->st_cur->ste_generator = is_generator;
Andy Lester95668422020-03-06 09:46:04 -06001930 return symtable_exit_block(st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931}
Nick Coghlan650f0d02007-04-15 12:05:43 +00001932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001934symtable_visit_genexp(struct symtable *st, expr_ty e)
1935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
1937 e->v.GeneratorExp.generators,
1938 e->v.GeneratorExp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001939}
1940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001942symtable_visit_listcomp(struct symtable *st, expr_ty e)
1943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(listcomp),
1945 e->v.ListComp.generators,
1946 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001947}
1948
1949static int
1950symtable_visit_setcomp(struct symtable *st, expr_ty e)
1951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
1953 e->v.SetComp.generators,
1954 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001955}
1956
1957static int
1958symtable_visit_dictcomp(struct symtable *st, expr_ty e)
1959{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp),
1961 e->v.DictComp.generators,
1962 e->v.DictComp.key,
1963 e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001964}
Victor Stinner28ad12f2021-03-19 12:41:49 +01001965
1966
1967struct symtable *
1968_Py_SymtableStringObjectFlags(const char *str, PyObject *filename,
1969 int start, PyCompilerFlags *flags)
1970{
1971 struct symtable *st;
1972 mod_ty mod;
1973 PyArena *arena;
1974
1975 arena = PyArena_New();
1976 if (arena == NULL)
1977 return NULL;
1978
Victor Stinner57364ce2021-03-24 01:29:09 +01001979 mod = _PyParser_ASTFromString(str, filename, start, flags, arena);
Victor Stinner28ad12f2021-03-19 12:41:49 +01001980 if (mod == NULL) {
1981 PyArena_Free(arena);
1982 return NULL;
1983 }
1984 st = _PySymtable_Build(mod, filename, 0);
1985 PyArena_Free(arena);
1986 return st;
1987}