symtable.c revision 46b7bda9bcd0fb11878a154234c3064e19e35f3c
1cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton#include "Python.h"
23e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "Python-ast.h"
33e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "code.h"
4cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton#include "symtable.h"
5cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton#include "structmember.h"
6cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
75d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitz/* error strings used for warnings */
83e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define GLOBAL_AFTER_ASSIGN \
93e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton"name '%.400s' is assigned to before global declaration"
102990640d8af1d1fd6ba264ced46e741b9dc091d0Jeremy Hylton
113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define GLOBAL_AFTER_USE \
123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton"name '%.400s' is used prior to global declaration"
132990640d8af1d1fd6ba264ced46e741b9dc091d0Jeremy Hylton
145d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitz#define IMPORT_STAR_WARNING "import * only allowed at module level"
155d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitz
165d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitz
173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPySTEntryObject *
1862c2fac9a0758f303c0382e459031a2679a056e2Neal NorwitzPySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block,
193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	      void *key, int lineno)
20cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton{
213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PySTEntryObject *ste = NULL;
22b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	PyObject *k;
23cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	k = PyLong_FromVoidPtr(key);
25cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	if (k == NULL)
26cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton		goto fail;
273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste = (PySTEntryObject *)PyObject_New(PySTEntryObject,
283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					      &PySTEntry_Type);
29cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	ste->ste_table = st;
30cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	ste->ste_id = k;
313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste->ste_tmpname = 0;
32cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste->ste_name = name;
343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_INCREF(name);
35b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
36b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	ste->ste_symbols = NULL;
37b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	ste->ste_varnames = NULL;
38b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	ste->ste_children = NULL;
39b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
40b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	ste->ste_symbols = PyDict_New();
41b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	if (ste->ste_symbols == NULL)
42cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	    goto fail;
43cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
44b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	ste->ste_varnames = PyList_New(0);
45b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	if (ste->ste_varnames == NULL)
46cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	    goto fail;
47cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
48b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	ste->ste_children = PyList_New(0);
49b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	if (ste->ste_children == NULL)
50cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	    goto fail;
51cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste->ste_type = block;
533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste->ste_unoptimized = 0;
543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste->ste_nested = 0;
553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste->ste_free = 0;
563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste->ste_varargs = 0;
573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ste->ste_varkeywords = 0;
5886424e333f1736591114da975c8d2926ba6f51f5Jeremy Hylton	ste->ste_opt_lineno = 0;
594d508adae3101434ae62be1c140e9877673dc257Jeremy Hylton	ste->ste_tmpname = 0;
60cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	ste->ste_lineno = lineno;
61cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (st->st_cur != NULL &&
633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    (st->st_cur->ste_nested ||
643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	     st->st_cur->ste_type == FunctionBlock))
65cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton		ste->ste_nested = 1;
66cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	ste->ste_child_free = 0;
675ca576ed0a0c697c7e7547adfd0b3af010fd2053Tim Peters	ste->ste_generator = 0;
68cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
69cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0)
70cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	    goto fail;
7174b3bc47df9979e54c1f0c7866730eb499705f0eJeremy Hylton
723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return ste;
73cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton fail:
74cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	Py_XDECREF(ste);
75cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	return NULL;
76cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton}
77cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
78cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hyltonstatic PyObject *
793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonste_repr(PySTEntryObject *ste)
80cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton{
81cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	char buf[256];
82cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
834b4ab20f2c07a0e555c0b982089448b5471f6521Barry Warsaw	PyOS_snprintf(buf, sizeof(buf),
844b4ab20f2c07a0e555c0b982089448b5471f6521Barry Warsaw		      "<symtable entry %.100s(%ld), line %d>",
854b4ab20f2c07a0e555c0b982089448b5471f6521Barry Warsaw		      PyString_AS_STRING(ste->ste_name),
863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		      PyInt_AS_LONG(ste->ste_id), ste->ste_lineno);
87cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	return PyString_FromString(buf);
88cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton}
89cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
90cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hyltonstatic void
913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonste_dealloc(PySTEntryObject *ste)
92cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton{
93cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	ste->ste_table = NULL;
94cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	Py_XDECREF(ste->ste_id);
95cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	Py_XDECREF(ste->ste_name);
96cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	Py_XDECREF(ste->ste_symbols);
97cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	Py_XDECREF(ste->ste_varnames);
98cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	Py_XDECREF(ste->ste_children);
99cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	PyObject_Del(ste);
100cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton}
101cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
1023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define OFF(x) offsetof(PySTEntryObject, x)
103cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
1046f7993765ac0989b5d13084240797913627a31d8Guido van Rossumstatic PyMemberDef ste_memberlist[] = {
105cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	{"id",       T_OBJECT, OFF(ste_id), READONLY},
106cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	{"name",     T_OBJECT, OFF(ste_name), READONLY},
107cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	{"symbols",  T_OBJECT, OFF(ste_symbols), READONLY},
108cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	{"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
109cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	{"children", T_OBJECT, OFF(ste_children), READONLY},
110cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	{"type",     T_INT,    OFF(ste_type), READONLY},
111cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	{"lineno",   T_INT,    OFF(ste_lineno), READONLY},
112cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	{NULL}
113cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton};
114cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton
1153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyTypeObject PySTEntry_Type = {
116cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	PyObject_HEAD_INIT(&PyType_Type)
117cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,
118cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	"symtable entry",
1193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	sizeof(PySTEntryObject),
120cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,
121cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	(destructor)ste_dealloc,                /* tp_dealloc */
122cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,                                      /* tp_print */
1236f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,			               /* tp_getattr */
124cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,					/* tp_setattr */
125cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,			                /* tp_compare */
126cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	(reprfunc)ste_repr,			/* tp_repr */
127cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,					/* tp_as_number */
128cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,			                /* tp_as_sequence */
129cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,					/* tp_as_mapping */
130cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,					/* tp_hash */
131cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,					/* tp_call */
132cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,					/* tp_str */
1336f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	PyObject_GenericGetAttr,		/* tp_getattro */
134cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,					/* tp_setattro */
135cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	0,					/* tp_as_buffer */
136cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton	Py_TPFLAGS_DEFAULT,	                /* tp_flags */
137cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton 	0,					/* tp_doc */
1386f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_traverse */
1396f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_clear */
1406f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_richcompare */
1416f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_weaklistoffset */
1426f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_iter */
1436f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_iternext */
1446f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_methods */
1456f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	ste_memberlist,				/* tp_members */
1466f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_getset */
1476f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_base */
1486f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_dict */
1496f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_descr_get */
1506f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_descr_set */
1516f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_dictoffset */
1526f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_init */
1536f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_alloc */
1546f7993765ac0989b5d13084240797913627a31d8Guido van Rossum	0,					/* tp_new */
155cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton};
1563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_analyze(struct symtable *st);
1585d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitzstatic int symtable_warn(struct symtable *st, char *msg, int lineno);
1593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_enter_block(struct symtable *st, identifier name,
16062c2fac9a0758f303c0382e459031a2679a056e2Neal Norwitz				_Py_block_ty block, void *ast, int lineno);
1613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_exit_block(struct symtable *st, void *ast);
1623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_stmt(struct symtable *st, stmt_ty s);
1633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_expr(struct symtable *st, expr_ty s);
1643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_genexp(struct symtable *st, expr_ty s);
1653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_arguments(struct symtable *st, arguments_ty);
1663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
1673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_alias(struct symtable *st, alias_ty);
1683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
1693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_keyword(struct symtable *st, keyword_ty);
1703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_slice(struct symtable *st, slice_ty);
1713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_params(struct symtable *st, asdl_seq *args, int top);
1723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_visit_params_nested(struct symtable *st, asdl_seq *args);
1733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int symtable_implicit_arg(struct symtable *st, int pos);
1743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
17699b2533539dbc98fe7e5b3ac95e71879afca1c2cNick Coghlanstatic identifier top = NULL, lambda = NULL, genexpr = NULL;
1773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define GET_IDENTIFIER(VAR) \
1793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
1803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define DUPLICATE_ARGUMENT \
1823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton"duplicate argument '%s' in function definition"
1833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic struct symtable *
1853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_new(void)
1863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
1873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	struct symtable *st;
1883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
1903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (st == NULL)
1913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return NULL;
1923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_filename = NULL;
194b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	st->st_symbols = NULL;
195b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
1963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if ((st->st_stack = PyList_New(0)) == NULL)
1973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto fail;
1983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if ((st->st_symbols = PyDict_New()) == NULL)
1993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto fail;
2003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_cur = NULL;
2013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_tmpname = 0;
2023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_private = NULL;
2033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return st;
2043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton fail:
2053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PySymtable_Free(st);
2063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return NULL;
2073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
2083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstruct symtable *
2103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
2113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	struct symtable *st = symtable_new();
2133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	asdl_seq *seq;
2143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	int i;
2153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (st == NULL)
2173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return st;
2183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_filename = filename;
2193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_future = future;
2203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	symtable_enter_block(st, GET_IDENTIFIER(top), ModuleBlock,
2213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			     (void *)mod, 0);
2223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_top = st->st_cur;
2233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
2243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* Any other top-level initialization? */
2253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	switch (mod->kind) {
2263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case Module_kind:
2273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		seq = mod->v.Module.body;
2283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		for (i = 0; i < asdl_seq_LEN(seq); i++)
2293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (!symtable_visit_stmt(st, asdl_seq_GET(seq, i)))
2303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				goto error;
2313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
2323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case Expression_kind:
2333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_visit_expr(st, mod->v.Expression.body))
2343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			goto error;
2353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
2363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case Interactive_kind:
2373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		seq = mod->v.Interactive.body;
2383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		for (i = 0; i < asdl_seq_LEN(seq); i++)
2393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (!symtable_visit_stmt(st, asdl_seq_GET(seq, i)))
2403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				goto error;
2413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
2423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case Suite_kind:
2433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyErr_SetString(PyExc_RuntimeError,
2443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				"this compiler does not handle Suites");
245b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		goto error;
2463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
247b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	if (!symtable_exit_block(st, (void *)mod)) {
248b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		PySymtable_Free(st);
2493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return NULL;
250b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	}
2513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (symtable_analyze(st))
2523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return st;
253b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	PySymtable_Free(st);
254b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	return NULL;
2553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton error:
256b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	(void) symtable_exit_block(st, (void *)mod);
2573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PySymtable_Free(st);
2583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return NULL;
2593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
2603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonvoid
2623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPySymtable_Free(struct symtable *st)
2633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_XDECREF(st->st_symbols);
2653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_XDECREF(st->st_stack);
2663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyMem_Free((void *)st);
2673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
2683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPySTEntryObject *
2703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPySymtable_Lookup(struct symtable *st, void *key)
2713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *k, *v;
2733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	k = PyLong_FromVoidPtr(key);
2753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (k == NULL)
2763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return NULL;
2773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	v = PyDict_GetItem(st->st_symbols, k);
2783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (v) {
2793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		assert(PySTEntry_Check(v));
2803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_INCREF(v);
2813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
2823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	else {
2833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyErr_SetString(PyExc_KeyError,
2843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				"unknown symbol table entry");
2853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
286b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
287b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	Py_DECREF(k);
288b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	return (PySTEntryObject *)v;
2893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
2903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonint
2923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyST_GetScope(PySTEntryObject *ste, PyObject *name)
2933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
2953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!v)
2963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
2973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	assert(PyInt_Check(v));
2983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
2993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
3003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Analyze raw symbol information to determine scope of each name.
3033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   The next several functions are helpers for PySymtable_Analyze(),
3053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   which determines whether a name is local, global, or free.  In addition,
3063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   it determines which local variables are cell variables; they provide
3073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   bindings that are used for free variables in enclosed blocks.
3083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   There are also two kinds of free variables, implicit and explicit.  An
3103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   explicit global is declared with the global statement.  An implicit
3113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   global is a free variable for which the compiler has found no binding
3123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   in an enclosing function scope.  The implicit global is either a global
3133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   or a builtin.  Python's module and class blocks use the xxx_NAME opcodes
3143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   to handle these names to implement slightly odd semantics.  In such a
3153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   block, the name is treated as global until it is assigned to; then it
3163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   is treated as a local.
3173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   The symbol table requires two passes to determine the scope of each name.
3193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   The first pass collects raw facts from the AST: the name is a parameter
3203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   here, the name is used by not defined here, etc.  The second pass analyzes
3213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   these facts during a pass over the PySTEntryObjects created during pass 1.
3223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   When a function is entered during the second pass, the parent passes
3243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   the set of all name bindings visible to its children.  These bindings
3253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   are used to determine if the variable is free or an implicit global.
3263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   After doing the local analysis, it analyzes each of its child blocks
3273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   using an updated set of name bindings.
3283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   The children update the free variable set.  If a local variable is free
3303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   in a child, the variable is marked as a cell.  The current function must
3313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   provide runtime storage for the variable that may outlive the function's
3323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   frame.  Cell variables are removed from the free set before the analyze
3333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   function returns to its parent.
3343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   The sets of bound and free variables are implemented as dictionaries
3363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   mapping strings to None.
3373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
3383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define SET_SCOPE(DICT, NAME, I) { \
3403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *o = PyInt_FromLong(I); \
3413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!o) \
3423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0; \
343b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
344b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		Py_DECREF(o); \
3453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0; \
346b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	} \
347b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	Py_DECREF(o); \
3483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
3493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Decide on scope of name, given flags.
3513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   The dicts passed in as arguments are modified as necessary.
3533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   ste is passed so that flags can be updated.
3543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
3553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
35746b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitzanalyze_name(PySTEntryObject *ste, PyObject *dict, PyObject *name, long flags,
3583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	     PyObject *bound, PyObject *local, PyObject *free,
3593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	     PyObject *global)
3603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (flags & DEF_GLOBAL) {
3623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (flags & DEF_PARAM) {
3633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			PyErr_Format(PyExc_SyntaxError,
3643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				     "name '%s' is local and global",
3653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				     PyString_AS_STRING(name));
3663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
3673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
3683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
3693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_SetItem(global, name, Py_None) < 0)
3703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
3713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (bound && PyDict_GetItem(bound, name)) {
3723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (PyDict_DelItem(bound, name) < 0)
3733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				return 0;
3743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
3753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 1;
3763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
3773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (flags & DEF_BOUND) {
3783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		SET_SCOPE(dict, name, LOCAL);
3793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_SetItem(local, name, Py_None) < 0)
3803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
3813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_GetItem(global, name)) {
3823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (PyDict_DelItem(global, name) < 0)
3833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				return 0;
3843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
3853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 1;
3863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
3873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* If an enclosing block has a binding for this name, it
3883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	   is a free variable rather than a global variable.
3893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	   Note that having a non-NULL bound implies that the block
3903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	   is nested.
3913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	*/
3923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (bound && PyDict_GetItem(bound, name)) {
3933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		SET_SCOPE(dict, name, FREE);
3943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		ste->ste_free = 1;
3953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_SetItem(free, name, Py_None) < 0)
3963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
3973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 1;
3983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
3993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* If a parent has a global statement, then call it global
4003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	   explicit?  It could also be global implicit.
4013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	 */
4023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	else if (global && PyDict_GetItem(global, name)) {
4033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
4043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 1;
4053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
4063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	else {
4073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (ste->ste_nested)
4083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			ste->ste_free = 1;
4093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
4103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 1;
4113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
4123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 0; /* Can't get here */
4133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
4143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef SET_SCOPE
4163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* If a name is defined in free and also in locals, then this block
4183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   provides the binding for the free variable.  The name should be
4193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   marked CELL in this block and removed from the free list.
4203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Note that the current block's free variables are included in free.
4223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   That's safe because no name can be free and local in the same scope.
4233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
4243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
4263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonanalyze_cells(PyObject *scope, PyObject *free)
4273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
4283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        PyObject *name, *v, *w;
42946b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz	int pos = 0, success = 0;
4303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	w = PyInt_FromLong(CELL);
4323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!w)
4333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
4343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	while (PyDict_Next(scope, &pos, &name, &v)) {
4353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		assert(PyInt_Check(v));
43646b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz		long flags = PyInt_AS_LONG(v);
4373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (flags != LOCAL)
4383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			continue;
4393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!PyDict_GetItem(free, name))
4403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			continue;
4413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* Replace LOCAL with CELL for this name, and remove
4423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		   from free. It is safe to replace the value of name
4433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		   in the dict, because it will not cause a resize.
4443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		 */
4453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_SetItem(scope, name, w) < 0)
4463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			goto error;
4473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!PyDict_DelItem(free, name) < 0)
4483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			goto error;
4493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
4503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	success = 1;
4513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton error:
4523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_DECREF(w);
4533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return success;
4543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
4553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Check for illegal statements in unoptimized namespaces */
4573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
4583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncheck_unoptimized(const PySTEntryObject* ste) {
4593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	char buf[300];
46031441302171fe882976bcc05f5ded9645cd690afArmin Rigo	const char* trailer;
4613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4622dfcef5c57f35af0e1ba200ba36508be8667001aNeil Schemenauer	if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
4633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    || !(ste->ste_free || ste->ste_child_free))
4643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 1;
4653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
46631441302171fe882976bcc05f5ded9645cd690afArmin Rigo	trailer = (ste->ste_child_free ?
4673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		       "contains a nested function with free variables" :
4683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			       "is a nested function");
4693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	switch (ste->ste_unoptimized) {
4713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case OPT_TOPLEVEL: /* exec / import * at top-level is fine */
4723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case OPT_EXEC: /* qualified exec is fine */
4733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 1;
4743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case OPT_IMPORT_STAR:
4753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyOS_snprintf(buf, sizeof(buf),
4763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      "import * is not allowed in function '%.100s' "
4773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      "because it is %s",
4783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      PyString_AS_STRING(ste->ste_name), trailer);
4793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
4803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case OPT_BARE_EXEC:
4813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyOS_snprintf(buf, sizeof(buf),
4823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      "unqualified exec is not allowed in function "
4833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      "'%.100s' it %s",
4843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      PyString_AS_STRING(ste->ste_name), trailer);
4853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
4863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	default:
4873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyOS_snprintf(buf, sizeof(buf),
4883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      "function '%.100s' uses import * and bare exec, "
4893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      "which are illegal because it %s",
4903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      PyString_AS_STRING(ste->ste_name), trailer);
4913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
4923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
4933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyErr_SetString(PyExc_SyntaxError, buf);
4953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyErr_SyntaxLocation(ste->ste_table->st_filename,
4963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			     ste->ste_opt_lineno);
4973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 0;
4983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
4993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Enter the final scope information into the st_symbols dict.
5013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton *
5023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton * All arguments are dicts.  Modifies symbols, others are read-only.
5033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
5043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
5053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonupdate_symbols(PyObject *symbols, PyObject *scope,
5063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton               PyObject *bound, PyObject *free, int class)
5073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
5083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *name, *v, *u, *w, *free_value = NULL;
50946b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz	int pos = 0;
5103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	while (PyDict_Next(symbols, &pos, &name, &v)) {
51246b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz		long i, flags;
5133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		assert(PyInt_Check(v));
5143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		flags = PyInt_AS_LONG(v);
5153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		w = PyDict_GetItem(scope, name);
5163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		assert(w && PyInt_Check(w));
5173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		i = PyInt_AS_LONG(w);
5183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		flags |= (i << SCOPE_OFF);
5193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		u = PyInt_FromLong(flags);
5203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_SetItem(symbols, name, u) < 0) {
5213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			Py_DECREF(u);
5223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
5233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
5243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_DECREF(u);
5253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
5263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        free_value = PyInt_FromLong(FREE << SCOPE_OFF);
5283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        if (!free_value)
5293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
5303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        /* add a free variable when it's only use is for creating a closure */
5323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        pos = 0;
5333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	while (PyDict_Next(free, &pos, &name, &v)) {
5343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyObject *o = PyDict_GetItem(symbols, name);
5353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (o) {
5373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			/* It could be a free variable in a method of
5383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			   the class that has the same name as a local
5393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			   or global in the class scope.
5403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			*/
5413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if  (class &&
5423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			     PyInt_AS_LONG(o) & (DEF_BOUND | DEF_GLOBAL)) {
54346b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz				long i = PyInt_AS_LONG(o) | DEF_FREE_CLASS;
5443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				o = PyInt_FromLong(i);
5453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				if (!o) {
5463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					Py_DECREF(free_value);
5473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					return 0;
5483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				}
5493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				if (PyDict_SetItem(symbols, name, o) < 0) {
5503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					Py_DECREF(o);
5513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					Py_DECREF(free_value);
5523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					return 0;
5533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				}
554b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz				Py_DECREF(o);
5553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			}
5563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			/* else it's not free, probably a cell */
5573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			continue;
5583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
5593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!PyDict_GetItem(bound, name))
5603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			continue;       /* it's a global */
5613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_SetItem(symbols, name, free_value) < 0) {
5633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			Py_DECREF(free_value);
5643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
5653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
5663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        }
5673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        Py_DECREF(free_value);
5683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
5693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
5703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Make final symbol table decisions for block of ste.
5723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Arguments:
5733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   ste -- current symtable entry (input/output)
5743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   bound -- set of variables bound in enclosing scopes (input)
5753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   free -- set of free variables in enclosed scopes (output)
5763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   globals -- set of declared global variables in enclosing scopes (input)
5773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
5783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
5803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonanalyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
5813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	      PyObject *global)
5823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
5833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *name, *v, *local = NULL, *scope = NULL, *newbound = NULL;
5843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *newglobal = NULL, *newfree = NULL;
58546b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz	int i, pos = 0, success = 0;
5863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
5873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	local = PyDict_New();
5883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!local)
5893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
5903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	scope = PyDict_New();
5913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!scope)
5923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
5933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	newglobal = PyDict_New();
5943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!newglobal)
5953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
5963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	newfree = PyDict_New();
5973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!newfree)
5983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
5993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	newbound = PyDict_New();
6003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!newbound)
6013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
6023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (ste->ste_type == ClassBlock) {
6043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* make a copy of globals before calling analyze_name(),
6053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		   because global statements in the class have no effect
6063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		   on nested functions.
6073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		*/
6083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_Update(newglobal, global) < 0)
6093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			goto error;
6103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (bound)
6113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (PyDict_Update(newbound, bound) < 0)
6123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				goto error;
6133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
6143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	assert(PySTEntry_Check(ste));
6163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	assert(PyDict_Check(ste->ste_symbols));
6173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
61846b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz		long flags = PyInt_AS_LONG(v);
6193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!analyze_name(ste, scope, name, flags, bound, local, free,
6203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				  global))
6213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			goto error;
6223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
6233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (ste->ste_type != ClassBlock) {
6253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (ste->ste_type == FunctionBlock) {
6263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (PyDict_Update(newbound, local) < 0)
6273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				goto error;
6283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
6293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (bound) {
6303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (PyDict_Update(newbound, bound) < 0)
6313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				goto error;
6323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
6333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyDict_Update(newglobal, global) < 0)
6343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			goto error;
6353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
6363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* Recursively call analyze_block() on each child block */
6383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
6393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
64031441302171fe882976bcc05f5ded9645cd690afArmin Rigo		PySTEntryObject* entry;
6413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		assert(c && PySTEntry_Check(c));
64231441302171fe882976bcc05f5ded9645cd690afArmin Rigo		entry = (PySTEntryObject*)c;
6433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!analyze_block(entry, newbound, newfree, newglobal))
6443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			goto error;
6453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (entry->ste_free || entry->ste_child_free)
6463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			ste->ste_child_free = 1;
6473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
6483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (ste->ste_type == FunctionBlock && !analyze_cells(scope, newfree))
6503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
6513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!update_symbols(ste->ste_symbols, scope, bound, newfree,
6523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			    ste->ste_type == ClassBlock))
6533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
6543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!check_unoptimized(ste))
6553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
6563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (PyDict_Update(free, newfree) < 0)
6583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		goto error;
6593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	success = 1;
6603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton error:
6613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_XDECREF(local);
6623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_XDECREF(scope);
6633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_XDECREF(newbound);
6643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_XDECREF(newglobal);
6653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_XDECREF(newfree);
6663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!success)
6673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		assert(PyErr_Occurred());
6683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return success;
6693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
6703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
6723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_analyze(struct symtable *st)
6733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
6743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *free, *global;
6753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	int r;
6763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	free = PyDict_New();
6783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!free)
6793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    return 0;
6803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	global = PyDict_New();
6813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!global) {
682b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	    Py_DECREF(free);
6833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    return 0;
6843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
6853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	r = analyze_block(st->st_top, NULL, free, global);
6863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_DECREF(free);
6873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_DECREF(global);
6883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return r;
6893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
6903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
6923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
6935d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitzsymtable_warn(struct symtable *st, char *msg, int lineno)
6943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
6953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
6965d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitz			       lineno, NULL, NULL) < 0)	{
6973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
6983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			PyErr_SetString(PyExc_SyntaxError, msg);
6993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			PyErr_SyntaxLocation(st->st_filename,
7003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					     st->st_cur->ste_lineno);
7013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
7023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
7033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
7043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
7053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
7063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
7073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* symtable_enter_block() gets a reference via PySTEntry_New().
7083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   This reference is released when the block is exited, via the DECREF
7093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   in symtable_exit_block().
7103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
7113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
7123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
7133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_exit_block(struct symtable *st, void *ast)
7143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
7153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	int end;
7163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
7173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_DECREF(st->st_cur);
7183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	end = PyList_GET_SIZE(st->st_stack) - 1;
7193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (end >= 0) {
7203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
7213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton								end);
7223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_INCREF(st->st_cur);
7233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PySequence_DelItem(st->st_stack, end) < 0)
7243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
7253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
7263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
7273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
7283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
7293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
73062c2fac9a0758f303c0382e459031a2679a056e2Neal Norwitzsymtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
7313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		     void *ast, int lineno)
7323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
7333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PySTEntryObject *prev = NULL;
7343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
7353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (st->st_cur) {
7363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		prev = st->st_cur;
7373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
7383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
7393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
7403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_DECREF(st->st_cur);
7413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
7423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_cur = PySTEntry_New(st, name, block, ast, lineno);
7433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (name == GET_IDENTIFIER(top))
7443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		st->st_global = st->st_cur->ste_symbols;
7453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (prev) {
7463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (PyList_Append(prev->ste_children,
7473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				  (PyObject *)st->st_cur) < 0) {
7483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
7493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
7503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
7513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
7523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
7533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
75446b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitzstatic long
7553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_lookup(struct symtable *st, PyObject *name)
7563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
7573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *o;
7588b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	PyObject *mangled = _Py_Mangle(st->st_private, name);
7598b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	if (!mangled)
7608b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		return 0;
7618b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
7628b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	Py_DECREF(mangled);
7633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!o)
7643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
7653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return PyInt_AsLong(o);
7663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
7673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
7683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
7693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_add_def(struct symtable *st, PyObject *name, int flag)
7703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
7713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *o;
7723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *dict;
77346b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz	long val;
7748b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	PyObject *mangled = _Py_Mangle(st->st_private, name);
7753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
7768b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	if (!mangled)
7778b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		return 0;
7783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	dict = st->st_cur->ste_symbols;
7798b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	if ((o = PyDict_GetItem(dict, mangled))) {
7803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    val = PyInt_AS_LONG(o);
7813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
7828b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		    /* Is it better to use 'mangled' or 'name' here? */
7833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		    PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
7843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				 PyString_AsString(name));
7853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		    PyErr_SyntaxLocation(st->st_filename,
7863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				       st->st_cur->ste_lineno);
7878b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		    goto error;
7883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    }
7893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    val |= flag;
7903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	} else
7913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    val = flag;
7923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	o = PyInt_FromLong(val);
7933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        if (o == NULL)
7948b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	    goto error;
7958b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	if (PyDict_SetItem(dict, mangled, o) < 0) {
7963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_DECREF(o);
7978b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		goto error;
7983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
7993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_DECREF(o);
8003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
8013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (flag & DEF_PARAM) {
8028b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
8038b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer			goto error;
8043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	} else	if (flag & DEF_GLOBAL) {
8053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* XXX need to update DEF_GLOBAL for other flags too;
8063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		   perhaps only DEF_FREE_GLOBAL */
8073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		val = flag;
8088b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		if ((o = PyDict_GetItem(st->st_global, mangled))) {
8093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			val |= PyInt_AS_LONG(o);
8103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
8113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		o = PyInt_FromLong(val);
8123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (o == NULL)
8138b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer			goto error;
8148b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
8153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			Py_DECREF(o);
8168b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer			goto error;
8173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
8183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_DECREF(o);
8193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
8204737b2348b197d21deffbf12ff23488918e9b9d4Neal Norwitz	Py_DECREF(mangled);
8213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
8228b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer
8238b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauererror:
8248b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	Py_DECREF(mangled);
8258b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	return 0;
8263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
8273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
8283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
8293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   They use the ASDL name to synthesize the name of the C type and the visit
8303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   function.
8313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
8323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
8333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   useful if the first node in the sequence requires special treatment.
8343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
8353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
8363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define VISIT(ST, TYPE, V) \
8373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!symtable_visit_ ## TYPE((ST), (V))) \
8383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
839b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
840b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz#define VISIT_IN_BLOCK(ST, TYPE, V, S) \
841b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	if (!symtable_visit_ ## TYPE((ST), (V))) { \
842b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		symtable_exit_block((ST), (S)); \
843b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		return 0; \
844b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	}
845b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
8463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define VISIT_SEQ(ST, TYPE, SEQ) { \
8473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	int i; \
8483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	asdl_seq *seq = (SEQ); /* avoid variable capture */ \
8493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	for (i = 0; i < asdl_seq_LEN(seq); i++) { \
8503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		TYPE ## _ty elt = asdl_seq_GET(seq, i); \
8513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_visit_ ## TYPE((ST), elt)) \
8523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0; \
8533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	} \
8543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
855b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
856b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
857b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	int i; \
858b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	asdl_seq *seq = (SEQ); /* avoid variable capture */ \
859b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	for (i = 0; i < asdl_seq_LEN(seq); i++) { \
860b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		TYPE ## _ty elt = asdl_seq_GET(seq, i); \
861b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		if (!symtable_visit_ ## TYPE((ST), elt)) { \
862b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz			symtable_exit_block((ST), (S)); \
863b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz			return 0; \
864b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		} \
865b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	} \
866b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz}
867b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
8683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
8693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	int i; \
8703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	asdl_seq *seq = (SEQ); /* avoid variable capture */ \
8713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	for (i = (START); i < asdl_seq_LEN(seq); i++) { \
8723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		TYPE ## _ty elt = asdl_seq_GET(seq, i); \
8733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_visit_ ## TYPE((ST), elt)) \
8743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0; \
8753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	} \
8763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
877b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
878b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
879b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	int i; \
880b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	asdl_seq *seq = (SEQ); /* avoid variable capture */ \
881b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	for (i = (START); i < asdl_seq_LEN(seq); i++) { \
882b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		TYPE ## _ty elt = asdl_seq_GET(seq, i); \
883b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		if (!symtable_visit_ ## TYPE((ST), elt)) { \
884b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz			symtable_exit_block((ST), (S)); \
885b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz			return 0; \
886b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		} \
887b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	} \
888b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz}
889b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
8903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
8913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_stmt(struct symtable *st, stmt_ty s)
8923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
8933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	switch (s->kind) {
8943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case FunctionDef_kind:
8953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
8963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
8973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.FunctionDef.args->defaults)
8983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
8993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.FunctionDef.decorators)
9003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT_SEQ(st, expr, s->v.FunctionDef.decorators);
9013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_enter_block(st, s->v.FunctionDef.name,
9023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					  FunctionBlock, (void *)s, s->lineno))
9033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
904b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
905b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
9063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_exit_block(st, s))
9073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
9083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9098b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer        case ClassDef_kind: {
9108b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		PyObject *tmp;
9113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
9123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
9133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, s->v.ClassDef.bases);
9143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
9153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					  (void *)s, s->lineno))
9163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
9178b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		tmp = st->st_private;
9188b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		st->st_private = s->v.ClassDef.name;
919b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
9208b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer		st->st_private = tmp;
9213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_exit_block(st, s))
9223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
9233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9248b528b28f15a78c116fc90303194ad8b1476034dNeil Schemenauer	}
9253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Return_kind:
9263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.Return.value)
9273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, s->v.Return.value);
9283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Delete_kind:
9303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, s->v.Delete.targets);
9313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Assign_kind:
9333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, s->v.Assign.targets);
9343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.Assign.value);
9353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case AugAssign_kind:
9373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.AugAssign.target);
9383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.AugAssign.value);
9393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Print_kind:
9413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.Print.dest)
9423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, s->v.Print.dest);
9433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, s->v.Print.values);
9443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case For_kind:
9463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.For.target);
9473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.For.iter);
9483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, stmt, s->v.For.body);
9493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.For.orelse)
9503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT_SEQ(st, stmt, s->v.For.orelse);
9513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case While_kind:
9533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.While.test);
9543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, stmt, s->v.While.body);
9553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.While.orelse)
9563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT_SEQ(st, stmt, s->v.While.orelse);
9573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case If_kind:
9593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* XXX if 0: and lookup_yield() hacks */
9603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.If.test);
9613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, stmt, s->v.If.body);
9623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.If.orelse)
9633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT_SEQ(st, stmt, s->v.If.orelse);
9643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Raise_kind:
9663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.Raise.type) {
9673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, s->v.Raise.type);
9683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (s->v.Raise.inst) {
9693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				VISIT(st, expr, s->v.Raise.inst);
9703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				if (s->v.Raise.tback)
9713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					VISIT(st, expr, s->v.Raise.tback);
9723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			}
9733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
9743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case TryExcept_kind:
9763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, stmt, s->v.TryExcept.body);
9773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
9783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
9793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case TryFinally_kind:
9813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, stmt, s->v.TryFinally.body);
9823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
9833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Assert_kind:
9853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.Assert.test);
9863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.Assert.msg)
9873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, s->v.Assert.msg);
9883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Import_kind:
9903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, alias, s->v.Import.names);
9913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* XXX Don't have the lineno available inside
9923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		   visit_alias */
9933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
9943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			st->st_cur->ste_opt_lineno = s->lineno;
9953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
9963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case ImportFrom_kind:
9973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, alias, s->v.ImportFrom.names);
9983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* XXX Don't have the lineno available inside
9993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		   visit_alias */
10003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
10013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			st->st_cur->ste_opt_lineno = s->lineno;
10023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Exec_kind:
10043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.Exec.body);
10053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!st->st_cur->ste_opt_lineno)
10063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			st->st_cur->ste_opt_lineno = s->lineno;
10073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.Exec.globals) {
10083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			st->st_cur->ste_unoptimized |= OPT_EXEC;
10093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, s->v.Exec.globals);
10103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (s->v.Exec.locals)
10113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				VISIT(st, expr, s->v.Exec.locals);
10123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		} else {
10133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			st->st_cur->ste_unoptimized |= OPT_BARE_EXEC;
10143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
10153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Global_kind: {
10173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		int i;
10183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		asdl_seq *seq = s->v.Global.names;
10193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		for (i = 0; i < asdl_seq_LEN(seq); i++) {
10203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			identifier name = asdl_seq_GET(seq, i);
10213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			char *c_name = PyString_AS_STRING(name);
102246b7bda9bcd0fb11878a154234c3064e19e35f3cNeal Norwitz			long cur = symtable_lookup(st, name);
10233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (cur < 0)
10243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				return 0;
10253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (cur & (DEF_LOCAL | USE)) {
1026b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz				char buf[256];
10273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				if (cur & DEF_LOCAL)
10283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					PyOS_snprintf(buf, sizeof(buf),
10293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton						      GLOBAL_AFTER_ASSIGN,
10303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton						      c_name);
10313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				else
10323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					PyOS_snprintf(buf, sizeof(buf),
10333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton						      GLOBAL_AFTER_USE,
10343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton						      c_name);
10355d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitz				if (!symtable_warn(st, buf, s->lineno))
10363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton                                    return 0;
10373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			}
10383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (!symtable_add_def(st, name, DEF_GLOBAL))
10393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				return 0;
10403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
10413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
10433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Expr_kind:
10443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.Expr.value);
10453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Pass_kind:
10473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Break_kind:
10483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Continue_kind:
10493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* nothing to do here */
10503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
10523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
10533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
10543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
10553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
10563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_expr(struct symtable *st, expr_ty e)
10573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
10583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	switch (e->kind) {
10593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case BoolOp_kind:
10603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, e->v.BoolOp.values);
10613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case BinOp_kind:
10633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.BinOp.left);
10643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.BinOp.right);
10653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case UnaryOp_kind:
10673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.UnaryOp.operand);
10683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Lambda_kind: {
10703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_add_def(st, GET_IDENTIFIER(lambda), DEF_LOCAL))
10713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
10723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (e->v.Lambda.args->defaults)
10733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
10743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* XXX how to get line numbers for expressions */
10753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_enter_block(st, GET_IDENTIFIER(lambda),
10763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton                                          FunctionBlock, (void *)e, 0))
10773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
1078b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
1079b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
10803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_exit_block(st, (void *)e))
10813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
10823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
10843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Dict_kind:
10853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, e->v.Dict.keys);
10863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, e->v.Dict.values);
10873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
10883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case ListComp_kind: {
10893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		char tmpname[256];
10903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		identifier tmp;
10913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
10923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
10933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			      ++st->st_cur->ste_tmpname);
10944737b2348b197d21deffbf12ff23488918e9b9d4Neal Norwitz		tmp = PyString_InternFromString(tmpname);
10953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_add_def(st, tmp, DEF_LOCAL))
10963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
10974737b2348b197d21deffbf12ff23488918e9b9d4Neal Norwitz		Py_DECREF(tmp);
10983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.ListComp.elt);
10993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, comprehension, e->v.ListComp.generators);
11003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
11023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case GeneratorExp_kind: {
11033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_visit_genexp(st, e)) {
11043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
11053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
11063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
11083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Yield_kind:
11093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (e->v.Yield.value)
11103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, e->v.Yield.value);
11113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton                st->st_cur->ste_generator = 1;
11123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Compare_kind:
11143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.Compare.left);
11153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, e->v.Compare.comparators);
11163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Call_kind:
11183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.Call.func);
11193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, e->v.Call.args);
11203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, keyword, e->v.Call.keywords);
11213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (e->v.Call.starargs)
11223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, e->v.Call.starargs);
11233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (e->v.Call.kwargs)
11243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, e->v.Call.kwargs);
11253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Repr_kind:
11273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.Repr.value);
11283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Num_kind:
11303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Str_kind:
11313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		/* Nothing to do here. */
11323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* The following exprs can be assignment targets. */
11343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Attribute_kind:
11353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.Attribute.value);
11363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Subscript_kind:
11383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, e->v.Subscript.value);
11393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, slice, e->v.Subscript.slice);
11403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Name_kind:
11423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_add_def(st, e->v.Name.id,
11433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				      e->v.Name.ctx == Load ? USE : DEF_LOCAL))
11443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
11453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* child nodes of List and Tuple will have expr_context set */
11473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case List_kind:
11483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, e->v.List.elts);
11493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        case Tuple_kind:
11513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, expr, e->v.Tuple.elts);
11523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
11533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
11543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
11553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
11563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
11573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
11583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_implicit_arg(struct symtable *st, int pos)
11593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
11603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *id = PyString_FromFormat(".%d", pos);
11613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (id == NULL)
11623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
11633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!symtable_add_def(st, id, DEF_PARAM)) {
11643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_DECREF(id);
11653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
11663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
11673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	Py_DECREF(id);
11683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
11693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
11703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
11713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
11723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
11733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
1174daf595f8a91c1a9f9a8ba5e06be4fa77c66cccf0Neal Norwitz	int i;
11753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
11763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        /* go through all the toplevel arguments first */
11773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	for (i = 0; i < asdl_seq_LEN(args); i++) {
11783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		expr_ty arg = asdl_seq_GET(args, i);
11793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (arg->kind == Name_kind) {
11803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			assert(arg->v.Name.ctx == Param ||
11813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton                               (arg->v.Name.ctx == Store && !toplevel));
11823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
11833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				return 0;
11843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
11853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		else if (arg->kind == Tuple_kind) {
11863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			assert(arg->v.Tuple.ctx == Store);
11873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			if (toplevel) {
11883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				if (!symtable_implicit_arg(st, i))
11893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					return 0;
11903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			}
11913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
11923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		else {
11934737b2348b197d21deffbf12ff23488918e9b9d4Neal Norwitz		        PyErr_SetString(PyExc_SyntaxError,
11944737b2348b197d21deffbf12ff23488918e9b9d4Neal Norwitz					"invalid expression in parameter list");
11954737b2348b197d21deffbf12ff23488918e9b9d4Neal Norwitz		        PyErr_SyntaxLocation(st->st_filename,
11964737b2348b197d21deffbf12ff23488918e9b9d4Neal Norwitz				             st->st_cur->ste_lineno);
11973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
11983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		}
11993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!toplevel) {
12023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_visit_params_nested(st, args))
12033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
12043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
12073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
12083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
12103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_params_nested(struct symtable *st, asdl_seq *args)
12113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
12123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	int i;
12133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	for (i = 0; i < asdl_seq_LEN(args); i++) {
12143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		expr_ty arg = asdl_seq_GET(args, i);
12153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (arg->kind == Tuple_kind &&
12163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		    !symtable_visit_params(st, arg->v.Tuple.elts, 0))
12173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
12183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
12213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
12223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
12243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_arguments(struct symtable *st, arguments_ty a)
12253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
12263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* skip default arguments inside function block
12273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	   XXX should ast be different?
12283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	*/
12293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (a->args && !symtable_visit_params(st, a->args, 1))
12303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
12313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (a->vararg) {
12323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_add_def(st, a->vararg, DEF_PARAM))
12333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
12343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		st->st_cur->ste_varargs = 1;
12353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (a->kwarg) {
12373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
12383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			return 0;
12393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		st->st_cur->ste_varkeywords = 1;
12403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (a->args && !symtable_visit_params_nested(st, a->args))
12423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
12433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
12443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
12453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
12483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
12493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
12503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (eh->type)
12513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, eh->type);
12523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (eh->name)
12533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, eh->name);
12543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	VISIT_SEQ(st, stmt, eh->body);
12553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
12563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
12573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
12603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_alias(struct symtable *st, alias_ty a)
12613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
12623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* Compute store_name, the name actually bound by the import
12633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	   operation.  It is diferent than a->name when a->name is a
12643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	   dotted package name (e.g. spam.eggs)
12653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	*/
12663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *store_name;
12673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *name = (a->asname == NULL) ? a->name : a->asname;
12683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	const char *base = PyString_AS_STRING(name);
12693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	char *dot = strchr(base, '.');
12703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (dot)
12713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		store_name = PyString_FromStringAndSize(base, dot - base);
12723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	else {
12733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		store_name = name;
12743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_INCREF(store_name);
12753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (strcmp(PyString_AS_STRING(name), "*")) {
12773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		int r = symtable_add_def(st, store_name, DEF_IMPORT);
12783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		Py_DECREF(store_name);
12793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return r;
12803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	else {
12823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton            if (st->st_cur->ste_type != ModuleBlock) {
12835d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitz                int lineno = st->st_cur->ste_lineno;
12845d0ad50f5acf84f2e8a1ca5c6951f333aef0e25aNeal Norwitz                if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
12853715c3e576a182692cf2ad2d390732126f11780dNeal Norwitz                    Py_DECREF(store_name);
12863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton                    return 0;
12873715c3e576a182692cf2ad2d390732126f11780dNeal Norwitz		}
12883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton            }
12893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
12904737b2348b197d21deffbf12ff23488918e9b9d4Neal Norwitz	    Py_DECREF(store_name);
12913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    return 1;
12923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
12943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
12973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
12983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
12993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	VISIT(st, expr, lc->target);
13003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	VISIT(st, expr, lc->iter);
13013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	VISIT_SEQ(st, expr, lc->ifs);
13023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
13033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
13043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
13053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
13063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
13073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_keyword(struct symtable *st, keyword_ty k)
13083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
13093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	VISIT(st, expr, k->value);
13103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
13113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
13123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
13133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
13143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
13153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_slice(struct symtable *st, slice_ty s)
13163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
13173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	switch (s->kind) {
13183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case Slice_kind:
13193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.Slice.lower)
13203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, s->v.Slice.lower)
13213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.Slice.upper)
13223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, s->v.Slice.upper)
13233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (s->v.Slice.step)
13243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			VISIT(st, expr, s->v.Slice.step)
13253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
13263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case ExtSlice_kind:
13273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
13283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
13293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case Index_kind:
13303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		VISIT(st, expr, s->v.Index.value)
13313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
13323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	case Ellipsis_kind:
13333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		break;
13343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
13353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
13363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
13373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
13383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
13393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonsymtable_visit_genexp(struct symtable *st, expr_ty e)
13403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
13413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	comprehension_ty outermost = ((comprehension_ty)
13423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			 (asdl_seq_GET(e->v.GeneratorExp.generators, 0)));
13433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* Outermost iterator is evaluated in current scope */
13443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	VISIT(st, expr, outermost->iter);
13453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* Create generator scope for the rest */
134699b2533539dbc98fe7e5b3ac95e71879afca1c2cNick Coghlan	if (!symtable_enter_block(st, GET_IDENTIFIER(genexpr),
134799b2533539dbc98fe7e5b3ac95e71879afca1c2cNick Coghlan				  FunctionBlock, (void *)e, 0)) {
13483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
13493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
13503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st->st_cur->ste_generator = 1;
13513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	/* Outermost iter is received as an argument */
13523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!symtable_implicit_arg(st, 0)) {
1353b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz		symtable_exit_block(st, (void *)e);
13543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
13553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
1356b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
1357b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
1358b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
1359b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz				e->v.GeneratorExp.generators, 1, (void*)e);
1360b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz	VISIT_IN_BLOCK(st, expr, e->v.GeneratorExp.elt, (void*)e);
13613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (!symtable_exit_block(st, (void *)e))
13623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return 0;
13633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return 1;
13643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
1365