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