blob: d192f31deefb77ae03f0aac11930ccf3b8455b5e [file] [log] [blame]
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001#include "Python.h"
Victor Stinnere5014be2020-04-14 17:52:15 +02002#include "pycore_pystate.h" // _PyThreadState_GET()
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003#include "symtable.h"
Victor Stinner3bb183d2018-11-22 18:38:38 +01004#undef Yield /* undefine macro conflicting with <winbase.h> */
Victor Stinner4a21e572020-04-15 02:35:41 +02005#include "structmember.h" // PyMemberDef
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006
Neal Norwitz5d0ad502005-12-19 04:27:42 +00007/* error strings used for warnings */
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02008#define GLOBAL_PARAM \
9"name '%U' is parameter and global"
10
11#define NONLOCAL_PARAM \
12"name '%U' is parameter and nonlocal"
13
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#define GLOBAL_AFTER_ASSIGN \
Guido van Rossum6cff8742016-09-09 09:36:26 -070015"name '%U' is assigned to before global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000016
Jeremy Hylton81e95022007-02-27 06:50:52 +000017#define NONLOCAL_AFTER_ASSIGN \
Guido van Rossum6cff8742016-09-09 09:36:26 -070018"name '%U' is assigned to before nonlocal declaration"
Jeremy Hylton81e95022007-02-27 06:50:52 +000019
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000020#define GLOBAL_AFTER_USE \
Guido van Rossum6cff8742016-09-09 09:36:26 -070021"name '%U' is used prior to global declaration"
Jeremy Hylton29906402001-12-10 00:53:18 +000022
Jeremy Hylton81e95022007-02-27 06:50:52 +000023#define NONLOCAL_AFTER_USE \
Guido van Rossum6cff8742016-09-09 09:36:26 -070024"name '%U' is used prior to nonlocal declaration"
25
26#define GLOBAL_ANNOT \
27"annotated name '%U' can't be global"
28
29#define NONLOCAL_ANNOT \
30"annotated name '%U' can't be nonlocal"
Jeremy Hylton81e95022007-02-27 06:50:52 +000031
Neal Norwitz5d0ad502005-12-19 04:27:42 +000032#define IMPORT_STAR_WARNING "import * only allowed at module level"
33
Emily Morehouse8f59ee02019-01-24 16:49:56 -070034#define NAMED_EXPR_COMP_IN_CLASS \
Nick Coghlan5dbe0f52019-08-25 23:45:40 +100035"assignment expression within a comprehension cannot be used in a class body"
36
37#define NAMED_EXPR_COMP_CONFLICT \
38"assignment expression cannot rebind comprehension iteration variable '%U'"
39
40#define NAMED_EXPR_COMP_INNER_LOOP_CONFLICT \
41"comprehension inner loop cannot rebind assignment expression target '%U'"
42
43#define NAMED_EXPR_COMP_ITER_EXPR \
44"assignment expression cannot be used in a comprehension iterable expression"
Emily Morehouse8f59ee02019-01-24 16:49:56 -070045
Neal Norwitz090b3dd2006-02-28 22:36:46 +000046static PySTEntryObject *
Benjamin Peterson55e00f22008-08-17 18:02:44 +000047ste_new(struct symtable *st, identifier name, _Py_block_ty block,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000048 void *key, int lineno, int col_offset)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 PySTEntryObject *ste = NULL;
Christian Heimes837e53a2012-09-10 03:08:46 +020051 PyObject *k = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 k = PyLong_FromVoidPtr(key);
54 if (k == NULL)
55 goto fail;
56 ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
Christian Heimes55ad6512012-09-12 17:58:10 +020057 if (ste == NULL) {
58 Py_DECREF(k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 goto fail;
Christian Heimes55ad6512012-09-12 17:58:10 +020060 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 ste->ste_table = st;
Christian Heimes15265822012-09-12 17:52:46 +020062 ste->ste_id = k; /* ste owns reference to k */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 Py_INCREF(name);
Victor Stinner9a4fb662013-07-11 22:49:00 +020065 ste->ste_name = name;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 ste->ste_symbols = NULL;
68 ste->ste_varnames = NULL;
69 ste->ste_children = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000070
Benjamin Petersond9c87022012-10-31 20:26:20 -040071 ste->ste_directives = NULL;
72
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 ste->ste_type = block;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 ste->ste_nested = 0;
75 ste->ste_free = 0;
76 ste->ste_varargs = 0;
77 ste->ste_varkeywords = 0;
78 ste->ste_opt_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000079 ste->ste_opt_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 ste->ste_lineno = lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +000081 ste->ste_col_offset = col_offset;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 if (st->st_cur != NULL &&
84 (st->st_cur->ste_nested ||
85 st->st_cur->ste_type == FunctionBlock))
86 ste->ste_nested = 1;
87 ste->ste_child_free = 0;
88 ste->ste_generator = 0;
Yury Selivanoveb636452016-09-08 22:01:51 -070089 ste->ste_coroutine = 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -070090 ste->ste_comprehension = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 ste->ste_returns_value = 0;
Benjamin Peterson312595c2013-05-15 15:26:42 -050092 ste->ste_needs_class_closure = 0;
Nick Coghlan5dbe0f52019-08-25 23:45:40 +100093 ste->ste_comp_iter_target = 0;
94 ste->ste_comp_iter_expr = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000095
Victor Stinner9a4fb662013-07-11 22:49:00 +020096 ste->ste_symbols = PyDict_New();
97 ste->ste_varnames = PyList_New(0);
98 ste->ste_children = PyList_New(0);
99 if (ste->ste_symbols == NULL
100 || ste->ste_varnames == NULL
101 || ste->ste_children == NULL)
102 goto fail;
103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0)
105 goto fail;
106
107 return ste;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000108 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 Py_XDECREF(ste);
110 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000111}
112
113static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114ste_repr(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 return PyUnicode_FromFormat("<symtable entry %U(%ld), line %d>",
117 ste->ste_name,
118 PyLong_AS_LONG(ste->ste_id), ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000119}
120
121static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000122ste_dealloc(PySTEntryObject *ste)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 ste->ste_table = NULL;
125 Py_XDECREF(ste->ste_id);
126 Py_XDECREF(ste->ste_name);
127 Py_XDECREF(ste->ste_symbols);
128 Py_XDECREF(ste->ste_varnames);
129 Py_XDECREF(ste->ste_children);
Benjamin Petersond9c87022012-10-31 20:26:20 -0400130 Py_XDECREF(ste->ste_directives);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 PyObject_Del(ste);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000132}
133
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000134#define OFF(x) offsetof(PySTEntryObject, x)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000135
Guido van Rossum6f799372001-09-20 20:46:19 +0000136static PyMemberDef ste_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 {"id", T_OBJECT, OFF(ste_id), READONLY},
138 {"name", T_OBJECT, OFF(ste_name), READONLY},
139 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
140 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
141 {"children", T_OBJECT, OFF(ste_children), READONLY},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 {"nested", T_INT, OFF(ste_nested), READONLY},
143 {"type", T_INT, OFF(ste_type), READONLY},
144 {"lineno", T_INT, OFF(ste_lineno), READONLY},
145 {NULL}
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000146};
147
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000148PyTypeObject PySTEntry_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 PyVarObject_HEAD_INIT(&PyType_Type, 0)
150 "symtable entry",
151 sizeof(PySTEntryObject),
152 0,
153 (destructor)ste_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200154 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 0, /* tp_getattr */
156 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200157 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 (reprfunc)ste_repr, /* tp_repr */
159 0, /* tp_as_number */
160 0, /* tp_as_sequence */
161 0, /* tp_as_mapping */
162 0, /* tp_hash */
163 0, /* tp_call */
164 0, /* tp_str */
165 PyObject_GenericGetAttr, /* tp_getattro */
166 0, /* tp_setattro */
167 0, /* tp_as_buffer */
168 Py_TPFLAGS_DEFAULT, /* tp_flags */
169 0, /* tp_doc */
170 0, /* tp_traverse */
171 0, /* tp_clear */
172 0, /* tp_richcompare */
173 0, /* tp_weaklistoffset */
174 0, /* tp_iter */
175 0, /* tp_iternext */
176 0, /* tp_methods */
177 ste_memberlist, /* tp_members */
178 0, /* tp_getset */
179 0, /* tp_base */
180 0, /* tp_dict */
181 0, /* tp_descr_get */
182 0, /* tp_descr_set */
183 0, /* tp_dictoffset */
184 0, /* tp_init */
185 0, /* tp_alloc */
186 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000187};
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188
189static int symtable_analyze(struct symtable *st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190static int symtable_enter_block(struct symtable *st, identifier name,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000191 _Py_block_ty block, void *ast, int lineno,
192 int col_offset);
Andy Lester95668422020-03-06 09:46:04 -0600193static int symtable_exit_block(struct symtable *st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000194static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
195static int symtable_visit_expr(struct symtable *st, expr_ty s);
196static int symtable_visit_genexp(struct symtable *st, expr_ty s);
Nick Coghlan650f0d02007-04-15 12:05:43 +0000197static int symtable_visit_listcomp(struct symtable *st, expr_ty s);
198static int symtable_visit_setcomp(struct symtable *st, expr_ty s);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000199static int symtable_visit_dictcomp(struct symtable *st, expr_ty s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200static int symtable_visit_arguments(struct symtable *st, arguments_ty);
201static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
202static int symtable_visit_alias(struct symtable *st, alias_ty);
203static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
204static int symtable_visit_keyword(struct symtable *st, keyword_ty);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000205static int symtable_visit_params(struct symtable *st, asdl_seq *args);
206static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207static int symtable_implicit_arg(struct symtable *st, int pos);
Andy Lester95668422020-03-06 09:46:04 -0600208static int symtable_visit_annotations(struct symtable *st, arguments_ty, expr_ty);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500209static int symtable_visit_withitem(struct symtable *st, withitem_ty item);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210
211
Nick Coghlan650f0d02007-04-15 12:05:43 +0000212static identifier top = NULL, lambda = NULL, genexpr = NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 listcomp = NULL, setcomp = NULL, dictcomp = NULL,
Benjamin Petersone8e14592013-05-16 14:37:25 -0500214 __class__ = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000215
216#define GET_IDENTIFIER(VAR) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000218
219#define DUPLICATE_ARGUMENT \
Neal Norwitza5d16a32007-08-24 22:53:58 +0000220"duplicate argument '%U' in function definition"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000221
222static struct symtable *
223symtable_new(void)
224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 struct symtable *st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
Zackery Spytzad65f152018-11-16 08:58:55 -0700228 if (st == NULL) {
229 PyErr_NoMemory();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 return NULL;
Zackery Spytzad65f152018-11-16 08:58:55 -0700231 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 st->st_filename = NULL;
234 st->st_blocks = NULL;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 if ((st->st_stack = PyList_New(0)) == NULL)
237 goto fail;
238 if ((st->st_blocks = PyDict_New()) == NULL)
239 goto fail;
240 st->st_cur = NULL;
241 st->st_private = NULL;
242 return st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000243 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 PySymtable_Free(st);
245 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000246}
247
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000248/* When compiling the use of C stack is probably going to be a lot
249 lighter than when executing Python code but still can overflow
250 and causing a Python crash if not checked (e.g. eval("()"*300000)).
251 Using the current recursion limit for the compiler seems too
252 restrictive (it caused at least one test to fail) so a factor is
253 used to allow deeper recursion when compiling an expression.
254
255 Using a scaling factor means this should automatically adjust when
256 the recursion limit is adjusted for small or large C stack allocations.
257*/
258#define COMPILER_STACK_FRAME_SCALE 3
259
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000260struct symtable *
Victor Stinner14e461d2013-08-26 22:28:21 +0200261PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262{
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000263 struct symtable *st = symtable_new();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 asdl_seq *seq;
265 int i;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000266 PyThreadState *tstate;
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400267 int recursion_limit = Py_GetRecursionLimit();
Nick Coghlan06145232019-08-29 23:26:53 +1000268 int starting_recursion_depth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 if (st == NULL)
Victor Stinner14e461d2013-08-26 22:28:21 +0200271 return NULL;
272 if (filename == NULL) {
273 PySymtable_Free(st);
274 return NULL;
275 }
276 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 st->st_filename = filename;
278 st->st_future = future;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000279
280 /* Setup recursion depth check counters */
Victor Stinner50b48572018-11-01 01:51:40 +0100281 tstate = _PyThreadState_GET();
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000282 if (!tstate) {
283 PySymtable_Free(st);
284 return NULL;
285 }
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400286 /* Be careful here to prevent overflow. */
Nick Coghlan06145232019-08-29 23:26:53 +1000287 starting_recursion_depth = (tstate->recursion_depth < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400288 tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE : tstate->recursion_depth;
Nick Coghlan06145232019-08-29 23:26:53 +1000289 st->recursion_depth = starting_recursion_depth;
Benjamin Peterson305e5aa2013-09-26 22:17:45 -0400290 st->recursion_limit = (recursion_limit < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
291 recursion_limit * COMPILER_STACK_FRAME_SCALE : recursion_limit;
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 /* Make the initial symbol information gathering pass */
294 if (!GET_IDENTIFIER(top) ||
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000295 !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 PySymtable_Free(st);
297 return NULL;
298 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 st->st_top = st->st_cur;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 switch (mod->kind) {
302 case Module_kind:
303 seq = mod->v.Module.body;
304 for (i = 0; i < asdl_seq_LEN(seq); i++)
305 if (!symtable_visit_stmt(st,
306 (stmt_ty)asdl_seq_GET(seq, i)))
307 goto error;
308 break;
309 case Expression_kind:
310 if (!symtable_visit_expr(st, mod->v.Expression.body))
311 goto error;
312 break;
313 case Interactive_kind:
314 seq = mod->v.Interactive.body;
315 for (i = 0; i < asdl_seq_LEN(seq); i++)
316 if (!symtable_visit_stmt(st,
317 (stmt_ty)asdl_seq_GET(seq, i)))
318 goto error;
319 break;
Guido van Rossum522346d2019-02-11 11:34:50 -0800320 case FunctionType_kind:
321 PyErr_SetString(PyExc_RuntimeError,
322 "this compiler does not handle FunctionTypes");
323 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 }
Andy Lester95668422020-03-06 09:46:04 -0600325 if (!symtable_exit_block(st)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 PySymtable_Free(st);
327 return NULL;
328 }
Nick Coghlan06145232019-08-29 23:26:53 +1000329 /* Check that the recursion depth counting balanced correctly */
330 if (st->recursion_depth != starting_recursion_depth) {
331 PyErr_Format(PyExc_SystemError,
332 "symtable analysis recursion depth mismatch (before=%d, after=%d)",
333 starting_recursion_depth, st->recursion_depth);
334 PySymtable_Free(st);
335 return NULL;
336 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 /* Make the second symbol analysis pass */
338 if (symtable_analyze(st))
339 return st;
340 PySymtable_Free(st);
341 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000342 error:
Andy Lester95668422020-03-06 09:46:04 -0600343 (void) symtable_exit_block(st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 PySymtable_Free(st);
345 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000346}
347
Victor Stinner14e461d2013-08-26 22:28:21 +0200348struct symtable *
349PySymtable_Build(mod_ty mod, const char *filename_str, PyFutureFeatures *future)
350{
351 PyObject *filename;
352 struct symtable *st;
353 filename = PyUnicode_DecodeFSDefault(filename_str);
354 if (filename == NULL)
355 return NULL;
356 st = PySymtable_BuildObject(mod, filename, future);
357 Py_DECREF(filename);
358 return st;
359}
360
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000361void
362PySymtable_Free(struct symtable *st)
363{
Victor Stinner14e461d2013-08-26 22:28:21 +0200364 Py_XDECREF(st->st_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 Py_XDECREF(st->st_blocks);
366 Py_XDECREF(st->st_stack);
367 PyMem_Free((void *)st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368}
369
370PySTEntryObject *
371PySymtable_Lookup(struct symtable *st, void *key)
372{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 PyObject *k, *v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 k = PyLong_FromVoidPtr(key);
376 if (k == NULL)
377 return NULL;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200378 v = PyDict_GetItemWithError(st->st_blocks, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 if (v) {
380 assert(PySTEntry_Check(v));
381 Py_INCREF(v);
382 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200383 else if (!PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 PyErr_SetString(PyExc_KeyError,
385 "unknown symbol table entry");
386 }
Neal Norwitzb6fc9df2005-11-13 18:50:34 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 Py_DECREF(k);
389 return (PySTEntryObject *)v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000390}
391
Nick Coghlan5dbe0f52019-08-25 23:45:40 +1000392static long
393_PyST_GetSymbol(PySTEntryObject *ste, PyObject *name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
396 if (!v)
397 return 0;
398 assert(PyLong_Check(v));
Nick Coghlan5dbe0f52019-08-25 23:45:40 +1000399 return PyLong_AS_LONG(v);
400}
401
402int
403PyST_GetScope(PySTEntryObject *ste, PyObject *name)
404{
405 long symbol = _PyST_GetSymbol(ste, name);
406 return (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407}
408
Benjamin Petersond9c87022012-10-31 20:26:20 -0400409static int
410error_at_directive(PySTEntryObject *ste, PyObject *name)
411{
412 Py_ssize_t i;
413 PyObject *data;
414 assert(ste->ste_directives);
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600415 for (i = 0; i < PyList_GET_SIZE(ste->ste_directives); i++) {
Benjamin Petersond9c87022012-10-31 20:26:20 -0400416 data = PyList_GET_ITEM(ste->ste_directives, i);
417 assert(PyTuple_CheckExact(data));
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600418 assert(PyUnicode_CheckExact(PyTuple_GET_ITEM(data, 0)));
419 if (PyUnicode_Compare(PyTuple_GET_ITEM(data, 0), name) == 0) {
420 PyErr_SyntaxLocationObject(ste->ste_table->st_filename,
421 PyLong_AsLong(PyTuple_GET_ITEM(data, 1)),
Ammar Askar025eb982018-09-24 17:12:49 -0400422 PyLong_AsLong(PyTuple_GET_ITEM(data, 2)) + 1);
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600423
424 return 0;
Yury Selivanoveb636452016-09-08 22:01:51 -0700425 }
Benjamin Petersond9c87022012-10-31 20:26:20 -0400426 }
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600427 PyErr_SetString(PyExc_RuntimeError,
428 "BUG: internal directive bookkeeping broken");
Benjamin Petersond9c87022012-10-31 20:26:20 -0400429 return 0;
430}
431
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432
433/* Analyze raw symbol information to determine scope of each name.
434
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000435 The next several functions are helpers for symtable_analyze(),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 which determines whether a name is local, global, or free. In addition,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000437 it determines which local variables are cell variables; they provide
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 bindings that are used for free variables in enclosed blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 There are also two kinds of global variables, implicit and explicit. An
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000441 explicit global is declared with the global statement. An implicit
442 global is a free variable for which the compiler has found no binding
443 in an enclosing function scope. The implicit global is either a global
444 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
445 to handle these names to implement slightly odd semantics. In such a
446 block, the name is treated as global until it is assigned to; then it
447 is treated as a local.
448
449 The symbol table requires two passes to determine the scope of each name.
Nick Coghlan650f0d02007-04-15 12:05:43 +0000450 The first pass collects raw facts from the AST via the symtable_visit_*
451 functions: the name is a parameter here, the name is used but not defined
452 here, etc. The second pass analyzes these facts during a pass over the
453 PySTEntryObjects created during pass 1.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000454
455 When a function is entered during the second pass, the parent passes
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 the set of all name bindings visible to its children. These bindings
Nick Coghlan650f0d02007-04-15 12:05:43 +0000457 are used to determine if non-local variables are free or implicit globals.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000458 Names which are explicitly declared nonlocal must exist in this set of
459 visible names - if they do not, a syntax error is raised. After doing
460 the local analysis, it analyzes each of its child blocks using an
461 updated set of name bindings.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000462
Nick Coghlan650f0d02007-04-15 12:05:43 +0000463 The children update the free variable set. If a local variable is added to
464 the free variable set by the child, the variable is marked as a cell. The
465 function object being defined must provide runtime storage for the variable
466 that may outlive the function's frame. Cell variables are removed from the
467 free set before the analyze function returns to its parent.
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000468
Nick Coghlan650f0d02007-04-15 12:05:43 +0000469 During analysis, the names are:
470 symbols: dict mapping from symbol names to flag values (including offset scope values)
471 scopes: dict mapping from symbol names to scope values (no offset)
472 local: set of all symbol names local to the current scope
473 bound: set of all symbol names local to a containing function scope
474 free: set of all symbol names referenced but not bound in child scopes
475 global: set of all symbol names explicitly declared as global
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000476*/
477
478#define SET_SCOPE(DICT, NAME, I) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 PyObject *o = PyLong_FromLong(I); \
480 if (!o) \
481 return 0; \
482 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
483 Py_DECREF(o); \
484 return 0; \
485 } \
486 Py_DECREF(o); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487}
488
489/* Decide on scope of name, given flags.
490
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000491 The namespace dictionaries may be modified to record information
492 about the new name. For example, a new global will add an entry to
493 global. A name that was global can be changed to local.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494*/
495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496static int
Nick Coghlan650f0d02007-04-15 12:05:43 +0000497analyze_name(PySTEntryObject *ste, PyObject *scopes, PyObject *name, long flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 PyObject *bound, PyObject *local, PyObject *free,
499 PyObject *global)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 if (flags & DEF_GLOBAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 if (flags & DEF_NONLOCAL) {
503 PyErr_Format(PyExc_SyntaxError,
504 "name '%U' is nonlocal and global",
505 name);
Benjamin Petersond9c87022012-10-31 20:26:20 -0400506 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 }
508 SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);
509 if (PySet_Add(global, name) < 0)
510 return 0;
511 if (bound && (PySet_Discard(bound, name) < 0))
512 return 0;
513 return 1;
514 }
515 if (flags & DEF_NONLOCAL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 if (!bound) {
517 PyErr_Format(PyExc_SyntaxError,
518 "nonlocal declaration not allowed at module level");
Benjamin Petersond9c87022012-10-31 20:26:20 -0400519 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 }
521 if (!PySet_Contains(bound, name)) {
522 PyErr_Format(PyExc_SyntaxError,
523 "no binding for nonlocal '%U' found",
524 name);
525
Benjamin Petersond9c87022012-10-31 20:26:20 -0400526 return error_at_directive(ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 }
528 SET_SCOPE(scopes, name, FREE);
529 ste->ste_free = 1;
530 return PySet_Add(free, name) >= 0;
531 }
532 if (flags & DEF_BOUND) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +0000533 SET_SCOPE(scopes, name, LOCAL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 if (PySet_Add(local, name) < 0)
535 return 0;
536 if (PySet_Discard(global, name) < 0)
537 return 0;
538 return 1;
539 }
540 /* If an enclosing block has a binding for this name, it
541 is a free variable rather than a global variable.
542 Note that having a non-NULL bound implies that the block
543 is nested.
544 */
545 if (bound && PySet_Contains(bound, name)) {
546 SET_SCOPE(scopes, name, FREE);
547 ste->ste_free = 1;
548 return PySet_Add(free, name) >= 0;
549 }
550 /* If a parent has a global statement, then call it global
551 explicit? It could also be global implicit.
552 */
553 if (global && PySet_Contains(global, name)) {
554 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
555 return 1;
556 }
557 if (ste->ste_nested)
558 ste->ste_free = 1;
559 SET_SCOPE(scopes, name, GLOBAL_IMPLICIT);
560 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561}
562
563#undef SET_SCOPE
564
565/* If a name is defined in free and also in locals, then this block
566 provides the binding for the free variable. The name should be
567 marked CELL in this block and removed from the free list.
568
569 Note that the current block's free variables are included in free.
570 That's safe because no name can be free and local in the same scope.
571*/
572
573static int
Benjamin Peterson312595c2013-05-15 15:26:42 -0500574analyze_cells(PyObject *scopes, PyObject *free)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 PyObject *name, *v, *v_cell;
577 int success = 0;
578 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 v_cell = PyLong_FromLong(CELL);
581 if (!v_cell)
582 return 0;
583 while (PyDict_Next(scopes, &pos, &name, &v)) {
584 long scope;
585 assert(PyLong_Check(v));
586 scope = PyLong_AS_LONG(v);
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +0000587 if (scope != LOCAL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 continue;
589 if (!PySet_Contains(free, name))
590 continue;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 /* Replace LOCAL with CELL for this name, and remove
592 from free. It is safe to replace the value of name
593 in the dict, because it will not cause a resize.
594 */
595 if (PyDict_SetItem(scopes, name, v_cell) < 0)
596 goto error;
597 if (PySet_Discard(free, name) < 0)
598 goto error;
599 }
600 success = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 Py_DECREF(v_cell);
603 return success;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604}
605
Benjamin Peterson312595c2013-05-15 15:26:42 -0500606static int
607drop_class_free(PySTEntryObject *ste, PyObject *free)
608{
609 int res;
610 if (!GET_IDENTIFIER(__class__))
611 return 0;
612 res = PySet_Discard(free, __class__);
613 if (res < 0)
614 return 0;
615 if (res)
616 ste->ste_needs_class_closure = 1;
617 return 1;
618}
619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620/* Enter the final scope information into the ste_symbols dict.
621 *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 * All arguments are dicts. Modifies symbols, others are read-only.
623*/
624static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625update_symbols(PyObject *symbols, PyObject *scopes,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000626 PyObject *bound, PyObject *free, int classflag)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 PyObject *name = NULL, *itr = NULL;
629 PyObject *v = NULL, *v_scope = NULL, *v_new = NULL, *v_free = NULL;
630 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 /* Update scope information for all symbols in this scope */
633 while (PyDict_Next(symbols, &pos, &name, &v)) {
634 long scope, flags;
635 assert(PyLong_Check(v));
636 flags = PyLong_AS_LONG(v);
637 v_scope = PyDict_GetItem(scopes, name);
638 assert(v_scope && PyLong_Check(v_scope));
639 scope = PyLong_AS_LONG(v_scope);
640 flags |= (scope << SCOPE_OFFSET);
641 v_new = PyLong_FromLong(flags);
642 if (!v_new)
643 return 0;
644 if (PyDict_SetItem(symbols, name, v_new) < 0) {
645 Py_DECREF(v_new);
646 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000647 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 Py_DECREF(v_new);
649 }
650
651 /* Record not yet resolved free variables from children (if any) */
652 v_free = PyLong_FromLong(FREE << SCOPE_OFFSET);
653 if (!v_free)
654 return 0;
655
656 itr = PyObject_GetIter(free);
Zackery Spytzfc439d22018-10-10 23:05:35 -0600657 if (itr == NULL) {
658 Py_DECREF(v_free);
659 return 0;
660 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661
662 while ((name = PyIter_Next(itr))) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200663 v = PyDict_GetItemWithError(symbols, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664
665 /* Handle symbol that already exists in this scope */
666 if (v) {
667 /* Handle a free variable in a method of
668 the class that has the same name as a local
669 or global in the class scope.
670 */
671 if (classflag &&
672 PyLong_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) {
673 long flags = PyLong_AS_LONG(v) | DEF_FREE_CLASS;
674 v_new = PyLong_FromLong(flags);
675 if (!v_new) {
676 goto error;
677 }
678 if (PyDict_SetItem(symbols, name, v_new) < 0) {
679 Py_DECREF(v_new);
680 goto error;
681 }
682 Py_DECREF(v_new);
683 }
684 /* It's a cell, or already free in this scope */
685 Py_DECREF(name);
686 continue;
687 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200688 else if (PyErr_Occurred()) {
689 goto error;
690 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 /* Handle global symbol */
Christian Heimes45af0c82016-09-09 00:22:28 +0200692 if (bound && !PySet_Contains(bound, name)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 Py_DECREF(name);
694 continue; /* it's a global */
695 }
696 /* Propagate new free symbol up the lexical stack */
697 if (PyDict_SetItem(symbols, name, v_free) < 0) {
698 goto error;
699 }
700 Py_DECREF(name);
701 }
702 Py_DECREF(itr);
703 Py_DECREF(v_free);
704 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000705error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 Py_XDECREF(v_free);
707 Py_XDECREF(itr);
708 Py_XDECREF(name);
709 return 0;
710}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711
712/* Make final symbol table decisions for block of ste.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000713
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714 Arguments:
715 ste -- current symtable entry (input/output)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000716 bound -- set of variables bound in enclosing scopes (input). bound
717 is NULL for module blocks.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000718 free -- set of free variables in enclosed scopes (output)
719 globals -- set of declared global variables in enclosing scopes (input)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000720
721 The implementation uses two mutually recursive functions,
722 analyze_block() and analyze_child_block(). analyze_block() is
723 responsible for analyzing the individual names defined in a block.
724 analyze_child_block() prepares temporary namespace dictionaries
725 used to evaluated nested blocks.
726
727 The two functions exist because a child block should see the name
728 bindings of its enclosing blocks, but those bindings should not
729 propagate back to a parent block.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730*/
731
732static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
734 PyObject *global, PyObject* child_free);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000735
736static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
738 PyObject *global)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 PyObject *name, *v, *local = NULL, *scopes = NULL, *newbound = NULL;
741 PyObject *newglobal = NULL, *newfree = NULL, *allfree = NULL;
742 PyObject *temp;
743 int i, success = 0;
744 Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 local = PySet_New(NULL); /* collect new names bound in block */
747 if (!local)
748 goto error;
749 scopes = PyDict_New(); /* collect scopes defined for each name */
750 if (!scopes)
751 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 /* Allocate new global and bound variable dictionaries. These
754 dictionaries hold the names visible in nested blocks. For
755 ClassBlocks, the bound and global names are initialized
756 before analyzing names, because class bindings aren't
757 visible in methods. For other blocks, they are initialized
758 after names are analyzed.
759 */
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 /* TODO(jhylton): Package these dicts in a struct so that we
762 can write reasonable helper functions?
763 */
764 newglobal = PySet_New(NULL);
765 if (!newglobal)
766 goto error;
767 newfree = PySet_New(NULL);
768 if (!newfree)
769 goto error;
770 newbound = PySet_New(NULL);
771 if (!newbound)
772 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 /* Class namespace has no effect on names visible in
775 nested functions, so populate the global and bound
776 sets to be passed to child blocks before analyzing
777 this one.
778 */
779 if (ste->ste_type == ClassBlock) {
780 /* Pass down known globals */
781 temp = PyNumber_InPlaceOr(newglobal, global);
782 if (!temp)
783 goto error;
784 Py_DECREF(temp);
785 /* Pass down previously bound symbols */
786 if (bound) {
787 temp = PyNumber_InPlaceOr(newbound, bound);
788 if (!temp)
789 goto error;
790 Py_DECREF(temp);
791 }
792 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
795 long flags = PyLong_AS_LONG(v);
796 if (!analyze_name(ste, scopes, name, flags,
797 bound, local, free, global))
798 goto error;
799 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 /* Populate global and bound sets to be passed to children. */
802 if (ste->ste_type != ClassBlock) {
803 /* Add function locals to bound set */
804 if (ste->ste_type == FunctionBlock) {
805 temp = PyNumber_InPlaceOr(newbound, local);
806 if (!temp)
807 goto error;
808 Py_DECREF(temp);
809 }
810 /* Pass down previously bound symbols */
811 if (bound) {
812 temp = PyNumber_InPlaceOr(newbound, bound);
813 if (!temp)
814 goto error;
815 Py_DECREF(temp);
816 }
817 /* Pass down known globals */
818 temp = PyNumber_InPlaceOr(newglobal, global);
819 if (!temp)
820 goto error;
821 Py_DECREF(temp);
822 }
823 else {
824 /* Special-case __class__ */
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000825 if (!GET_IDENTIFIER(__class__))
826 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 if (PySet_Add(newbound, __class__) < 0)
828 goto error;
829 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830
Eli Benderskydd97fbb2011-04-10 07:37:26 +0300831 /* Recursively call analyze_child_block() on each child block.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 newbound, newglobal now contain the names visible in
834 nested blocks. The free variables in the children will
835 be collected in allfree.
836 */
837 allfree = PySet_New(NULL);
838 if (!allfree)
839 goto error;
840 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
841 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
842 PySTEntryObject* entry;
843 assert(c && PySTEntry_Check(c));
844 entry = (PySTEntryObject*)c;
845 if (!analyze_child_block(entry, newbound, newfree, newglobal,
846 allfree))
847 goto error;
848 /* Check if any children have free variables */
849 if (entry->ste_free || entry->ste_child_free)
850 ste->ste_child_free = 1;
851 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 temp = PyNumber_InPlaceOr(newfree, allfree);
854 if (!temp)
855 goto error;
856 Py_DECREF(temp);
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 /* Check if any local variables must be converted to cell variables */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500859 if (ste->ste_type == FunctionBlock && !analyze_cells(scopes, newfree))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 goto error;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500861 else if (ste->ste_type == ClassBlock && !drop_class_free(ste, newfree))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 goto error;
863 /* Records the results of the analysis in the symbol table entry */
864 if (!update_symbols(ste->ste_symbols, scopes, bound, newfree,
865 ste->ste_type == ClassBlock))
866 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 temp = PyNumber_InPlaceOr(free, newfree);
869 if (!temp)
870 goto error;
871 Py_DECREF(temp);
872 success = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 Py_XDECREF(scopes);
875 Py_XDECREF(local);
876 Py_XDECREF(newbound);
877 Py_XDECREF(newglobal);
878 Py_XDECREF(newfree);
879 Py_XDECREF(allfree);
880 if (!success)
881 assert(PyErr_Occurred());
882 return success;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883}
884
885static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
887 PyObject *global, PyObject* child_free)
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
890 PyObject *temp;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 /* Copy the bound and global dictionaries.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000893
Martin Panter3ee62702016-06-04 04:57:19 +0000894 These dictionaries are used by all blocks enclosed by the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 current block. The analyze_block() call modifies these
896 dictionaries.
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 */
899 temp_bound = PySet_New(bound);
900 if (!temp_bound)
901 goto error;
902 temp_free = PySet_New(free);
903 if (!temp_free)
904 goto error;
905 temp_global = PySet_New(global);
906 if (!temp_global)
907 goto error;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 if (!analyze_block(entry, temp_bound, temp_free, temp_global))
910 goto error;
911 temp = PyNumber_InPlaceOr(child_free, temp_free);
912 if (!temp)
913 goto error;
914 Py_DECREF(temp);
915 Py_DECREF(temp_bound);
916 Py_DECREF(temp_free);
917 Py_DECREF(temp_global);
918 return 1;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000919 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 Py_XDECREF(temp_bound);
921 Py_XDECREF(temp_free);
922 Py_XDECREF(temp_global);
923 return 0;
Jeremy Hyltonf37708e2009-03-31 15:26:37 +0000924}
925
926static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927symtable_analyze(struct symtable *st)
928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 PyObject *free, *global;
930 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 free = PySet_New(NULL);
933 if (!free)
934 return 0;
935 global = PySet_New(NULL);
936 if (!global) {
937 Py_DECREF(free);
938 return 0;
939 }
940 r = analyze_block(st->st_top, NULL, free, global);
941 Py_DECREF(free);
942 Py_DECREF(global);
943 return r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944}
945
Benjamin Peterson55e00f22008-08-17 18:02:44 +0000946/* symtable_enter_block() gets a reference via ste_new.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 This reference is released when the block is exited, via the DECREF
948 in symtable_exit_block().
949*/
950
951static int
Andy Lester95668422020-03-06 09:46:04 -0600952symtable_exit_block(struct symtable *st)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953{
Benjamin Peterson609da582011-06-29 22:52:39 -0500954 Py_ssize_t size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955
Benjamin Peterson609da582011-06-29 22:52:39 -0500956 st->st_cur = NULL;
957 size = PyList_GET_SIZE(st->st_stack);
958 if (size) {
Benjamin Peterson609da582011-06-29 22:52:39 -0500959 if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 return 0;
Benjamin Peterson9d872e12011-07-02 09:22:13 -0500961 if (--size)
962 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, size - 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 }
964 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965}
966
967static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000969 void *ast, int lineno, int col_offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970{
Benjamin Peterson609da582011-06-29 22:52:39 -0500971 PySTEntryObject *prev = NULL, *ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972
Benjamin Peterson609da582011-06-29 22:52:39 -0500973 ste = ste_new(st, name, block, ast, lineno, col_offset);
974 if (ste == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 return 0;
Benjamin Peterson609da582011-06-29 22:52:39 -0500976 if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) {
977 Py_DECREF(ste);
978 return 0;
979 }
980 prev = st->st_cur;
Nick Coghlan5dbe0f52019-08-25 23:45:40 +1000981 /* bpo-37757: For now, disallow *all* assignment expressions in the
982 * outermost iterator expression of a comprehension, even those inside
983 * a nested comprehension or a lambda expression.
984 */
985 if (prev) {
986 ste->ste_comp_iter_expr = prev->ste_comp_iter_expr;
987 }
Benjamin Peterson609da582011-06-29 22:52:39 -0500988 /* The entry is owned by the stack. Borrow it for st_cur. */
989 Py_DECREF(ste);
990 st->st_cur = ste;
Benjamin Peterson230b2062010-10-16 03:45:45 +0000991 if (block == ModuleBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 st->st_global = st->st_cur->ste_symbols;
993 if (prev) {
Benjamin Peterson609da582011-06-29 22:52:39 -0500994 if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 return 0;
996 }
997 }
998 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999}
1000
Neal Norwitz46b7bda2006-01-08 01:06:06 +00001001static long
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002symtable_lookup(struct symtable *st, PyObject *name)
1003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 PyObject *mangled = _Py_Mangle(st->st_private, name);
1005 if (!mangled)
1006 return 0;
Pablo Galindo4901dc42019-08-26 16:14:07 +01001007 long ret = _PyST_GetSymbol(st->st_cur, mangled);
1008 Py_DECREF(mangled);
1009 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010}
1011
1012static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001013symtable_add_def_helper(struct symtable *st, PyObject *name, int flag, struct _symtable_entry *ste)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 PyObject *o;
1016 PyObject *dict;
1017 long val;
1018 PyObject *mangled = _Py_Mangle(st->st_private, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019
Jeremy Hylton81e95022007-02-27 06:50:52 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 if (!mangled)
1022 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001023 dict = ste->ste_symbols;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001024 if ((o = PyDict_GetItemWithError(dict, mangled))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 val = PyLong_AS_LONG(o);
1026 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
1027 /* Is it better to use 'mangled' or 'name' here? */
1028 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, name);
Victor Stinner14e461d2013-08-26 22:28:21 +02001029 PyErr_SyntaxLocationObject(st->st_filename,
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001030 ste->ste_lineno,
1031 ste->ste_col_offset + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 goto error;
1033 }
1034 val |= flag;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001035 }
1036 else if (PyErr_Occurred()) {
1037 goto error;
1038 }
1039 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 val = flag;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001041 }
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001042 if (ste->ste_comp_iter_target) {
1043 /* This name is an iteration variable in a comprehension,
1044 * so check for a binding conflict with any named expressions.
1045 * Otherwise, mark it as an iteration variable so subsequent
1046 * named expressions can check for conflicts.
1047 */
1048 if (val & (DEF_GLOBAL | DEF_NONLOCAL)) {
1049 PyErr_Format(PyExc_SyntaxError,
1050 NAMED_EXPR_COMP_INNER_LOOP_CONFLICT, name);
1051 PyErr_SyntaxLocationObject(st->st_filename,
1052 ste->ste_lineno,
1053 ste->ste_col_offset + 1);
1054 goto error;
1055 }
1056 val |= DEF_COMP_ITER;
1057 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 o = PyLong_FromLong(val);
1059 if (o == NULL)
1060 goto error;
1061 if (PyDict_SetItem(dict, mangled, o) < 0) {
1062 Py_DECREF(o);
1063 goto error;
1064 }
1065 Py_DECREF(o);
1066
1067 if (flag & DEF_PARAM) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001068 if (PyList_Append(ste->ste_varnames, mangled) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 goto error;
1070 } else if (flag & DEF_GLOBAL) {
1071 /* XXX need to update DEF_GLOBAL for other flags too;
1072 perhaps only DEF_FREE_GLOBAL */
1073 val = flag;
1074 if ((o = PyDict_GetItem(st->st_global, mangled))) {
1075 val |= PyLong_AS_LONG(o);
1076 }
1077 o = PyLong_FromLong(val);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078 if (o == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 goto error;
1080 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
1081 Py_DECREF(o);
1082 goto error;
1083 }
1084 Py_DECREF(o);
1085 }
1086 Py_DECREF(mangled);
1087 return 1;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00001088
1089error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 Py_DECREF(mangled);
1091 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092}
1093
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001094static int
1095symtable_add_def(struct symtable *st, PyObject *name, int flag) {
1096 return symtable_add_def_helper(st, name, flag, st->st_cur);
1097}
1098
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
1100 They use the ASDL name to synthesize the name of the C type and the visit
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 function.
1102
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
1104 useful if the first node in the sequence requires special treatment.
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001105
1106 VISIT_QUIT macro returns the specified value exiting from the function but
1107 first adjusts current recursion counter depth.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108*/
1109
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001110#define VISIT_QUIT(ST, X) \
1111 return --(ST)->recursion_depth,(X)
1112
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113#define VISIT(ST, TYPE, V) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 if (!symtable_visit_ ## TYPE((ST), (V))) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001115 VISIT_QUIT((ST), 0);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001116
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117#define VISIT_SEQ(ST, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 int i; \
1119 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1120 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
1121 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1122 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001123 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001126
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 int i; \
1129 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1130 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
1131 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
1132 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001133 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135}
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001136
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001137#define VISIT_SEQ_WITH_NULL(ST, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 int i = 0; \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001139 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001141 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 if (!elt) continue; /* can be NULL */ \
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001143 if (!symtable_visit_ ## TYPE((ST), elt)) \
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001144 VISIT_QUIT((ST), 0); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 } \
Guido van Rossum4f72a782006-10-27 23:31:49 +00001146}
1147
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148static int
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001149symtable_record_directive(struct symtable *st, identifier name, int lineno, int col_offset)
Benjamin Petersond9c87022012-10-31 20:26:20 -04001150{
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -06001151 PyObject *data, *mangled;
Benjamin Petersond9c87022012-10-31 20:26:20 -04001152 int res;
1153 if (!st->st_cur->ste_directives) {
1154 st->st_cur->ste_directives = PyList_New(0);
1155 if (!st->st_cur->ste_directives)
1156 return 0;
1157 }
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -06001158 mangled = _Py_Mangle(st->st_private, name);
1159 if (!mangled)
1160 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001161 data = Py_BuildValue("(Nii)", mangled, lineno, col_offset);
Benjamin Petersond9c87022012-10-31 20:26:20 -04001162 if (!data)
1163 return 0;
1164 res = PyList_Append(st->st_cur->ste_directives, data);
1165 Py_DECREF(data);
1166 return res == 0;
1167}
1168
1169
1170static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171symtable_visit_stmt(struct symtable *st, stmt_ty s)
1172{
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001173 if (++st->recursion_depth > st->recursion_limit) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04001174 PyErr_SetString(PyExc_RecursionError,
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001175 "maximum recursion depth exceeded during compilation");
1176 VISIT_QUIT(st, 0);
1177 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 switch (s->kind) {
1179 case FunctionDef_kind:
1180 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001181 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 if (s->v.FunctionDef.args->defaults)
1183 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
1184 if (s->v.FunctionDef.args->kw_defaults)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001185 VISIT_SEQ_WITH_NULL(st, expr, s->v.FunctionDef.args->kw_defaults);
Andy Lester95668422020-03-06 09:46:04 -06001186 if (!symtable_visit_annotations(st, s->v.FunctionDef.args,
Yury Selivanov75445082015-05-11 22:57:16 -04001187 s->v.FunctionDef.returns))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001188 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 if (s->v.FunctionDef.decorator_list)
1190 VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
1191 if (!symtable_enter_block(st, s->v.FunctionDef.name,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001192 FunctionBlock, (void *)s, s->lineno,
1193 s->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001194 VISIT_QUIT(st, 0);
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001195 VISIT(st, arguments, s->v.FunctionDef.args);
1196 VISIT_SEQ(st, stmt, s->v.FunctionDef.body);
Andy Lester95668422020-03-06 09:46:04 -06001197 if (!symtable_exit_block(st))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001198 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 break;
1200 case ClassDef_kind: {
1201 PyObject *tmp;
1202 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001203 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
1205 VISIT_SEQ(st, keyword, s->v.ClassDef.keywords);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 if (s->v.ClassDef.decorator_list)
1207 VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
1208 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001209 (void *)s, s->lineno, s->col_offset))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001210 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 tmp = st->st_private;
1212 st->st_private = s->v.ClassDef.name;
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001213 VISIT_SEQ(st, stmt, s->v.ClassDef.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 st->st_private = tmp;
Andy Lester95668422020-03-06 09:46:04 -06001215 if (!symtable_exit_block(st))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001216 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 break;
1218 }
1219 case Return_kind:
1220 if (s->v.Return.value) {
1221 VISIT(st, expr, s->v.Return.value);
1222 st->st_cur->ste_returns_value = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 }
1224 break;
1225 case Delete_kind:
1226 VISIT_SEQ(st, expr, s->v.Delete.targets);
1227 break;
1228 case Assign_kind:
1229 VISIT_SEQ(st, expr, s->v.Assign.targets);
1230 VISIT(st, expr, s->v.Assign.value);
1231 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001232 case AnnAssign_kind:
1233 if (s->v.AnnAssign.target->kind == Name_kind) {
1234 expr_ty e_name = s->v.AnnAssign.target;
1235 long cur = symtable_lookup(st, e_name->v.Name.id);
1236 if (cur < 0) {
1237 VISIT_QUIT(st, 0);
1238 }
1239 if ((cur & (DEF_GLOBAL | DEF_NONLOCAL))
Pablo Galindode2aea02018-10-14 18:01:03 +01001240 && (st->st_cur->ste_symbols != st->st_global)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001241 && s->v.AnnAssign.simple) {
1242 PyErr_Format(PyExc_SyntaxError,
Guido van Rossum6cff8742016-09-09 09:36:26 -07001243 cur & DEF_GLOBAL ? GLOBAL_ANNOT : NONLOCAL_ANNOT,
1244 e_name->v.Name.id);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001245 PyErr_SyntaxLocationObject(st->st_filename,
1246 s->lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001247 s->col_offset + 1);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001248 VISIT_QUIT(st, 0);
1249 }
1250 if (s->v.AnnAssign.simple &&
1251 !symtable_add_def(st, e_name->v.Name.id,
1252 DEF_ANNOT | DEF_LOCAL)) {
1253 VISIT_QUIT(st, 0);
1254 }
1255 else {
1256 if (s->v.AnnAssign.value
1257 && !symtable_add_def(st, e_name->v.Name.id, DEF_LOCAL)) {
1258 VISIT_QUIT(st, 0);
1259 }
1260 }
1261 }
1262 else {
1263 VISIT(st, expr, s->v.AnnAssign.target);
1264 }
1265 VISIT(st, expr, s->v.AnnAssign.annotation);
1266 if (s->v.AnnAssign.value) {
1267 VISIT(st, expr, s->v.AnnAssign.value);
1268 }
1269 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 case AugAssign_kind:
1271 VISIT(st, expr, s->v.AugAssign.target);
1272 VISIT(st, expr, s->v.AugAssign.value);
1273 break;
1274 case For_kind:
1275 VISIT(st, expr, s->v.For.target);
1276 VISIT(st, expr, s->v.For.iter);
1277 VISIT_SEQ(st, stmt, s->v.For.body);
1278 if (s->v.For.orelse)
1279 VISIT_SEQ(st, stmt, s->v.For.orelse);
1280 break;
1281 case While_kind:
1282 VISIT(st, expr, s->v.While.test);
1283 VISIT_SEQ(st, stmt, s->v.While.body);
1284 if (s->v.While.orelse)
1285 VISIT_SEQ(st, stmt, s->v.While.orelse);
1286 break;
1287 case If_kind:
1288 /* XXX if 0: and lookup_yield() hacks */
1289 VISIT(st, expr, s->v.If.test);
1290 VISIT_SEQ(st, stmt, s->v.If.body);
1291 if (s->v.If.orelse)
1292 VISIT_SEQ(st, stmt, s->v.If.orelse);
1293 break;
1294 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;
1321 asdl_seq *seq = s->v.Global.names;
1322 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;
1354 asdl_seq *seq = s->v.Nonlocal.names;
1355 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:
1648 if (!symtable_add_def(st, e->v.Name.id,
1649 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001650 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 /* Special-case super: it counts as a use of __class__ */
1652 if (e->v.Name.ctx == Load &&
1653 st->st_cur->ste_type == FunctionBlock &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001654 _PyUnicode_EqualToASCIIString(e->v.Name.id, "super")) {
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10001655 if (!GET_IDENTIFIER(__class__) ||
1656 !symtable_add_def(st, __class__, USE))
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001657 VISIT_QUIT(st, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 }
1659 break;
1660 /* child nodes of List and Tuple will have expr_context set */
1661 case List_kind:
1662 VISIT_SEQ(st, expr, e->v.List.elts);
1663 break;
1664 case Tuple_kind:
1665 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1666 break;
1667 }
Nick Coghlanaab9c2b2012-11-04 23:14:34 +10001668 VISIT_QUIT(st, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669}
1670
1671static int
1672symtable_implicit_arg(struct symtable *st, int pos)
1673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 PyObject *id = PyUnicode_FromFormat(".%d", pos);
1675 if (id == NULL)
1676 return 0;
1677 if (!symtable_add_def(st, id, DEF_PARAM)) {
1678 Py_DECREF(id);
1679 return 0;
1680 }
1681 Py_DECREF(id);
1682 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683}
1684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685static int
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001686symtable_visit_params(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 int i;
Neal Norwitzc1505362006-12-28 06:47:50 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 if (!args)
1691 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 for (i = 0; i < asdl_seq_LEN(args); i++) {
1694 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1695 if (!symtable_add_def(st, arg->arg, DEF_PARAM))
1696 return 0;
1697 }
1698
1699 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700}
1701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702static int
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001703symtable_visit_argannotations(struct symtable *st, asdl_seq *args)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 int i;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 if (!args)
1708 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 for (i = 0; i < asdl_seq_LEN(args); i++) {
1711 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1712 if (arg->annotation)
1713 VISIT(st, expr, arg->annotation);
1714 }
1715
1716 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001717}
1718
Neal Norwitzc1505362006-12-28 06:47:50 +00001719static int
Andy Lester95668422020-03-06 09:46:04 -06001720symtable_visit_annotations(struct symtable *st, arguments_ty a, expr_ty returns)
Neal Norwitzc1505362006-12-28 06:47:50 +00001721{
Anthony Sottileec007cb2020-01-04 20:57:21 -05001722 if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs))
1723 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 if (a->args && !symtable_visit_argannotations(st, a->args))
1725 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001726 if (a->vararg && a->vararg->annotation)
1727 VISIT(st, expr, a->vararg->annotation);
1728 if (a->kwarg && a->kwarg->annotation)
1729 VISIT(st, expr, a->kwarg->annotation);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 if (a->kwonlyargs && !symtable_visit_argannotations(st, a->kwonlyargs))
1731 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001732 if (returns)
Yury Selivanovb7666a32015-07-22 14:48:57 +03001733 VISIT(st, expr, returns);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735}
1736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738symtable_visit_arguments(struct symtable *st, arguments_ty a)
1739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 /* skip default arguments inside function block
1741 XXX should ast be different?
1742 */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001743 if (a->posonlyargs && !symtable_visit_params(st, a->posonlyargs))
1744 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 if (a->args && !symtable_visit_params(st, a->args))
1746 return 0;
1747 if (a->kwonlyargs && !symtable_visit_params(st, a->kwonlyargs))
1748 return 0;
1749 if (a->vararg) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001750 if (!symtable_add_def(st, a->vararg->arg, DEF_PARAM))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 return 0;
1752 st->st_cur->ste_varargs = 1;
1753 }
1754 if (a->kwarg) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001755 if (!symtable_add_def(st, a->kwarg->arg, DEF_PARAM))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 return 0;
1757 st->st_cur->ste_varkeywords = 1;
1758 }
1759 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760}
1761
1762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 if (eh->v.ExceptHandler.type)
1767 VISIT(st, expr, eh->v.ExceptHandler.type);
1768 if (eh->v.ExceptHandler.name)
1769 if (!symtable_add_def(st, eh->v.ExceptHandler.name, DEF_LOCAL))
1770 return 0;
1771 VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
1772 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773}
1774
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001775static int
1776symtable_visit_withitem(struct symtable *st, withitem_ty item)
1777{
1778 VISIT(st, expr, item->context_expr);
1779 if (item->optional_vars) {
1780 VISIT(st, expr, item->optional_vars);
1781 }
1782 return 1;
1783}
1784
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787symtable_visit_alias(struct symtable *st, alias_ty a)
1788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 /* Compute store_name, the name actually bound by the import
Benjamin Petersonc629d512010-06-11 21:53:07 +00001790 operation. It is different than a->name when a->name is a
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 dotted package name (e.g. spam.eggs)
1792 */
1793 PyObject *store_name;
1794 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001795 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
1796 PyUnicode_GET_LENGTH(name), 1);
1797 if (dot != -1) {
1798 store_name = PyUnicode_Substring(name, 0, dot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 if (!store_name)
1800 return 0;
1801 }
1802 else {
1803 store_name = name;
1804 Py_INCREF(store_name);
1805 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001806 if (!_PyUnicode_EqualToASCIIString(name, "*")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1808 Py_DECREF(store_name);
1809 return r;
1810 }
1811 else {
1812 if (st->st_cur->ste_type != ModuleBlock) {
Benjamin Petersonb7149ca2011-06-20 22:09:13 -05001813 int lineno = st->st_cur->ste_lineno;
1814 int col_offset = st->st_cur->ste_col_offset;
1815 PyErr_SetString(PyExc_SyntaxError, IMPORT_STAR_WARNING);
Ammar Askar025eb982018-09-24 17:12:49 -04001816 PyErr_SyntaxLocationObject(st->st_filename, lineno, col_offset + 1);
Benjamin Petersonb7149ca2011-06-20 22:09:13 -05001817 Py_DECREF(store_name);
1818 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 Py_DECREF(store_name);
1821 return 1;
1822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823}
1824
1825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1828{
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001829 st->st_cur->ste_comp_iter_target = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 VISIT(st, expr, lc->target);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001831 st->st_cur->ste_comp_iter_target = 0;
1832 st->st_cur->ste_comp_iter_expr++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 VISIT(st, expr, lc->iter);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001834 st->st_cur->ste_comp_iter_expr--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 VISIT_SEQ(st, expr, lc->ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001836 if (lc->is_async) {
1837 st->st_cur->ste_coroutine = 1;
1838 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840}
1841
1842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844symtable_visit_keyword(struct symtable *st, keyword_ty k)
1845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 VISIT(st, expr, k->value);
1847 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848}
1849
1850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001852symtable_handle_comprehension(struct symtable *st, expr_ty e,
Guido van Rossum992d4a32007-07-11 13:09:30 +00001853 identifier scope_name, asdl_seq *generators,
1854 expr_ty elt, expr_ty value)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 int is_generator = (e->kind == GeneratorExp_kind);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 comprehension_ty outermost = ((comprehension_ty)
1858 asdl_seq_GET(generators, 0));
1859 /* Outermost iterator is evaluated in current scope */
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001860 st->st_cur->ste_comp_iter_expr++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 VISIT(st, expr, outermost->iter);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001862 st->st_cur->ste_comp_iter_expr--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 /* Create comprehension scope for the rest */
1864 if (!scope_name ||
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00001865 !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e,
1866 e->lineno, e->col_offset)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 return 0;
1868 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001869 if (outermost->is_async) {
1870 st->st_cur->ste_coroutine = 1;
1871 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001872 st->st_cur->ste_comprehension = 1;
1873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 /* Outermost iter is received as an argument */
1875 if (!symtable_implicit_arg(st, 0)) {
Andy Lester95668422020-03-06 09:46:04 -06001876 symtable_exit_block(st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 return 0;
1878 }
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001879 /* Visit iteration variable target, and mark them as such */
1880 st->st_cur->ste_comp_iter_target = 1;
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001881 VISIT(st, expr, outermost->target);
Nick Coghlan5dbe0f52019-08-25 23:45:40 +10001882 st->st_cur->ste_comp_iter_target = 0;
1883 /* Visit the rest of the comprehension body */
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001884 VISIT_SEQ(st, expr, outermost->ifs);
1885 VISIT_SEQ_TAIL(st, comprehension, generators, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 if (value)
Benjamin Petersonc2575d52011-06-29 15:27:14 -05001887 VISIT(st, expr, value);
1888 VISIT(st, expr, elt);
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001889 if (st->st_cur->ste_generator) {
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001890 PyErr_SetString(PyExc_SyntaxError,
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001891 (e->kind == ListComp_kind) ? "'yield' inside list comprehension" :
1892 (e->kind == SetComp_kind) ? "'yield' inside set comprehension" :
1893 (e->kind == DictComp_kind) ? "'yield' inside dict comprehension" :
1894 "'yield' inside generator expression");
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001895 PyErr_SyntaxLocationObject(st->st_filename,
1896 st->st_cur->ste_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04001897 st->st_cur->ste_col_offset + 1);
Andy Lester95668422020-03-06 09:46:04 -06001898 symtable_exit_block(st);
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001899 return 0;
Serhiy Storchaka73a7e9b2017-12-01 06:54:17 +02001900 }
Serhiy Storchaka07ca9af2018-02-04 10:53:48 +02001901 st->st_cur->ste_generator = is_generator;
Andy Lester95668422020-03-06 09:46:04 -06001902 return symtable_exit_block(st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903}
Nick Coghlan650f0d02007-04-15 12:05:43 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001906symtable_visit_genexp(struct symtable *st, expr_ty e)
1907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
1909 e->v.GeneratorExp.generators,
1910 e->v.GeneratorExp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001911}
1912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001914symtable_visit_listcomp(struct symtable *st, expr_ty e)
1915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(listcomp),
1917 e->v.ListComp.generators,
1918 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001919}
1920
1921static int
1922symtable_visit_setcomp(struct symtable *st, expr_ty e)
1923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
1925 e->v.SetComp.generators,
1926 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001927}
1928
1929static int
1930symtable_visit_dictcomp(struct symtable *st, expr_ty e)
1931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp),
1933 e->v.DictComp.generators,
1934 e->v.DictComp.key,
1935 e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936}