Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Python/symtable.c

    r2 r391  
    2020static PySTEntryObject *
    2121ste_new(struct symtable *st, identifier name, _Py_block_ty block,
    22               void *key, int lineno)
    23 {
    24         PySTEntryObject *ste = NULL;
    25         PyObject *k;
    26 
    27         k = PyLong_FromVoidPtr(key);
    28         if (k == NULL)
    29                 goto fail;
    30         ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
    31         if (ste == NULL)
    32                 goto fail;
    33         ste->ste_table = st;
    34         ste->ste_id = k;
    35         ste->ste_tmpname = 0;
    36 
    37         ste->ste_name = name;
    38         Py_INCREF(name);
    39 
    40         ste->ste_symbols = NULL;
    41         ste->ste_varnames = NULL;
    42         ste->ste_children = NULL;
    43 
    44         ste->ste_symbols = PyDict_New();
    45         if (ste->ste_symbols == NULL)
    46             goto fail;
    47 
    48         ste->ste_varnames = PyList_New(0);
    49         if (ste->ste_varnames == NULL)
    50             goto fail;
    51 
    52         ste->ste_children = PyList_New(0);
    53         if (ste->ste_children == NULL)
    54             goto fail;
    55 
    56         ste->ste_type = block;
    57         ste->ste_unoptimized = 0;
    58         ste->ste_nested = 0;
    59         ste->ste_free = 0;
    60         ste->ste_varargs = 0;
    61         ste->ste_varkeywords = 0;
    62         ste->ste_opt_lineno = 0;
    63         ste->ste_tmpname = 0;
    64         ste->ste_lineno = lineno;
    65 
    66         if (st->st_cur != NULL &&
    67             (st->st_cur->ste_nested ||
    68              st->st_cur->ste_type == FunctionBlock))
    69                 ste->ste_nested = 1;
    70         ste->ste_child_free = 0;
    71         ste->ste_generator = 0;
    72         ste->ste_returns_value = 0;
    73 
    74         if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0)
    75             goto fail;
    76        
    77         return ste;
     22              void *key, int lineno)
     23{
     24    PySTEntryObject *ste = NULL;
     25    PyObject *k = NULL;
     26
     27    k = PyLong_FromVoidPtr(key);
     28    if (k == NULL)
     29        goto fail;
     30    ste = PyObject_New(PySTEntryObject, &PySTEntry_Type);
     31    if (ste == NULL) {
     32        Py_DECREF(k);
     33        goto fail;
     34    }
     35    ste->ste_table = st;
     36    ste->ste_id = k; /* ste owns reference to k */
     37
     38    ste->ste_name = name;
     39    Py_INCREF(name);
     40
     41    ste->ste_symbols = NULL;
     42    ste->ste_varnames = NULL;
     43    ste->ste_children = NULL;
     44
     45    ste->ste_symbols = PyDict_New();
     46    if (ste->ste_symbols == NULL)
     47        goto fail;
     48
     49    ste->ste_varnames = PyList_New(0);
     50    if (ste->ste_varnames == NULL)
     51        goto fail;
     52
     53    ste->ste_children = PyList_New(0);
     54    if (ste->ste_children == NULL)
     55        goto fail;
     56
     57    ste->ste_type = block;
     58    ste->ste_unoptimized = 0;
     59    ste->ste_nested = 0;
     60    ste->ste_free = 0;
     61    ste->ste_varargs = 0;
     62    ste->ste_varkeywords = 0;
     63    ste->ste_opt_lineno = 0;
     64    ste->ste_tmpname = 0;
     65    ste->ste_lineno = lineno;
     66
     67    if (st->st_cur != NULL &&
     68        (st->st_cur->ste_nested ||
     69         st->st_cur->ste_type == FunctionBlock))
     70        ste->ste_nested = 1;
     71    ste->ste_child_free = 0;
     72    ste->ste_generator = 0;
     73    ste->ste_returns_value = 0;
     74
     75    if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0)
     76        goto fail;
     77
     78    return ste;
    7879 fail:
    79         Py_XDECREF(ste);
    80         return NULL;
     80    Py_XDECREF(ste);
     81    return NULL;
    8182}
    8283
     
    8485ste_repr(PySTEntryObject *ste)
    8586{
    86         char buf[256];
    87 
    88         PyOS_snprintf(buf, sizeof(buf),
    89                       "<symtable entry %.100s(%ld), line %d>",
    90                       PyString_AS_STRING(ste->ste_name),
    91                       PyInt_AS_LONG(ste->ste_id), ste->ste_lineno);
    92         return PyString_FromString(buf);
     87    char buf[256];
     88
     89    PyOS_snprintf(buf, sizeof(buf),
     90                  "<symtable entry %.100s(%ld), line %d>",
     91                  PyString_AS_STRING(ste->ste_name),
     92                  PyInt_AS_LONG(ste->ste_id), ste->ste_lineno);
     93    return PyString_FromString(buf);
    9394}
    9495
     
    9697ste_dealloc(PySTEntryObject *ste)
    9798{
    98         ste->ste_table = NULL;
    99         Py_XDECREF(ste->ste_id);
    100         Py_XDECREF(ste->ste_name);
    101         Py_XDECREF(ste->ste_symbols);
    102         Py_XDECREF(ste->ste_varnames);
    103         Py_XDECREF(ste->ste_children);
    104         PyObject_Del(ste);
     99    ste->ste_table = NULL;
     100    Py_XDECREF(ste->ste_id);
     101    Py_XDECREF(ste->ste_name);
     102    Py_XDECREF(ste->ste_symbols);
     103    Py_XDECREF(ste->ste_varnames);
     104    Py_XDECREF(ste->ste_children);
     105    PyObject_Del(ste);
    105106}
    106107
     
    108109
    109110static PyMemberDef ste_memberlist[] = {
    110         {"id",       T_OBJECT, OFF(ste_id), READONLY},
    111         {"name",     T_OBJECT, OFF(ste_name), READONLY},
    112         {"symbols",  T_OBJECT, OFF(ste_symbols), READONLY},
    113         {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
    114         {"children", T_OBJECT, OFF(ste_children), READONLY},
    115         {"optimized",T_INT,    OFF(ste_unoptimized), READONLY},
    116         {"nested",   T_INT,    OFF(ste_nested), READONLY},
    117         {"type",     T_INT,    OFF(ste_type), READONLY},
    118         {"lineno",   T_INT,    OFF(ste_lineno), READONLY},
    119         {NULL}
     111    {"id",       T_OBJECT, OFF(ste_id), READONLY},
     112    {"name",     T_OBJECT, OFF(ste_name), READONLY},
     113    {"symbols",  T_OBJECT, OFF(ste_symbols), READONLY},
     114    {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
     115    {"children", T_OBJECT, OFF(ste_children), READONLY},
     116    {"optimized",T_INT,    OFF(ste_unoptimized), READONLY},
     117    {"nested",   T_INT,    OFF(ste_nested), READONLY},
     118    {"type",     T_INT,    OFF(ste_type), READONLY},
     119    {"lineno",   T_INT,    OFF(ste_lineno), READONLY},
     120    {NULL}
    120121};
    121122
    122123PyTypeObject PySTEntry_Type = {
    123         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    124         "symtable entry",
    125         sizeof(PySTEntryObject),
    126         0,
    127         (destructor)ste_dealloc,                /* tp_dealloc */
    128         0,                                      /* tp_print */
    129         0,                                     /* tp_getattr */
    130         0,                                      /* tp_setattr */
    131         0,                                      /* tp_compare */
    132         (reprfunc)ste_repr,                     /* tp_repr */
    133         0,                                      /* tp_as_number */
    134         0,                                      /* tp_as_sequence */
    135         0,                                      /* tp_as_mapping */
    136         0,                                      /* tp_hash */
    137         0,                                      /* tp_call */
    138         0,                                      /* tp_str */
    139         PyObject_GenericGetAttr,                /* tp_getattro */
    140         0,                                      /* tp_setattro */
    141         0,                                      /* tp_as_buffer */
    142         Py_TPFLAGS_DEFAULT,                     /* tp_flags */
    143         0,                                      /* tp_doc */
    144         0,                                      /* tp_traverse */
    145         0,                                      /* tp_clear */
    146         0,                                      /* tp_richcompare */
    147         0,                                      /* tp_weaklistoffset */
    148         0,                                      /* tp_iter */
    149         0,                                      /* tp_iternext */
    150         0,                                      /* tp_methods */
    151         ste_memberlist,                         /* tp_members */
    152         0,                                      /* tp_getset */
    153         0,                                      /* tp_base */
    154         0,                                      /* tp_dict */
    155         0,                                      /* tp_descr_get */
    156         0,                                      /* tp_descr_set */
    157         0,                                      /* tp_dictoffset */
    158         0,                                      /* tp_init */
    159         0,                                      /* tp_alloc */
    160         0,                                      /* tp_new */
     124    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     125    "symtable entry",
     126    sizeof(PySTEntryObject),
     127    0,
     128    (destructor)ste_dealloc,                /* tp_dealloc */
     129    0,                                      /* tp_print */
     130    0,                                         /* tp_getattr */
     131    0,                                          /* tp_setattr */
     132    0,                                          /* tp_compare */
     133    (reprfunc)ste_repr,                         /* tp_repr */
     134    0,                                          /* tp_as_number */
     135    0,                                          /* tp_as_sequence */
     136    0,                                          /* tp_as_mapping */
     137    0,                                          /* tp_hash */
     138    0,                                          /* tp_call */
     139    0,                                          /* tp_str */
     140    PyObject_GenericGetAttr,                    /* tp_getattro */
     141    0,                                          /* tp_setattro */
     142    0,                                          /* tp_as_buffer */
     143    Py_TPFLAGS_DEFAULT,                         /* tp_flags */
     144    0,                                          /* tp_doc */
     145    0,                                          /* tp_traverse */
     146    0,                                          /* tp_clear */
     147    0,                                          /* tp_richcompare */
     148    0,                                          /* tp_weaklistoffset */
     149    0,                                          /* tp_iter */
     150    0,                                          /* tp_iternext */
     151    0,                                          /* tp_methods */
     152    ste_memberlist,                             /* tp_members */
     153    0,                                          /* tp_getset */
     154    0,                                          /* tp_base */
     155    0,                                          /* tp_dict */
     156    0,                                          /* tp_descr_get */
     157    0,                                          /* tp_descr_set */
     158    0,                                          /* tp_dictoffset */
     159    0,                                          /* tp_init */
     160    0,                                          /* tp_alloc */
     161    0,                                          /* tp_new */
    161162};
    162163
    163164static int symtable_analyze(struct symtable *st);
    164165static int symtable_warn(struct symtable *st, char *msg, int lineno);
    165 static int symtable_enter_block(struct symtable *st, identifier name, 
    166                                 _Py_block_ty block, void *ast, int lineno);
     166static int symtable_enter_block(struct symtable *st, identifier name,
     167                                _Py_block_ty block, void *ast, int lineno);
    167168static int symtable_exit_block(struct symtable *st, void *ast);
    168169static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
    169170static int symtable_visit_expr(struct symtable *st, expr_ty s);
    170171static int symtable_visit_genexp(struct symtable *st, expr_ty s);
     172static int symtable_visit_setcomp(struct symtable *st, expr_ty e);
     173static int symtable_visit_dictcomp(struct symtable *st, expr_ty e);
    171174static int symtable_visit_arguments(struct symtable *st, arguments_ty);
    172175static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
     
    180183
    181184
    182 static identifier top = NULL, lambda = NULL, genexpr = NULL;
     185static identifier top = NULL, lambda = NULL, genexpr = NULL, setcomp = NULL,
     186    dictcomp = NULL;
    183187
    184188#define GET_IDENTIFIER(VAR) \
    185         ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
     189    ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
    186190
    187191#define DUPLICATE_ARGUMENT \
     
    191195symtable_new(void)
    192196{
    193         struct symtable *st;
    194 
    195         st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
    196         if (st == NULL)
    197                 return NULL;
    198 
    199         st->st_filename = NULL;
    200         st->st_symbols = NULL;
    201 
    202         if ((st->st_stack = PyList_New(0)) == NULL)
    203                 goto fail;
    204         if ((st->st_symbols = PyDict_New()) == NULL)
    205                 goto fail;
    206         st->st_cur = NULL;
    207         st->st_tmpname = 0;
    208         st->st_private = NULL;
    209         return st;
     197    struct symtable *st;
     198
     199    st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
     200    if (st == NULL)
     201        return NULL;
     202
     203    st->st_filename = NULL;
     204    st->st_symbols = NULL;
     205
     206    if ((st->st_stack = PyList_New(0)) == NULL)
     207        goto fail;
     208    if ((st->st_symbols = PyDict_New()) == NULL)
     209        goto fail;
     210    st->st_cur = NULL;
     211    st->st_private = NULL;
     212    return st;
    210213 fail:
    211         PySymtable_Free(st);
    212         return NULL;
     214    PySymtable_Free(st);
     215    return NULL;
    213216}
    214217
     
    216219PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
    217220{
    218         struct symtable *st = symtable_new();
    219         asdl_seq *seq;
    220         int i;
    221 
    222         if (st == NULL)
    223                 return st;
    224         st->st_filename = filename;
    225         st->st_future = future;
    226         if (!GET_IDENTIFIER(top) ||
    227             !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
    228                 PySymtable_Free(st);
    229                 return NULL;
    230         }
    231 
    232         st->st_top = st->st_cur;
    233         st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
    234         /* Any other top-level initialization? */
    235         switch (mod->kind) {
    236         case Module_kind:
    237                 seq = mod->v.Module.body;
    238                 for (i = 0; i < asdl_seq_LEN(seq); i++)
    239                         if (!symtable_visit_stmt(st,
    240                                     (stmt_ty)asdl_seq_GET(seq, i)))
    241                                 goto error;
    242                 break;
    243         case Expression_kind:
    244                 if (!symtable_visit_expr(st, mod->v.Expression.body))
    245                         goto error;
    246                 break;
    247         case Interactive_kind:
    248                 seq = mod->v.Interactive.body;
    249                 for (i = 0; i < asdl_seq_LEN(seq); i++)
    250                         if (!symtable_visit_stmt(st,
    251                                     (stmt_ty)asdl_seq_GET(seq, i)))
    252                                 goto error;
    253                 break;
    254         case Suite_kind:
    255                 PyErr_SetString(PyExc_RuntimeError,
    256                                 "this compiler does not handle Suites");
    257                 goto error;
    258         }
    259         if (!symtable_exit_block(st, (void *)mod)) {
    260                 PySymtable_Free(st);
    261                 return NULL;
    262         }
    263         if (symtable_analyze(st))
    264                 return st;
    265         PySymtable_Free(st);
    266         return NULL;
     221    struct symtable *st = symtable_new();
     222    asdl_seq *seq;
     223    int i;
     224
     225    if (st == NULL)
     226        return st;
     227    st->st_filename = filename;
     228    st->st_future = future;
     229    if (!GET_IDENTIFIER(top) ||
     230        !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
     231        PySymtable_Free(st);
     232        return NULL;
     233    }
     234
     235    st->st_top = st->st_cur;
     236    st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
     237    /* Any other top-level initialization? */
     238    switch (mod->kind) {
     239    case Module_kind:
     240        seq = mod->v.Module.body;
     241        for (i = 0; i < asdl_seq_LEN(seq); i++)
     242            if (!symtable_visit_stmt(st,
     243                        (stmt_ty)asdl_seq_GET(seq, i)))
     244                goto error;
     245        break;
     246    case Expression_kind:
     247        if (!symtable_visit_expr(st, mod->v.Expression.body))
     248            goto error;
     249        break;
     250    case Interactive_kind:
     251        seq = mod->v.Interactive.body;
     252        for (i = 0; i < asdl_seq_LEN(seq); i++)
     253            if (!symtable_visit_stmt(st,
     254                        (stmt_ty)asdl_seq_GET(seq, i)))
     255                goto error;
     256        break;
     257    case Suite_kind:
     258        PyErr_SetString(PyExc_RuntimeError,
     259                        "this compiler does not handle Suites");
     260        goto error;
     261    }
     262    if (!symtable_exit_block(st, (void *)mod)) {
     263        PySymtable_Free(st);
     264        return NULL;
     265    }
     266    if (symtable_analyze(st))
     267        return st;
     268    PySymtable_Free(st);
     269    return NULL;
    267270 error:
    268         (void) symtable_exit_block(st, (void *)mod);
    269         PySymtable_Free(st);
    270         return NULL;
     271    (void) symtable_exit_block(st, (void *)mod);
     272    PySymtable_Free(st);
     273    return NULL;
    271274}
    272275
     
    274277PySymtable_Free(struct symtable *st)
    275278{
    276         Py_XDECREF(st->st_symbols);
    277         Py_XDECREF(st->st_stack);
    278         PyMem_Free((void *)st);
     279    Py_XDECREF(st->st_symbols);
     280    Py_XDECREF(st->st_stack);
     281    PyMem_Free((void *)st);
    279282}
    280283
     
    282285PySymtable_Lookup(struct symtable *st, void *key)
    283286{
    284         PyObject *k, *v;
    285 
    286         k = PyLong_FromVoidPtr(key);
    287         if (k == NULL)
    288                 return NULL;
    289         v = PyDict_GetItem(st->st_symbols, k);
    290         if (v) {
    291                 assert(PySTEntry_Check(v));
    292                 Py_INCREF(v);
    293         }
    294         else {
    295                 PyErr_SetString(PyExc_KeyError,
    296                                 "unknown symbol table entry");
    297         }
    298 
    299         Py_DECREF(k);
    300         return (PySTEntryObject *)v;
    301 }
    302 
    303 int 
     287    PyObject *k, *v;
     288
     289    k = PyLong_FromVoidPtr(key);
     290    if (k == NULL)
     291        return NULL;
     292    v = PyDict_GetItem(st->st_symbols, k);
     293    if (v) {
     294        assert(PySTEntry_Check(v));
     295        Py_INCREF(v);
     296    }
     297    else {
     298        PyErr_SetString(PyExc_KeyError,
     299                        "unknown symbol table entry");
     300    }
     301
     302    Py_DECREF(k);
     303    return (PySTEntryObject *)v;
     304}
     305
     306int
    304307PyST_GetScope(PySTEntryObject *ste, PyObject *name)
    305308{
    306         PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
    307         if (!v)
    308                 return 0;
    309         assert(PyInt_Check(v));
    310         return (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
     309    PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
     310    if (!v)
     311        return 0;
     312    assert(PyInt_Check(v));
     313    return (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
    311314}
    312315
     
    315318
    316319   The next several functions are helpers for PySymtable_Analyze(),
    317    which determines whether a name is local, global, or free.  In addition, 
     320   which determines whether a name is local, global, or free.  In addition,
    318321   it determines which local variables are cell variables; they provide
    319    bindings that are used for free variables in enclosed blocks. 
    320 
    321    There are also two kinds of free variables, implicit and explicit.  An 
     322   bindings that are used for free variables in enclosed blocks.
     323
     324   There are also two kinds of free variables, implicit and explicit.  An
    322325   explicit global is declared with the global statement.  An implicit
    323326   global is a free variable for which the compiler has found no binding
     
    329332
    330333   The symbol table requires two passes to determine the scope of each name.
    331    The first pass collects raw facts from the AST: the name is a parameter 
     334   The first pass collects raw facts from the AST: the name is a parameter
    332335   here, the name is used by not defined here, etc.  The second pass analyzes
    333336   these facts during a pass over the PySTEntryObjects created during pass 1.
    334337
    335338   When a function is entered during the second pass, the parent passes
    336    the set of all name bindings visible to its children.  These bindings 
     339   the set of all name bindings visible to its children.  These bindings
    337340   are used to determine if the variable is free or an implicit global.
    338341   After doing the local analysis, it analyzes each of its child blocks
    339    using an updated set of name bindings. 
    340 
    341    The children update the free variable set.  If a local variable is free 
    342    in a child, the variable is marked as a cell.  The current function must 
    343    provide runtime storage for the variable that may outlive the function's 
     342   using an updated set of name bindings.
     343
     344   The children update the free variable set.  If a local variable is free
     345   in a child, the variable is marked as a cell.  The current function must
     346   provide runtime storage for the variable that may outlive the function's
    344347   frame.  Cell variables are removed from the free set before the analyze
    345348   function returns to its parent.
    346    
     349
    347350   The sets of bound and free variables are implemented as dictionaries
    348351   mapping strings to None.
     
    350353
    351354#define SET_SCOPE(DICT, NAME, I) { \
    352         PyObject *o = PyInt_FromLong(I); \
    353         if (!o) \
    354                 return 0; \
    355         if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
    356                 Py_DECREF(o); \
    357                 return 0; \
    358         } \
    359         Py_DECREF(o); \
     355    PyObject *o = PyInt_FromLong(I); \
     356    if (!o) \
     357        return 0; \
     358    if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
     359        Py_DECREF(o); \
     360        return 0; \
     361    } \
     362    Py_DECREF(o); \
    360363}
    361364
     
    367370*/
    368371
    369 static int 
     372static int
    370373analyze_name(PySTEntryObject *ste, PyObject *dict, PyObject *name, long flags,
    371              PyObject *bound, PyObject *local, PyObject *free,
    372              PyObject *global)
    373 {
    374         if (flags & DEF_GLOBAL) {
    375                 if (flags & DEF_PARAM) {
    376                         PyErr_Format(PyExc_SyntaxError,
    377                                      "name '%s' is local and global",
    378                                      PyString_AS_STRING(name));
    379                         PyErr_SyntaxLocation(ste->ste_table->st_filename,
    380                                              ste->ste_lineno);
    381                        
    382                         return 0;
    383                 }
    384                 SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
    385                 if (PyDict_SetItem(global, name, Py_None) < 0)
    386                         return 0;
    387                 if (bound && PyDict_GetItem(bound, name)) {
    388                         if (PyDict_DelItem(bound, name) < 0)
    389                                 return 0;
    390                 }
    391                 return 1;
    392         }
    393         if (flags & DEF_BOUND) {
    394                 SET_SCOPE(dict, name, LOCAL);
    395                 if (PyDict_SetItem(local, name, Py_None) < 0)
    396                         return 0;
    397                 if (PyDict_GetItem(global, name)) {
    398                         if (PyDict_DelItem(global, name) < 0)
    399                                 return 0;
    400                 }
    401                 return 1;
    402         }
    403         /* If an enclosing block has a binding for this name, it
    404            is a free variable rather than a global variable.
    405            Note that having a non-NULL bound implies that the block
    406            is nested.
    407         */
    408         if (bound && PyDict_GetItem(bound, name)) {
    409                 SET_SCOPE(dict, name, FREE);
    410                 ste->ste_free = 1;
    411                 if (PyDict_SetItem(free, name, Py_None) < 0)
    412                         return 0;
    413                 return 1;
    414         }
    415         /* If a parent has a global statement, then call it global
    416            explicit?  It could also be global implicit.
    417         */
    418         else if (global && PyDict_GetItem(global, name)) {
    419                 SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
    420                 return 1;
    421         }
    422         else {
    423                 if (ste->ste_nested)
    424                         ste->ste_free = 1;
    425                 SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
    426                 return 1;
    427         }
    428         /* Should never get here. */
    429         PyErr_Format(PyExc_SystemError, "failed to set scope for %s",
    430                      PyString_AS_STRING(name));
    431         return 0;
     374             PyObject *bound, PyObject *local, PyObject *free,
     375             PyObject *global)
     376{
     377    if (flags & DEF_GLOBAL) {
     378        if (flags & DEF_PARAM) {
     379            PyErr_Format(PyExc_SyntaxError,
     380                         "name '%s' is local and global",
     381                         PyString_AS_STRING(name));
     382            PyErr_SyntaxLocation(ste->ste_table->st_filename,
     383                                 ste->ste_lineno);
     384
     385            return 0;
     386        }
     387        SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
     388        if (PyDict_SetItem(global, name, Py_None) < 0)
     389            return 0;
     390        if (bound && PyDict_GetItem(bound, name)) {
     391            if (PyDict_DelItem(bound, name) < 0)
     392                return 0;
     393        }
     394        return 1;
     395    }
     396    if (flags & DEF_BOUND) {
     397        SET_SCOPE(dict, name, LOCAL);
     398        if (PyDict_SetItem(local, name, Py_None) < 0)
     399            return 0;
     400        if (PyDict_GetItem(global, name)) {
     401            if (PyDict_DelItem(global, name) < 0)
     402                return 0;
     403        }
     404        return 1;
     405    }
     406    /* If an enclosing block has a binding for this name, it
     407       is a free variable rather than a global variable.
     408       Note that having a non-NULL bound implies that the block
     409       is nested.
     410    */
     411    if (bound && PyDict_GetItem(bound, name)) {
     412        SET_SCOPE(dict, name, FREE);
     413        ste->ste_free = 1;
     414        if (PyDict_SetItem(free, name, Py_None) < 0)
     415            return 0;
     416        return 1;
     417    }
     418    /* If a parent has a global statement, then call it global
     419       explicit?  It could also be global implicit.
     420    */
     421    else if (global && PyDict_GetItem(global, name)) {
     422        SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
     423        return 1;
     424    }
     425    else {
     426        if (ste->ste_nested)
     427            ste->ste_free = 1;
     428        SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
     429        return 1;
     430    }
     431    /* Should never get here. */
     432    PyErr_Format(PyExc_SystemError, "failed to set scope for %s",
     433                 PyString_AS_STRING(name));
     434    return 0;
    432435}
    433436
     
    445448analyze_cells(PyObject *scope, PyObject *free)
    446449{
    447         PyObject *name, *v, *w;
    448         int success = 0;
    449         Py_ssize_t pos = 0;
    450 
    451         w = PyInt_FromLong(CELL);
    452         if (!w)
    453                 return 0;
    454         while (PyDict_Next(scope, &pos, &name, &v)) {
    455                 long flags;
    456                 assert(PyInt_Check(v));
    457                 flags = PyInt_AS_LONG(v);
    458                 if (flags != LOCAL)
    459                         continue;
    460                 if (!PyDict_GetItem(free, name))
    461                         continue;
    462                 /* Replace LOCAL with CELL for this name, and remove
    463                    from free. It is safe to replace the value of name
    464                    in the dict, because it will not cause a resize.
    465                 */
    466                 if (PyDict_SetItem(scope, name, w) < 0)
    467                         goto error;
    468                 if (!PyDict_DelItem(free, name) < 0)
    469                         goto error;
    470         }
    471         success = 1;
     450    PyObject *name, *v, *w;
     451    int success = 0;
     452    Py_ssize_t pos = 0;
     453
     454    w = PyInt_FromLong(CELL);
     455    if (!w)
     456        return 0;
     457    while (PyDict_Next(scope, &pos, &name, &v)) {
     458        long flags;
     459        assert(PyInt_Check(v));
     460        flags = PyInt_AS_LONG(v);
     461        if (flags != LOCAL)
     462            continue;
     463        if (!PyDict_GetItem(free, name))
     464            continue;
     465        /* Replace LOCAL with CELL for this name, and remove
     466           from free. It is safe to replace the value of name
     467           in the dict, because it will not cause a resize.
     468        */
     469        if (PyDict_SetItem(scope, name, w) < 0)
     470            goto error;
     471        if (!PyDict_DelItem(free, name) < 0)
     472            goto error;
     473    }
     474    success = 1;
    472475 error:
    473         Py_DECREF(w);
    474         return success;
     476    Py_DECREF(w);
     477    return success;
    475478}
    476479
     
    478481static int
    479482check_unoptimized(const PySTEntryObject* ste) {
    480         char buf[300];
    481         const char* trailer;
    482 
    483         if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
    484             || !(ste->ste_free || ste->ste_child_free))
    485                 return 1;
    486 
    487         trailer = (ste->ste_child_free ?
    488                        "contains a nested function with free variables" :
    489                                "is a nested function");
    490 
    491         switch (ste->ste_unoptimized) {
    492         case OPT_TOPLEVEL: /* exec / import * at top-level is fine */
    493         case OPT_EXEC: /* qualified exec is fine */
    494                 return 1;
    495         case OPT_IMPORT_STAR:
    496                 PyOS_snprintf(buf, sizeof(buf),
    497                               "import * is not allowed in function '%.100s' "
    498                               "because it is %s",
    499                               PyString_AS_STRING(ste->ste_name), trailer);
    500                 break;
    501         case OPT_BARE_EXEC:
    502                 PyOS_snprintf(buf, sizeof(buf),
    503                               "unqualified exec is not allowed in function "
    504                               "'%.100s' it %s",
    505                               PyString_AS_STRING(ste->ste_name), trailer);
    506                 break;
    507         default:
    508                 PyOS_snprintf(buf, sizeof(buf),
    509                               "function '%.100s' uses import * and bare exec, "
    510                               "which are illegal because it %s",
    511                               PyString_AS_STRING(ste->ste_name), trailer);
    512                 break;
    513         }
    514 
    515         PyErr_SetString(PyExc_SyntaxError, buf);
    516         PyErr_SyntaxLocation(ste->ste_table->st_filename,
    517                              ste->ste_opt_lineno);
    518         return 0;
    519 }
    520 
    521 /* Enter the final scope information into the st_symbols dict. 
    522  * 
     483    char buf[300];
     484    const char* trailer;
     485
     486    if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
     487        || !(ste->ste_free || ste->ste_child_free))
     488        return 1;
     489
     490    trailer = (ste->ste_child_free ?
     491                   "contains a nested function with free variables" :
     492                   "is a nested function");
     493
     494    switch (ste->ste_unoptimized) {
     495    case OPT_TOPLEVEL: /* exec / import * at top-level is fine */
     496    case OPT_EXEC: /* qualified exec is fine */
     497        return 1;
     498    case OPT_IMPORT_STAR:
     499        PyOS_snprintf(buf, sizeof(buf),
     500                      "import * is not allowed in function '%.100s' "
     501                      "because it %s",
     502                      PyString_AS_STRING(ste->ste_name), trailer);
     503        break;
     504    case OPT_BARE_EXEC:
     505        PyOS_snprintf(buf, sizeof(buf),
     506                      "unqualified exec is not allowed in function "
     507                      "'%.100s' it %s",
     508                      PyString_AS_STRING(ste->ste_name), trailer);
     509        break;
     510    default:
     511        PyOS_snprintf(buf, sizeof(buf),
     512                      "function '%.100s' uses import * and bare exec, "
     513                      "which are illegal because it %s",
     514                      PyString_AS_STRING(ste->ste_name), trailer);
     515        break;
     516    }
     517
     518    PyErr_SetString(PyExc_SyntaxError, buf);
     519    PyErr_SyntaxLocation(ste->ste_table->st_filename,
     520                         ste->ste_opt_lineno);
     521    return 0;
     522}
     523
     524/* Enter the final scope information into the st_symbols dict.
     525 *
    523526 * All arguments are dicts.  Modifies symbols, others are read-only.
    524527*/
    525528static int
    526 update_symbols(PyObject *symbols, PyObject *scope, 
     529update_symbols(PyObject *symbols, PyObject *scope,
    527530               PyObject *bound, PyObject *free, int classflag)
    528531{
    529         PyObject *name, *v, *u, *w, *free_value = NULL;
    530         Py_ssize_t pos = 0;
    531 
    532         while (PyDict_Next(symbols, &pos, &name, &v)) {
    533                 long i, flags;
    534                 assert(PyInt_Check(v));
    535                 flags = PyInt_AS_LONG(v);
    536                 w = PyDict_GetItem(scope, name);
    537                 assert(w && PyInt_Check(w));
    538                 i = PyInt_AS_LONG(w);
    539                 flags |= (i << SCOPE_OFF);
    540                 u = PyInt_FromLong(flags);
    541                 if (!u)
    542                         return 0;
    543                 if (PyDict_SetItem(symbols, name, u) < 0) {
    544                         Py_DECREF(u);
    545                         return 0;
    546                 }
    547                 Py_DECREF(u);
    548         }
    549 
    550         free_value = PyInt_FromLong(FREE << SCOPE_OFF);
    551         if (!free_value)
    552                 return 0;
    553 
    554         /* add a free variable when it's only use is for creating a closure */
    555         pos = 0;
    556         while (PyDict_Next(free, &pos, &name, &v)) {
    557                 PyObject *o = PyDict_GetItem(symbols, name);
    558 
    559                 if (o) {
    560                         /* It could be a free variable in a method of
    561                            the class that has the same name as a local
    562                            or global in the class scope.
    563                         */
    564                         if  (classflag &&
    565                              PyInt_AS_LONG(o) & (DEF_BOUND | DEF_GLOBAL)) {
    566                                 long i = PyInt_AS_LONG(o) | DEF_FREE_CLASS;
    567                                 o = PyInt_FromLong(i);
    568                                 if (!o) {
    569                                         Py_DECREF(free_value);
    570                                         return 0;
    571                                 }
    572                                 if (PyDict_SetItem(symbols, name, o) < 0) {
    573                                         Py_DECREF(o);
    574                                         Py_DECREF(free_value);
    575                                         return 0;
    576                                 }
    577                                 Py_DECREF(o);
    578                         }
    579                         /* else it's not free, probably a cell */
    580                         continue;
    581                 }
    582                 if (!PyDict_GetItem(bound, name))
    583                         continue;       /* it's a global */
    584 
    585                 if (PyDict_SetItem(symbols, name, free_value) < 0) {
    586                         Py_DECREF(free_value);
    587                         return 0;
    588                 }
    589         }
    590         Py_DECREF(free_value);
    591         return 1;
    592 }   
     532    PyObject *name, *v, *u, *w, *free_value = NULL;
     533    Py_ssize_t pos = 0;
     534
     535    while (PyDict_Next(symbols, &pos, &name, &v)) {
     536        long i, flags;
     537        assert(PyInt_Check(v));
     538        flags = PyInt_AS_LONG(v);
     539        w = PyDict_GetItem(scope, name);
     540        assert(w && PyInt_Check(w));
     541        i = PyInt_AS_LONG(w);
     542        flags |= (i << SCOPE_OFF);
     543        u = PyInt_FromLong(flags);
     544        if (!u)
     545            return 0;
     546        if (PyDict_SetItem(symbols, name, u) < 0) {
     547            Py_DECREF(u);
     548            return 0;
     549        }
     550        Py_DECREF(u);
     551    }
     552
     553    free_value = PyInt_FromLong(FREE << SCOPE_OFF);
     554    if (!free_value)
     555        return 0;
     556
     557    /* add a free variable when it's only use is for creating a closure */
     558    pos = 0;
     559    while (PyDict_Next(free, &pos, &name, &v)) {
     560        PyObject *o = PyDict_GetItem(symbols, name);
     561
     562        if (o) {
     563            /* It could be a free variable in a method of
     564               the class that has the same name as a local
     565               or global in the class scope.
     566            */
     567            if  (classflag &&
     568                 PyInt_AS_LONG(o) & (DEF_BOUND | DEF_GLOBAL)) {
     569                long i = PyInt_AS_LONG(o) | DEF_FREE_CLASS;
     570                o = PyInt_FromLong(i);
     571                if (!o) {
     572                    Py_DECREF(free_value);
     573                    return 0;
     574                }
     575                if (PyDict_SetItem(symbols, name, o) < 0) {
     576                    Py_DECREF(o);
     577                    Py_DECREF(free_value);
     578                    return 0;
     579                }
     580                Py_DECREF(o);
     581            }
     582            /* else it's not free, probably a cell */
     583            continue;
     584        }
     585        if (!PyDict_GetItem(bound, name))
     586            continue;       /* it's a global */
     587
     588        if (PyDict_SetItem(symbols, name, free_value) < 0) {
     589            Py_DECREF(free_value);
     590            return 0;
     591        }
     592    }
     593    Py_DECREF(free_value);
     594    return 1;
     595}
    593596
    594597/* Make final symbol table decisions for block of ste.
     
    613616
    614617static int
    615 analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
    616                     PyObject *global, PyObject* child_free);
    617 
    618 static int
    619 analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
    620               PyObject *global)
    621 {
    622         PyObject *name, *v, *local = NULL, *scope = NULL;
    623         PyObject *newbound = NULL, *newglobal = NULL;
    624         PyObject *newfree = NULL, *allfree = NULL;
    625         int i, success = 0;
    626         Py_ssize_t pos = 0;
    627 
    628         local = PyDict_New();  /* collect new names bound in block */
    629         if (!local)
    630                 goto error;
    631         scope = PyDict_New(); /* collect scopes defined for each name */
    632         if (!scope)
    633                 goto error;
    634 
    635         /* Allocate new global and bound variable dictionaries.  These
    636            dictionaries hold the names visible in nested blocks.  For
    637            ClassBlocks, the bound and global names are initialized
    638            before analyzing names, because class bindings aren't
    639            visible in methods.  For other blocks, they are initialized
    640            after names are analyzed.
    641          */
    642 
    643         /* TODO(jhylton): Package these dicts in a struct so that we
    644            can write reasonable helper functions?
    645         */
    646         newglobal = PyDict_New();
    647         if (!newglobal)
    648                 goto error;
    649         newbound = PyDict_New();
    650         if (!newbound)
    651                 goto error;
    652         newfree = PyDict_New();
    653         if (!newfree)
    654                 goto error;
    655 
    656         if (ste->ste_type == ClassBlock) {
    657                 if (PyDict_Update(newglobal, global) < 0)
    658                         goto error;
    659                 if (bound)
    660                         if (PyDict_Update(newbound, bound) < 0)
    661                                 goto error;
    662         }
    663 
    664         while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
    665                 long flags = PyInt_AS_LONG(v);
    666                 if (!analyze_name(ste, scope, name, flags,
    667                                   bound, local, free, global))
    668                         goto error;
    669         }
    670 
    671         if (ste->ste_type != ClassBlock) {
    672                 if (ste->ste_type == FunctionBlock) {
    673                         if (PyDict_Update(newbound, local) < 0)
    674                                 goto error;
    675                 }
    676                 if (bound) {
    677                         if (PyDict_Update(newbound, bound) < 0)
    678                                 goto error;
    679                 }
    680                 if (PyDict_Update(newglobal, global) < 0)
    681                         goto error;
    682         }
    683 
    684         /* Recursively call analyze_block() on each child block.
    685 
    686            newbound, newglobal now contain the names visible in
    687            nested blocks.  The free variables in the children will
    688            be collected in allfree.
    689         */
    690         allfree = PyDict_New();
    691         if (!allfree)
    692                 goto error;
    693         for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
    694                 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
    695                 PySTEntryObject* entry;
    696                 assert(c && PySTEntry_Check(c));
    697                 entry = (PySTEntryObject*)c;
    698                 if (!analyze_child_block(entry, newbound, newfree, newglobal,
    699                                          allfree))
    700                         goto error;
    701                 if (entry->ste_free || entry->ste_child_free)
    702                         ste->ste_child_free = 1;
    703         }
    704 
    705         PyDict_Update(newfree, allfree);
    706         if (ste->ste_type == FunctionBlock && !analyze_cells(scope, newfree))
    707                 goto error;
    708         if (!update_symbols(ste->ste_symbols, scope, bound, newfree,
    709                             ste->ste_type == ClassBlock))
    710                 goto error;
    711         if (!check_unoptimized(ste))
    712                 goto error;
    713 
    714         if (PyDict_Update(free, newfree) < 0)
    715                 goto error;
    716         success = 1;
     618analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
     619                    PyObject *global, PyObject* child_free);
     620
     621static int
     622analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
     623              PyObject *global)
     624{
     625    PyObject *name, *v, *local = NULL, *scope = NULL;
     626    PyObject *newbound = NULL, *newglobal = NULL;
     627    PyObject *newfree = NULL, *allfree = NULL;
     628    int i, success = 0;
     629    Py_ssize_t pos = 0;
     630
     631    local = PyDict_New();  /* collect new names bound in block */
     632    if (!local)
     633        goto error;
     634    scope = PyDict_New(); /* collect scopes defined for each name */
     635    if (!scope)
     636        goto error;
     637
     638    /* Allocate new global and bound variable dictionaries.  These
     639       dictionaries hold the names visible in nested blocks.  For
     640       ClassBlocks, the bound and global names are initialized
     641       before analyzing names, because class bindings aren't
     642       visible in methods.  For other blocks, they are initialized
     643       after names are analyzed.
     644     */
     645
     646    /* TODO(jhylton): Package these dicts in a struct so that we
     647       can write reasonable helper functions?
     648    */
     649    newglobal = PyDict_New();
     650    if (!newglobal)
     651        goto error;
     652    newbound = PyDict_New();
     653    if (!newbound)
     654        goto error;
     655    newfree = PyDict_New();
     656    if (!newfree)
     657        goto error;
     658
     659    if (ste->ste_type == ClassBlock) {
     660        if (PyDict_Update(newglobal, global) < 0)
     661            goto error;
     662        if (bound)
     663            if (PyDict_Update(newbound, bound) < 0)
     664                goto error;
     665    }
     666
     667    while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
     668        long flags = PyInt_AS_LONG(v);
     669        if (!analyze_name(ste, scope, name, flags,
     670                          bound, local, free, global))
     671            goto error;
     672    }
     673
     674    if (ste->ste_type != ClassBlock) {
     675        if (ste->ste_type == FunctionBlock) {
     676            if (PyDict_Update(newbound, local) < 0)
     677                goto error;
     678        }
     679        if (bound) {
     680            if (PyDict_Update(newbound, bound) < 0)
     681                goto error;
     682        }
     683        if (PyDict_Update(newglobal, global) < 0)
     684            goto error;
     685    }
     686
     687    /* Recursively call analyze_block() on each child block.
     688
     689       newbound, newglobal now contain the names visible in
     690       nested blocks.  The free variables in the children will
     691       be collected in allfree.
     692    */
     693    allfree = PyDict_New();
     694    if (!allfree)
     695        goto error;
     696    for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
     697        PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
     698        PySTEntryObject* entry;
     699        assert(c && PySTEntry_Check(c));
     700        entry = (PySTEntryObject*)c;
     701        if (!analyze_child_block(entry, newbound, newfree, newglobal,
     702                                 allfree))
     703            goto error;
     704        if (entry->ste_free || entry->ste_child_free)
     705            ste->ste_child_free = 1;
     706    }
     707
     708    if (PyDict_Update(newfree, allfree) < 0)
     709        goto error;
     710    if (ste->ste_type == FunctionBlock && !analyze_cells(scope, newfree))
     711        goto error;
     712    if (!update_symbols(ste->ste_symbols, scope, bound, newfree,
     713                        ste->ste_type == ClassBlock))
     714        goto error;
     715    if (!check_unoptimized(ste))
     716        goto error;
     717
     718    if (PyDict_Update(free, newfree) < 0)
     719        goto error;
     720    success = 1;
    717721 error:
    718         Py_XDECREF(local);
    719         Py_XDECREF(scope);
    720         Py_XDECREF(newbound);
    721         Py_XDECREF(newglobal);
    722         Py_XDECREF(newfree);
    723         Py_XDECREF(allfree);
    724         if (!success)
    725                 assert(PyErr_Occurred());
    726         return success;
    727 }
    728 
    729 static int
    730 analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free, 
    731                     PyObject *global, PyObject* child_free)
    732 {
    733         PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
    734 
    735         /* Copy the bound and global dictionaries.
    736 
    737            These dictionary are used by all blocks enclosed by the
    738            current block.  The analyze_block() call modifies these
    739            dictionaries.
    740 
    741         */
    742         temp_bound = PyDict_New();
    743         if (!temp_bound)
    744                 goto error;
    745         if (PyDict_Update(temp_bound, bound) < 0)
    746                 goto error;
    747         temp_free = PyDict_New();
    748         if (!temp_free)
    749                 goto error;
    750         if (PyDict_Update(temp_free, free) < 0)
    751                 goto error;
    752         temp_global = PyDict_New();
    753         if (!temp_global)
    754                 goto error;
    755         if (PyDict_Update(temp_global, global) < 0)
    756                 goto error;
    757 
    758         if (!analyze_block(entry, temp_bound, temp_free, temp_global))
    759                 goto error;
    760         if (PyDict_Update(child_free, temp_free) < 0)
    761                 goto error;
    762         Py_DECREF(temp_bound);
    763         Py_DECREF(temp_free);
    764         Py_DECREF(temp_global);
    765         return 1;
     722    Py_XDECREF(local);
     723    Py_XDECREF(scope);
     724    Py_XDECREF(newbound);
     725    Py_XDECREF(newglobal);
     726    Py_XDECREF(newfree);
     727    Py_XDECREF(allfree);
     728    if (!success)
     729        assert(PyErr_Occurred());
     730    return success;
     731}
     732
     733static int
     734analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free,
     735                    PyObject *global, PyObject* child_free)
     736{
     737    PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL;
     738
     739    /* Copy the bound and global dictionaries.
     740
     741       These dictionary are used by all blocks enclosed by the
     742       current block.  The analyze_block() call modifies these
     743       dictionaries.
     744
     745    */
     746    temp_bound = PyDict_New();
     747    if (!temp_bound)
     748        goto error;
     749    if (PyDict_Update(temp_bound, bound) < 0)
     750        goto error;
     751    temp_free = PyDict_New();
     752    if (!temp_free)
     753        goto error;
     754    if (PyDict_Update(temp_free, free) < 0)
     755        goto error;
     756    temp_global = PyDict_New();
     757    if (!temp_global)
     758        goto error;
     759    if (PyDict_Update(temp_global, global) < 0)
     760        goto error;
     761
     762    if (!analyze_block(entry, temp_bound, temp_free, temp_global))
     763        goto error;
     764    if (PyDict_Update(child_free, temp_free) < 0)
     765        goto error;
     766    Py_DECREF(temp_bound);
     767    Py_DECREF(temp_free);
     768    Py_DECREF(temp_global);
     769    return 1;
    766770 error:
    767         Py_XDECREF(temp_bound);
    768         Py_XDECREF(temp_free);
    769         Py_XDECREF(temp_global);
    770         return 0;
     771    Py_XDECREF(temp_bound);
     772    Py_XDECREF(temp_free);
     773    Py_XDECREF(temp_global);
     774    return 0;
    771775}
    772776
     
    774778symtable_analyze(struct symtable *st)
    775779{
    776         PyObject *free, *global;
    777         int r;
    778 
    779         free = PyDict_New();
    780         if (!free)
    781             return 0;
    782         global = PyDict_New();
    783         if (!global) {
    784             Py_DECREF(free);
    785             return 0;
    786         }
    787         r = analyze_block(st->st_top, NULL, free, global);
    788         Py_DECREF(free);
    789         Py_DECREF(global);
    790         return r;
     780    PyObject *free, *global;
     781    int r;
     782
     783    free = PyDict_New();
     784    if (!free)
     785        return 0;
     786    global = PyDict_New();
     787    if (!global) {
     788        Py_DECREF(free);
     789        return 0;
     790    }
     791    r = analyze_block(st->st_top, NULL, free, global);
     792    Py_DECREF(free);
     793    Py_DECREF(global);
     794    return r;
    791795}
    792796
     
    795799symtable_warn(struct symtable *st, char *msg, int lineno)
    796800{
    797         if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
    798                                lineno, NULL, NULL) < 0) {
    799                 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
    800                         PyErr_SetString(PyExc_SyntaxError, msg);
    801                         PyErr_SyntaxLocation(st->st_filename,
    802                                              st->st_cur->ste_lineno);
    803                 }
    804                 return 0;
    805         }
    806         return 1;
     801    if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
     802                           lineno, NULL, NULL) < 0)     {
     803        if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
     804            PyErr_SetString(PyExc_SyntaxError, msg);
     805            PyErr_SyntaxLocation(st->st_filename,
     806                                 st->st_cur->ste_lineno);
     807        }
     808        return 0;
     809    }
     810    return 1;
    807811}
    808812
     
    815819symtable_exit_block(struct symtable *st, void *ast)
    816820{
    817         Py_ssize_t end;
    818 
    819         Py_CLEAR(st->st_cur);
    820         end = PyList_GET_SIZE(st->st_stack) - 1;
    821         if (end >= 0) {
    822                 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
    823                                                                 end);
    824                 if (st->st_cur == NULL)
    825                         return 0;
    826                 Py_INCREF(st->st_cur);
    827                 if (PySequence_DelItem(st->st_stack, end) < 0)
    828                         return 0;
    829         }
    830         return 1;
    831 }
    832 
    833 static int
    834 symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block, 
    835                      void *ast, int lineno)
    836 {
    837         PySTEntryObject *prev = NULL;
    838 
    839         if (st->st_cur) {
    840                 prev = st->st_cur;
    841                 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
    842                         return 0;
    843                 }
    844                 Py_DECREF(st->st_cur);
    845         }
    846         st->st_cur = ste_new(st, name, block, ast, lineno);
    847         if (st->st_cur == NULL)
    848                 return 0;
    849         if (name == GET_IDENTIFIER(top))
    850                 st->st_global = st->st_cur->ste_symbols;
    851         if (prev) {
    852                 if (PyList_Append(prev->ste_children,
    853                                   (PyObject *)st->st_cur) < 0) {
    854                         return 0;
    855                 }
    856         }
    857         return 1;
     821    Py_ssize_t end;
     822
     823    Py_CLEAR(st->st_cur);
     824    end = PyList_GET_SIZE(st->st_stack) - 1;
     825    if (end >= 0) {
     826        st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
     827                                                        end);
     828        if (st->st_cur == NULL)
     829            return 0;
     830        Py_INCREF(st->st_cur);
     831        if (PySequence_DelItem(st->st_stack, end) < 0)
     832            return 0;
     833    }
     834    return 1;
     835}
     836
     837static int
     838symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
     839                     void *ast, int lineno)
     840{
     841    PySTEntryObject *prev = NULL;
     842
     843    if (st->st_cur) {
     844        prev = st->st_cur;
     845        if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
     846            return 0;
     847        }
     848        Py_DECREF(st->st_cur);
     849    }
     850    st->st_cur = ste_new(st, name, block, ast, lineno);
     851    if (st->st_cur == NULL)
     852        return 0;
     853    if (block == ModuleBlock)
     854        st->st_global = st->st_cur->ste_symbols;
     855    if (prev) {
     856        if (PyList_Append(prev->ste_children,
     857                          (PyObject *)st->st_cur) < 0) {
     858            return 0;
     859        }
     860    }
     861    return 1;
    858862}
    859863
     
    861865symtable_lookup(struct symtable *st, PyObject *name)
    862866{
    863         PyObject *o;
    864         PyObject *mangled = _Py_Mangle(st->st_private, name);
    865         if (!mangled)
    866                 return 0;
    867         o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
    868         Py_DECREF(mangled);
    869         if (!o)
    870                 return 0;
    871         return PyInt_AsLong(o);
    872 }
    873 
    874 static int
    875 symtable_add_def(struct symtable *st, PyObject *name, int flag)
    876 {
    877         PyObject *o;
    878         PyObject *dict;
    879         long val;
    880         PyObject *mangled = _Py_Mangle(st->st_private, name);
    881 
    882         if (!mangled)
    883                 return 0;
    884         dict = st->st_cur->ste_symbols;
    885         if ((o = PyDict_GetItem(dict, mangled))) {
    886             val = PyInt_AS_LONG(o);
    887             if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
    888                     /* Is it better to use 'mangled' or 'name' here? */
    889                     PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
    890                                  PyString_AsString(name));
    891                     PyErr_SyntaxLocation(st->st_filename,
    892                                        st->st_cur->ste_lineno);
    893                     goto error;
    894             }
    895             val |= flag;
    896         } else
    897             val = flag;
    898         o = PyInt_FromLong(val);
     867    PyObject *o;
     868    PyObject *mangled = _Py_Mangle(st->st_private, name);
     869    if (!mangled)
     870        return 0;
     871    o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
     872    Py_DECREF(mangled);
     873    if (!o)
     874        return 0;
     875    return PyInt_AsLong(o);
     876}
     877
     878static int
     879symtable_add_def(struct symtable *st, PyObject *name, int flag)
     880{
     881    PyObject *o;
     882    PyObject *dict;
     883    long val;
     884    PyObject *mangled = _Py_Mangle(st->st_private, name);
     885
     886    if (!mangled)
     887        return 0;
     888    dict = st->st_cur->ste_symbols;
     889    if ((o = PyDict_GetItem(dict, mangled))) {
     890        val = PyInt_AS_LONG(o);
     891        if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
     892            /* Is it better to use 'mangled' or 'name' here? */
     893            PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
     894                         PyString_AsString(name));
     895            PyErr_SyntaxLocation(st->st_filename,
     896                               st->st_cur->ste_lineno);
     897            goto error;
     898        }
     899        val |= flag;
     900    } else
     901        val = flag;
     902    o = PyInt_FromLong(val);
     903    if (o == NULL)
     904        goto error;
     905    if (PyDict_SetItem(dict, mangled, o) < 0) {
     906        Py_DECREF(o);
     907        goto error;
     908    }
     909    Py_DECREF(o);
     910
     911    if (flag & DEF_PARAM) {
     912        if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
     913            goto error;
     914    } else      if (flag & DEF_GLOBAL) {
     915        /* XXX need to update DEF_GLOBAL for other flags too;
     916           perhaps only DEF_FREE_GLOBAL */
     917        val = flag;
     918        if ((o = PyDict_GetItem(st->st_global, mangled))) {
     919            val |= PyInt_AS_LONG(o);
     920        }
     921        o = PyInt_FromLong(val);
    899922        if (o == NULL)
    900             goto error;
    901         if (PyDict_SetItem(dict, mangled, o) < 0) {
    902                 Py_DECREF(o);
    903                 goto error;
    904         }
    905         Py_DECREF(o);
    906 
    907         if (flag & DEF_PARAM) {
    908                 if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
    909                         goto error;
    910         } else  if (flag & DEF_GLOBAL) {
    911                 /* XXX need to update DEF_GLOBAL for other flags too;
    912                    perhaps only DEF_FREE_GLOBAL */
    913                 val = flag;
    914                 if ((o = PyDict_GetItem(st->st_global, mangled))) {
    915                         val |= PyInt_AS_LONG(o);
    916                 }
    917                 o = PyInt_FromLong(val);
    918                 if (o == NULL)
    919                         goto error;
    920                 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
    921                         Py_DECREF(o);
    922                         goto error;
    923                 }
    924                 Py_DECREF(o);
    925         }
    926         Py_DECREF(mangled);
    927         return 1;
     923            goto error;
     924        if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
     925            Py_DECREF(o);
     926            goto error;
     927        }
     928        Py_DECREF(o);
     929    }
     930    Py_DECREF(mangled);
     931    return 1;
    928932
    929933error:
    930         Py_DECREF(mangled);
    931         return 0;
     934    Py_DECREF(mangled);
     935    return 0;
    932936}
    933937
    934938/* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
    935939   They use the ASDL name to synthesize the name of the C type and the visit
    936    function. 
    937    
     940   function.
     941
    938942   VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
    939943   useful if the first node in the sequence requires special treatment.
     
    941945
    942946#define VISIT(ST, TYPE, V) \
    943         if (!symtable_visit_ ## TYPE((ST), (V))) \
    944                 return 0;
     947    if (!symtable_visit_ ## TYPE((ST), (V))) \
     948        return 0;
    945949
    946950#define VISIT_IN_BLOCK(ST, TYPE, V, S) \
    947         if (!symtable_visit_ ## TYPE((ST), (V))) { \
    948                 symtable_exit_block((ST), (S)); \
    949                 return 0; \
    950         }
     951    if (!symtable_visit_ ## TYPE((ST), (V))) { \
     952        symtable_exit_block((ST), (S)); \
     953        return 0; \
     954    }
    951955
    952956#define VISIT_SEQ(ST, TYPE, SEQ) { \
    953         int i; \
    954         asdl_seq *seq = (SEQ); /* avoid variable capture */ \
    955         for (i = 0; i < asdl_seq_LEN(seq); i++) { \
    956                 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
    957                 if (!symtable_visit_ ## TYPE((ST), elt)) \
    958                         return 0; \
    959         } \
     957    int i; \
     958    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
     959    for (i = 0; i < asdl_seq_LEN(seq); i++) { \
     960        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
     961        if (!symtable_visit_ ## TYPE((ST), elt)) \
     962            return 0; \
     963    } \
    960964}
    961965
    962966#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
    963         int i; \
    964         asdl_seq *seq = (SEQ); /* avoid variable capture */ \
    965         for (i = 0; i < asdl_seq_LEN(seq); i++) { \
    966                 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
    967                 if (!symtable_visit_ ## TYPE((ST), elt)) { \
    968                         symtable_exit_block((ST), (S)); \
    969                         return 0; \
    970                 } \
    971         } \
     967    int i; \
     968    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
     969    for (i = 0; i < asdl_seq_LEN(seq); i++) { \
     970        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
     971        if (!symtable_visit_ ## TYPE((ST), elt)) { \
     972            symtable_exit_block((ST), (S)); \
     973            return 0; \
     974        } \
     975    } \
    972976}
    973977
    974978#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
    975         int i; \
    976         asdl_seq *seq = (SEQ); /* avoid variable capture */ \
    977         for (i = (START); i < asdl_seq_LEN(seq); i++) { \
    978                 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
    979                 if (!symtable_visit_ ## TYPE((ST), elt)) \
    980                         return 0; \
    981         } \
     979    int i; \
     980    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
     981    for (i = (START); i < asdl_seq_LEN(seq); i++) { \
     982        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
     983        if (!symtable_visit_ ## TYPE((ST), elt)) \
     984            return 0; \
     985    } \
    982986}
    983987
    984988#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
    985         int i; \
    986         asdl_seq *seq = (SEQ); /* avoid variable capture */ \
    987         for (i = (START); i < asdl_seq_LEN(seq); i++) { \
    988                 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
    989                 if (!symtable_visit_ ## TYPE((ST), elt)) { \
    990                         symtable_exit_block((ST), (S)); \
    991                         return 0; \
    992                 } \
    993         } \
     989    int i; \
     990    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
     991    for (i = (START); i < asdl_seq_LEN(seq); i++) { \
     992        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
     993        if (!symtable_visit_ ## TYPE((ST), elt)) { \
     994            symtable_exit_block((ST), (S)); \
     995            return 0; \
     996        } \
     997    } \
     998}
     999
     1000static int
     1001symtable_visit_stmt(struct symtable *st, stmt_ty s)
     1002{
     1003    switch (s->kind) {
     1004    case FunctionDef_kind:
     1005        if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
     1006            return 0;
     1007        if (s->v.FunctionDef.args->defaults)
     1008            VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
     1009        if (s->v.FunctionDef.decorator_list)
     1010            VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
     1011        if (!symtable_enter_block(st, s->v.FunctionDef.name,
     1012                                  FunctionBlock, (void *)s, s->lineno))
     1013            return 0;
     1014        VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
     1015        VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
     1016        if (!symtable_exit_block(st, s))
     1017            return 0;
     1018        break;
     1019    case ClassDef_kind: {
     1020        PyObject *tmp;
     1021        if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
     1022            return 0;
     1023        VISIT_SEQ(st, expr, s->v.ClassDef.bases);
     1024        if (s->v.ClassDef.decorator_list)
     1025            VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
     1026        if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
     1027                                  (void *)s, s->lineno))
     1028            return 0;
     1029        tmp = st->st_private;
     1030        st->st_private = s->v.ClassDef.name;
     1031        VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
     1032        st->st_private = tmp;
     1033        if (!symtable_exit_block(st, s))
     1034            return 0;
     1035        break;
     1036    }
     1037    case Return_kind:
     1038        if (s->v.Return.value) {
     1039            VISIT(st, expr, s->v.Return.value);
     1040            st->st_cur->ste_returns_value = 1;
     1041            if (st->st_cur->ste_generator) {
     1042                PyErr_SetString(PyExc_SyntaxError,
     1043                    RETURN_VAL_IN_GENERATOR);
     1044                PyErr_SyntaxLocation(st->st_filename,
     1045                             s->lineno);
     1046                return 0;
     1047            }
     1048        }
     1049        break;
     1050    case Delete_kind:
     1051        VISIT_SEQ(st, expr, s->v.Delete.targets);
     1052        break;
     1053    case Assign_kind:
     1054        VISIT_SEQ(st, expr, s->v.Assign.targets);
     1055        VISIT(st, expr, s->v.Assign.value);
     1056        break;
     1057    case AugAssign_kind:
     1058        VISIT(st, expr, s->v.AugAssign.target);
     1059        VISIT(st, expr, s->v.AugAssign.value);
     1060        break;
     1061    case Print_kind:
     1062        if (s->v.Print.dest)
     1063            VISIT(st, expr, s->v.Print.dest);
     1064        VISIT_SEQ(st, expr, s->v.Print.values);
     1065        break;
     1066    case For_kind:
     1067        VISIT(st, expr, s->v.For.target);
     1068        VISIT(st, expr, s->v.For.iter);
     1069        VISIT_SEQ(st, stmt, s->v.For.body);
     1070        if (s->v.For.orelse)
     1071            VISIT_SEQ(st, stmt, s->v.For.orelse);
     1072        break;
     1073    case While_kind:
     1074        VISIT(st, expr, s->v.While.test);
     1075        VISIT_SEQ(st, stmt, s->v.While.body);
     1076        if (s->v.While.orelse)
     1077            VISIT_SEQ(st, stmt, s->v.While.orelse);
     1078        break;
     1079    case If_kind:
     1080        /* XXX if 0: and lookup_yield() hacks */
     1081        VISIT(st, expr, s->v.If.test);
     1082        VISIT_SEQ(st, stmt, s->v.If.body);
     1083        if (s->v.If.orelse)
     1084            VISIT_SEQ(st, stmt, s->v.If.orelse);
     1085        break;
     1086    case Raise_kind:
     1087        if (s->v.Raise.type) {
     1088            VISIT(st, expr, s->v.Raise.type);
     1089            if (s->v.Raise.inst) {
     1090                VISIT(st, expr, s->v.Raise.inst);
     1091                if (s->v.Raise.tback)
     1092                    VISIT(st, expr, s->v.Raise.tback);
     1093            }
     1094        }
     1095        break;
     1096    case TryExcept_kind:
     1097        VISIT_SEQ(st, stmt, s->v.TryExcept.body);
     1098        VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
     1099        VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
     1100        break;
     1101    case TryFinally_kind:
     1102        VISIT_SEQ(st, stmt, s->v.TryFinally.body);
     1103        VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
     1104        break;
     1105    case Assert_kind:
     1106        VISIT(st, expr, s->v.Assert.test);
     1107        if (s->v.Assert.msg)
     1108            VISIT(st, expr, s->v.Assert.msg);
     1109        break;
     1110    case Import_kind:
     1111        VISIT_SEQ(st, alias, s->v.Import.names);
     1112        /* XXX Don't have the lineno available inside
     1113           visit_alias */
     1114        if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
     1115            st->st_cur->ste_opt_lineno = s->lineno;
     1116        break;
     1117    case ImportFrom_kind:
     1118        VISIT_SEQ(st, alias, s->v.ImportFrom.names);
     1119        /* XXX Don't have the lineno available inside
     1120           visit_alias */
     1121        if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
     1122            st->st_cur->ste_opt_lineno = s->lineno;
     1123        break;
     1124    case Exec_kind:
     1125        VISIT(st, expr, s->v.Exec.body);
     1126        if (!st->st_cur->ste_opt_lineno)
     1127            st->st_cur->ste_opt_lineno = s->lineno;
     1128        if (s->v.Exec.globals) {
     1129            st->st_cur->ste_unoptimized |= OPT_EXEC;
     1130            VISIT(st, expr, s->v.Exec.globals);
     1131            if (s->v.Exec.locals)
     1132                VISIT(st, expr, s->v.Exec.locals);
     1133        } else {
     1134            st->st_cur->ste_unoptimized |= OPT_BARE_EXEC;
     1135        }
     1136        break;
     1137    case Global_kind: {
     1138        int i;
     1139        asdl_seq *seq = s->v.Global.names;
     1140        for (i = 0; i < asdl_seq_LEN(seq); i++) {
     1141            identifier name = (identifier)asdl_seq_GET(seq, i);
     1142            char *c_name = PyString_AS_STRING(name);
     1143            long cur = symtable_lookup(st, name);
     1144            if (cur < 0)
     1145                return 0;
     1146            if (cur & (DEF_LOCAL | USE)) {
     1147                char buf[256];
     1148                if (cur & DEF_LOCAL)
     1149                    PyOS_snprintf(buf, sizeof(buf),
     1150                                  GLOBAL_AFTER_ASSIGN,
     1151                                  c_name);
     1152                else
     1153                    PyOS_snprintf(buf, sizeof(buf),
     1154                                  GLOBAL_AFTER_USE,
     1155                                  c_name);
     1156                if (!symtable_warn(st, buf, s->lineno))
     1157                    return 0;
     1158            }
     1159            if (!symtable_add_def(st, name, DEF_GLOBAL))
     1160                return 0;
     1161        }
     1162        break;
     1163    }
     1164    case Expr_kind:
     1165        VISIT(st, expr, s->v.Expr.value);
     1166        break;
     1167    case Pass_kind:
     1168    case Break_kind:
     1169    case Continue_kind:
     1170        /* nothing to do here */
     1171        break;
     1172    case With_kind:
     1173        VISIT(st, expr, s->v.With.context_expr);
     1174        if (s->v.With.optional_vars) {
     1175            VISIT(st, expr, s->v.With.optional_vars);
     1176        }
     1177        VISIT_SEQ(st, stmt, s->v.With.body);
     1178        break;
     1179    }
     1180    return 1;
     1181}
     1182
     1183static int
     1184symtable_visit_expr(struct symtable *st, expr_ty e)
     1185{
     1186    switch (e->kind) {
     1187    case BoolOp_kind:
     1188        VISIT_SEQ(st, expr, e->v.BoolOp.values);
     1189        break;
     1190    case BinOp_kind:
     1191        VISIT(st, expr, e->v.BinOp.left);
     1192        VISIT(st, expr, e->v.BinOp.right);
     1193        break;
     1194    case UnaryOp_kind:
     1195        VISIT(st, expr, e->v.UnaryOp.operand);
     1196        break;
     1197    case Lambda_kind: {
     1198        if (!GET_IDENTIFIER(lambda))
     1199            return 0;
     1200        if (e->v.Lambda.args->defaults)
     1201            VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
     1202        if (!symtable_enter_block(st, lambda,
     1203                                  FunctionBlock, (void *)e, e->lineno))
     1204            return 0;
     1205        VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
     1206        VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
     1207        if (!symtable_exit_block(st, (void *)e))
     1208            return 0;
     1209        break;
     1210    }
     1211    case IfExp_kind:
     1212        VISIT(st, expr, e->v.IfExp.test);
     1213        VISIT(st, expr, e->v.IfExp.body);
     1214        VISIT(st, expr, e->v.IfExp.orelse);
     1215        break;
     1216    case Dict_kind:
     1217        VISIT_SEQ(st, expr, e->v.Dict.keys);
     1218        VISIT_SEQ(st, expr, e->v.Dict.values);
     1219        break;
     1220    case Set_kind:
     1221        VISIT_SEQ(st, expr, e->v.Set.elts);
     1222        break;
     1223    case ListComp_kind:
     1224        VISIT(st, expr, e->v.ListComp.elt);
     1225        VISIT_SEQ(st, comprehension, e->v.ListComp.generators);
     1226        break;
     1227    case GeneratorExp_kind:
     1228        if (!symtable_visit_genexp(st, e))
     1229            return 0;
     1230        break;
     1231    case SetComp_kind:
     1232        if (!symtable_visit_setcomp(st, e))
     1233            return 0;
     1234        break;
     1235    case DictComp_kind:
     1236        if (!symtable_visit_dictcomp(st, e))
     1237            return 0;
     1238        break;
     1239    case Yield_kind:
     1240        if (e->v.Yield.value)
     1241            VISIT(st, expr, e->v.Yield.value);
     1242        st->st_cur->ste_generator = 1;
     1243        if (st->st_cur->ste_returns_value) {
     1244            PyErr_SetString(PyExc_SyntaxError,
     1245                RETURN_VAL_IN_GENERATOR);
     1246            PyErr_SyntaxLocation(st->st_filename,
     1247                         e->lineno);
     1248            return 0;
     1249        }
     1250        break;
     1251    case Compare_kind:
     1252        VISIT(st, expr, e->v.Compare.left);
     1253        VISIT_SEQ(st, expr, e->v.Compare.comparators);
     1254        break;
     1255    case Call_kind:
     1256        VISIT(st, expr, e->v.Call.func);
     1257        VISIT_SEQ(st, expr, e->v.Call.args);
     1258        VISIT_SEQ(st, keyword, e->v.Call.keywords);
     1259        if (e->v.Call.starargs)
     1260            VISIT(st, expr, e->v.Call.starargs);
     1261        if (e->v.Call.kwargs)
     1262            VISIT(st, expr, e->v.Call.kwargs);
     1263        break;
     1264    case Repr_kind:
     1265        VISIT(st, expr, e->v.Repr.value);
     1266        break;
     1267    case Num_kind:
     1268    case Str_kind:
     1269        /* Nothing to do here. */
     1270        break;
     1271    /* The following exprs can be assignment targets. */
     1272    case Attribute_kind:
     1273        VISIT(st, expr, e->v.Attribute.value);
     1274        break;
     1275    case Subscript_kind:
     1276        VISIT(st, expr, e->v.Subscript.value);
     1277        VISIT(st, slice, e->v.Subscript.slice);
     1278        break;
     1279    case Name_kind:
     1280        if (!symtable_add_def(st, e->v.Name.id,
     1281                              e->v.Name.ctx == Load ? USE : DEF_LOCAL))
     1282            return 0;
     1283        break;
     1284    /* child nodes of List and Tuple will have expr_context set */
     1285    case List_kind:
     1286        VISIT_SEQ(st, expr, e->v.List.elts);
     1287        break;
     1288    case Tuple_kind:
     1289        VISIT_SEQ(st, expr, e->v.Tuple.elts);
     1290        break;
     1291    }
     1292    return 1;
     1293}
     1294
     1295static int
     1296symtable_implicit_arg(struct symtable *st, int pos)
     1297{
     1298    PyObject *id = PyString_FromFormat(".%d", pos);
     1299    if (id == NULL)
     1300        return 0;
     1301    if (!symtable_add_def(st, id, DEF_PARAM)) {
     1302        Py_DECREF(id);
     1303        return 0;
     1304    }
     1305    Py_DECREF(id);
     1306    return 1;
     1307}
     1308
     1309static int
     1310symtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
     1311{
     1312    int i;
     1313
     1314    /* go through all the toplevel arguments first */
     1315    for (i = 0; i < asdl_seq_LEN(args); i++) {
     1316        expr_ty arg = (expr_ty)asdl_seq_GET(args, i);
     1317        if (arg->kind == Name_kind) {
     1318            assert(arg->v.Name.ctx == Param ||
     1319                   (arg->v.Name.ctx == Store && !toplevel));
     1320            if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
     1321                return 0;
     1322        }
     1323        else if (arg->kind == Tuple_kind) {
     1324            assert(arg->v.Tuple.ctx == Store);
     1325            if (toplevel) {
     1326                if (!symtable_implicit_arg(st, i))
     1327                    return 0;
     1328            }
     1329        }
     1330        else {
     1331            PyErr_SetString(PyExc_SyntaxError,
     1332                            "invalid expression in parameter list");
     1333            PyErr_SyntaxLocation(st->st_filename,
     1334                                 st->st_cur->ste_lineno);
     1335            return 0;
     1336        }
     1337    }
     1338
     1339    if (!toplevel) {
     1340        if (!symtable_visit_params_nested(st, args))
     1341            return 0;
     1342    }
     1343
     1344    return 1;
     1345}
     1346
     1347static int
     1348symtable_visit_params_nested(struct symtable *st, asdl_seq *args)
     1349{
     1350    int i;
     1351    for (i = 0; i < asdl_seq_LEN(args); i++) {
     1352        expr_ty arg = (expr_ty)asdl_seq_GET(args, i);
     1353        if (arg->kind == Tuple_kind &&
     1354            !symtable_visit_params(st, arg->v.Tuple.elts, 0))
     1355            return 0;
     1356    }
     1357
     1358    return 1;
     1359}
     1360
     1361static int
     1362symtable_visit_arguments(struct symtable *st, arguments_ty a)
     1363{
     1364    /* skip default arguments inside function block
     1365       XXX should ast be different?
     1366    */
     1367    if (a->args && !symtable_visit_params(st, a->args, 1))
     1368        return 0;
     1369    if (a->vararg) {
     1370        if (!symtable_add_def(st, a->vararg, DEF_PARAM))
     1371            return 0;
     1372        st->st_cur->ste_varargs = 1;
     1373    }
     1374    if (a->kwarg) {
     1375        if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
     1376            return 0;
     1377        st->st_cur->ste_varkeywords = 1;
     1378    }
     1379    if (a->args && !symtable_visit_params_nested(st, a->args))
     1380        return 0;
     1381    return 1;
     1382}
     1383
     1384
     1385static int
     1386symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
     1387{
     1388    if (eh->v.ExceptHandler.type)
     1389        VISIT(st, expr, eh->v.ExceptHandler.type);
     1390    if (eh->v.ExceptHandler.name)
     1391        VISIT(st, expr, eh->v.ExceptHandler.name);
     1392    VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
     1393    return 1;
     1394}
     1395
     1396
     1397static int
     1398symtable_visit_alias(struct symtable *st, alias_ty a)
     1399{
     1400    /* Compute store_name, the name actually bound by the import
     1401       operation.  It is different than a->name when a->name is a
     1402       dotted package name (e.g. spam.eggs)
     1403    */
     1404    PyObject *store_name;
     1405    PyObject *name = (a->asname == NULL) ? a->name : a->asname;
     1406    const char *base = PyString_AS_STRING(name);
     1407    char *dot = strchr(base, '.');
     1408    if (dot) {
     1409        store_name = PyString_FromStringAndSize(base, dot - base);
     1410        if (!store_name)
     1411            return 0;
     1412    }
     1413    else {
     1414        store_name = name;
     1415        Py_INCREF(store_name);
     1416    }
     1417    if (strcmp(PyString_AS_STRING(name), "*")) {
     1418        int r = symtable_add_def(st, store_name, DEF_IMPORT);
     1419        Py_DECREF(store_name);
     1420        return r;
     1421    }
     1422    else {
     1423        if (st->st_cur->ste_type != ModuleBlock) {
     1424        int lineno = st->st_cur->ste_lineno;
     1425        if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
     1426            Py_DECREF(store_name);
     1427            return 0;
     1428        }
     1429        }
     1430        st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
     1431        Py_DECREF(store_name);
     1432        return 1;
     1433    }
     1434}
     1435
     1436
     1437static int
     1438symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
     1439{
     1440    VISIT(st, expr, lc->target);
     1441    VISIT(st, expr, lc->iter);
     1442    VISIT_SEQ(st, expr, lc->ifs);
     1443    return 1;
     1444}
     1445
     1446
     1447static int
     1448symtable_visit_keyword(struct symtable *st, keyword_ty k)
     1449{
     1450    VISIT(st, expr, k->value);
     1451    return 1;
     1452}
     1453
     1454
     1455static int
     1456symtable_visit_slice(struct symtable *st, slice_ty s)
     1457{
     1458    switch (s->kind) {
     1459    case Slice_kind:
     1460        if (s->v.Slice.lower)
     1461            VISIT(st, expr, s->v.Slice.lower)
     1462        if (s->v.Slice.upper)
     1463            VISIT(st, expr, s->v.Slice.upper)
     1464        if (s->v.Slice.step)
     1465            VISIT(st, expr, s->v.Slice.step)
     1466        break;
     1467    case ExtSlice_kind:
     1468        VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
     1469        break;
     1470    case Index_kind:
     1471        VISIT(st, expr, s->v.Index.value)
     1472        break;
     1473    case Ellipsis_kind:
     1474        break;
     1475    }
     1476    return 1;
    9941477}
    9951478
     
    9971480symtable_new_tmpname(struct symtable *st)
    9981481{
    999         char tmpname[256];
    1000         identifier tmp;
    1001 
    1002         PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
    1003                       ++st->st_cur->ste_tmpname);
    1004         tmp = PyString_InternFromString(tmpname);
    1005         if (!tmp)
    1006                 return 0;
    1007         if (!symtable_add_def(st, tmp, DEF_LOCAL))
    1008                 return 0;
    1009         Py_DECREF(tmp);
    1010         return 1;
    1011 }
    1012 
    1013 static int
    1014 symtable_visit_stmt(struct symtable *st, stmt_ty s)
    1015 {
    1016         switch (s->kind) {
    1017         case FunctionDef_kind:
    1018                 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
    1019                         return 0;
    1020                 if (s->v.FunctionDef.args->defaults)
    1021                         VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
    1022                 if (s->v.FunctionDef.decorator_list)
    1023                         VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list);
    1024                 if (!symtable_enter_block(st, s->v.FunctionDef.name,
    1025                                           FunctionBlock, (void *)s, s->lineno))
    1026                         return 0;
    1027                 VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
    1028                 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
    1029                 if (!symtable_exit_block(st, s))
    1030                         return 0;
    1031                 break;
    1032         case ClassDef_kind: {
    1033                 PyObject *tmp;
    1034                 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
    1035                         return 0;
    1036                 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
    1037                 if (s->v.ClassDef.decorator_list)
    1038                         VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list);
    1039                 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
    1040                                           (void *)s, s->lineno))
    1041                         return 0;
    1042                 tmp = st->st_private;
    1043                 st->st_private = s->v.ClassDef.name;
    1044                 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
    1045                 st->st_private = tmp;
    1046                 if (!symtable_exit_block(st, s))
    1047                         return 0;
    1048                 break;
    1049         }
    1050         case Return_kind:
    1051                 if (s->v.Return.value) {
    1052                         VISIT(st, expr, s->v.Return.value);
    1053                         st->st_cur->ste_returns_value = 1;
    1054                         if (st->st_cur->ste_generator) {
    1055                                 PyErr_SetString(PyExc_SyntaxError,
    1056                                         RETURN_VAL_IN_GENERATOR);
    1057                                 PyErr_SyntaxLocation(st->st_filename,
    1058                                              s->lineno);
    1059                                 return 0;
    1060                         }
    1061                 }
    1062                 break;
    1063         case Delete_kind:
    1064                 VISIT_SEQ(st, expr, s->v.Delete.targets);
    1065                 break;
    1066         case Assign_kind:
    1067                 VISIT_SEQ(st, expr, s->v.Assign.targets);
    1068                 VISIT(st, expr, s->v.Assign.value);
    1069                 break;
    1070         case AugAssign_kind:
    1071                 VISIT(st, expr, s->v.AugAssign.target);
    1072                 VISIT(st, expr, s->v.AugAssign.value);
    1073                 break;
    1074         case Print_kind:
    1075                 if (s->v.Print.dest)
    1076                         VISIT(st, expr, s->v.Print.dest);
    1077                 VISIT_SEQ(st, expr, s->v.Print.values);
    1078                 break;
    1079         case For_kind:
    1080                 VISIT(st, expr, s->v.For.target);
    1081                 VISIT(st, expr, s->v.For.iter);
    1082                 VISIT_SEQ(st, stmt, s->v.For.body);
    1083                 if (s->v.For.orelse)
    1084                         VISIT_SEQ(st, stmt, s->v.For.orelse);
    1085                 break;
    1086         case While_kind:
    1087                 VISIT(st, expr, s->v.While.test);
    1088                 VISIT_SEQ(st, stmt, s->v.While.body);
    1089                 if (s->v.While.orelse)
    1090                         VISIT_SEQ(st, stmt, s->v.While.orelse);
    1091                 break;
    1092         case If_kind:
    1093                 /* XXX if 0: and lookup_yield() hacks */
    1094                 VISIT(st, expr, s->v.If.test);
    1095                 VISIT_SEQ(st, stmt, s->v.If.body);
    1096                 if (s->v.If.orelse)
    1097                         VISIT_SEQ(st, stmt, s->v.If.orelse);
    1098                 break;
    1099         case Raise_kind:
    1100                 if (s->v.Raise.type) {
    1101                         VISIT(st, expr, s->v.Raise.type);
    1102                         if (s->v.Raise.inst) {
    1103                                 VISIT(st, expr, s->v.Raise.inst);
    1104                                 if (s->v.Raise.tback)
    1105                                         VISIT(st, expr, s->v.Raise.tback);
    1106                         }
    1107                 }
    1108                 break;
    1109         case TryExcept_kind:
    1110                 VISIT_SEQ(st, stmt, s->v.TryExcept.body);
    1111                 VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
    1112                 VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
    1113                 break;
    1114         case TryFinally_kind:
    1115                 VISIT_SEQ(st, stmt, s->v.TryFinally.body);
    1116                 VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
    1117                 break;
    1118         case Assert_kind:
    1119                 VISIT(st, expr, s->v.Assert.test);
    1120                 if (s->v.Assert.msg)
    1121                         VISIT(st, expr, s->v.Assert.msg);
    1122                 break;
    1123         case Import_kind:
    1124                 VISIT_SEQ(st, alias, s->v.Import.names);
    1125                 /* XXX Don't have the lineno available inside
    1126                    visit_alias */
    1127                 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
    1128                         st->st_cur->ste_opt_lineno = s->lineno;
    1129                 break;
    1130         case ImportFrom_kind:
    1131                 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
    1132                 /* XXX Don't have the lineno available inside
    1133                    visit_alias */
    1134                 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
    1135                         st->st_cur->ste_opt_lineno = s->lineno;
    1136                 break;
    1137         case Exec_kind:
    1138                 VISIT(st, expr, s->v.Exec.body);
    1139                 if (!st->st_cur->ste_opt_lineno)
    1140                         st->st_cur->ste_opt_lineno = s->lineno;
    1141                 if (s->v.Exec.globals) {
    1142                         st->st_cur->ste_unoptimized |= OPT_EXEC;
    1143                         VISIT(st, expr, s->v.Exec.globals);
    1144                         if (s->v.Exec.locals)
    1145                                 VISIT(st, expr, s->v.Exec.locals);
    1146                 } else {
    1147                         st->st_cur->ste_unoptimized |= OPT_BARE_EXEC;
    1148                 }
    1149                 break;
    1150         case Global_kind: {
    1151                 int i;
    1152                 asdl_seq *seq = s->v.Global.names;
    1153                 for (i = 0; i < asdl_seq_LEN(seq); i++) {
    1154                         identifier name = (identifier)asdl_seq_GET(seq, i);
    1155                         char *c_name = PyString_AS_STRING(name);
    1156                         long cur = symtable_lookup(st, name);
    1157                         if (cur < 0)
    1158                                 return 0;
    1159                         if (cur & (DEF_LOCAL | USE)) {
    1160                                 char buf[256];
    1161                                 if (cur & DEF_LOCAL)
    1162                                         PyOS_snprintf(buf, sizeof(buf),
    1163                                                       GLOBAL_AFTER_ASSIGN,
    1164                                                       c_name);
    1165                                 else
    1166                                         PyOS_snprintf(buf, sizeof(buf),
    1167                                                       GLOBAL_AFTER_USE,
    1168                                                       c_name);
    1169                                 if (!symtable_warn(st, buf, s->lineno))
    1170                                     return 0;
    1171                         }
    1172                         if (!symtable_add_def(st, name, DEF_GLOBAL))
    1173                                 return 0;
    1174                 }
    1175                 break;
    1176         }
    1177         case Expr_kind:
    1178                 VISIT(st, expr, s->v.Expr.value);
    1179                 break;
    1180         case Pass_kind:
    1181         case Break_kind:
    1182         case Continue_kind:
    1183                 /* nothing to do here */
    1184                 break;
    1185         case With_kind:
    1186                 if (!symtable_new_tmpname(st))
    1187                         return 0;
    1188                 VISIT(st, expr, s->v.With.context_expr);
    1189                 if (s->v.With.optional_vars) {
    1190                         if (!symtable_new_tmpname(st))
    1191                                 return 0;
    1192                         VISIT(st, expr, s->v.With.optional_vars);
    1193                 }
    1194                 VISIT_SEQ(st, stmt, s->v.With.body);
    1195                 break;
    1196         }
    1197         return 1;
    1198 }
    1199 
    1200 static int
    1201 symtable_visit_expr(struct symtable *st, expr_ty e)
    1202 {
    1203         switch (e->kind) {
    1204         case BoolOp_kind:
    1205                 VISIT_SEQ(st, expr, e->v.BoolOp.values);
    1206                 break;
    1207         case BinOp_kind:
    1208                 VISIT(st, expr, e->v.BinOp.left);
    1209                 VISIT(st, expr, e->v.BinOp.right);
    1210                 break;
    1211         case UnaryOp_kind:
    1212                 VISIT(st, expr, e->v.UnaryOp.operand);
    1213                 break;
    1214         case Lambda_kind: {
    1215                 if (!GET_IDENTIFIER(lambda) ||
    1216                     !symtable_add_def(st, lambda, DEF_LOCAL))
    1217                         return 0;
    1218                 if (e->v.Lambda.args->defaults)
    1219                         VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
    1220                 if (!symtable_enter_block(st, lambda,
    1221                                           FunctionBlock, (void *)e, e->lineno))
    1222                         return 0;
    1223                 VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
    1224                 VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
    1225                 if (!symtable_exit_block(st, (void *)e))
    1226                         return 0;
    1227                 break;
    1228         }
    1229         case IfExp_kind:
    1230                 VISIT(st, expr, e->v.IfExp.test);
    1231                 VISIT(st, expr, e->v.IfExp.body);
    1232                 VISIT(st, expr, e->v.IfExp.orelse);
    1233                 break;
    1234         case Dict_kind:
    1235                 VISIT_SEQ(st, expr, e->v.Dict.keys);
    1236                 VISIT_SEQ(st, expr, e->v.Dict.values);
    1237                 break;
    1238         case ListComp_kind:
    1239                 if (!symtable_new_tmpname(st))
    1240                         return 0;
    1241                 VISIT(st, expr, e->v.ListComp.elt);
    1242                 VISIT_SEQ(st, comprehension, e->v.ListComp.generators);
    1243                 break;
    1244         case GeneratorExp_kind:
    1245                 if (!symtable_visit_genexp(st, e))
    1246                         return 0;
    1247                 break;
    1248         case Yield_kind:
    1249                 if (e->v.Yield.value)
    1250                         VISIT(st, expr, e->v.Yield.value);
    1251                 st->st_cur->ste_generator = 1;
    1252                 if (st->st_cur->ste_returns_value) {
    1253                         PyErr_SetString(PyExc_SyntaxError,
    1254                                 RETURN_VAL_IN_GENERATOR);
    1255                         PyErr_SyntaxLocation(st->st_filename,
    1256                                      e->lineno);
    1257                         return 0;
    1258                 }
    1259                 break;
    1260         case Compare_kind:
    1261                 VISIT(st, expr, e->v.Compare.left);
    1262                 VISIT_SEQ(st, expr, e->v.Compare.comparators);
    1263                 break;
    1264         case Call_kind:
    1265                 VISIT(st, expr, e->v.Call.func);
    1266                 VISIT_SEQ(st, expr, e->v.Call.args);
    1267                 VISIT_SEQ(st, keyword, e->v.Call.keywords);
    1268                 if (e->v.Call.starargs)
    1269                         VISIT(st, expr, e->v.Call.starargs);
    1270                 if (e->v.Call.kwargs)
    1271                         VISIT(st, expr, e->v.Call.kwargs);
    1272                 break;
    1273         case Repr_kind:
    1274                 VISIT(st, expr, e->v.Repr.value);
    1275                 break;
    1276         case Num_kind:
    1277         case Str_kind:
    1278                 /* Nothing to do here. */
    1279                 break;
    1280         /* The following exprs can be assignment targets. */
    1281         case Attribute_kind:
    1282                 VISIT(st, expr, e->v.Attribute.value);
    1283                 break;
    1284         case Subscript_kind:
    1285                 VISIT(st, expr, e->v.Subscript.value);
    1286                 VISIT(st, slice, e->v.Subscript.slice);
    1287                 break;
    1288         case Name_kind:
    1289                 if (!symtable_add_def(st, e->v.Name.id,
    1290                                       e->v.Name.ctx == Load ? USE : DEF_LOCAL))
    1291                         return 0;
    1292                 break;
    1293         /* child nodes of List and Tuple will have expr_context set */
    1294         case List_kind:
    1295                 VISIT_SEQ(st, expr, e->v.List.elts);
    1296                 break;
    1297         case Tuple_kind:
    1298                 VISIT_SEQ(st, expr, e->v.Tuple.elts);
    1299                 break;
    1300         }
    1301         return 1;
    1302 }
    1303 
    1304 static int
    1305 symtable_implicit_arg(struct symtable *st, int pos)
    1306 {
    1307         PyObject *id = PyString_FromFormat(".%d", pos);
    1308         if (id == NULL)
    1309                 return 0;
    1310         if (!symtable_add_def(st, id, DEF_PARAM)) {
    1311                 Py_DECREF(id);
    1312                 return 0;
    1313         }
    1314         Py_DECREF(id);
    1315         return 1;
    1316 }
    1317 
    1318 static int
    1319 symtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
    1320 {
    1321         int i;
    1322        
    1323         /* go through all the toplevel arguments first */
    1324         for (i = 0; i < asdl_seq_LEN(args); i++) {
    1325                 expr_ty arg = (expr_ty)asdl_seq_GET(args, i);
    1326                 if (arg->kind == Name_kind) {
    1327                         assert(arg->v.Name.ctx == Param ||
    1328                                (arg->v.Name.ctx == Store && !toplevel));
    1329                         if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
    1330                                 return 0;
    1331                 }
    1332                 else if (arg->kind == Tuple_kind) {
    1333                         assert(arg->v.Tuple.ctx == Store);
    1334                         if (toplevel) {
    1335                                 if (!symtable_implicit_arg(st, i))
    1336                                         return 0;
    1337                         }
    1338                 }
    1339                 else {
    1340                         PyErr_SetString(PyExc_SyntaxError,
    1341                                         "invalid expression in parameter list");
    1342                         PyErr_SyntaxLocation(st->st_filename,
    1343                                              st->st_cur->ste_lineno);
    1344                         return 0;
    1345                 }
    1346         }
    1347 
    1348         if (!toplevel) {
    1349                 if (!symtable_visit_params_nested(st, args))
    1350                         return 0;
    1351         }
    1352 
    1353         return 1;
    1354 }
    1355 
    1356 static int
    1357 symtable_visit_params_nested(struct symtable *st, asdl_seq *args)
    1358 {
    1359         int i;
    1360         for (i = 0; i < asdl_seq_LEN(args); i++) {
    1361                 expr_ty arg = (expr_ty)asdl_seq_GET(args, i);
    1362                 if (arg->kind == Tuple_kind &&
    1363                     !symtable_visit_params(st, arg->v.Tuple.elts, 0))
    1364                         return 0;
    1365         }
    1366        
    1367         return 1;
    1368 }
    1369 
    1370 static int
    1371 symtable_visit_arguments(struct symtable *st, arguments_ty a)
    1372 {
    1373         /* skip default arguments inside function block
    1374            XXX should ast be different?
    1375         */
    1376         if (a->args && !symtable_visit_params(st, a->args, 1))
    1377                 return 0;
    1378         if (a->vararg) {
    1379                 if (!symtable_add_def(st, a->vararg, DEF_PARAM))
    1380                         return 0;
    1381                 st->st_cur->ste_varargs = 1;
    1382         }
    1383         if (a->kwarg) {
    1384                 if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
    1385                         return 0;
    1386                 st->st_cur->ste_varkeywords = 1;
    1387         }
    1388         if (a->args && !symtable_visit_params_nested(st, a->args))
    1389                 return 0;
    1390         return 1;
    1391 }
    1392 
    1393 
    1394 static int
    1395 symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
    1396 {
    1397         if (eh->v.ExceptHandler.type)
    1398                 VISIT(st, expr, eh->v.ExceptHandler.type);
    1399         if (eh->v.ExceptHandler.name)
    1400                 VISIT(st, expr, eh->v.ExceptHandler.name);
    1401         VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body);
    1402         return 1;
    1403 }
    1404 
    1405 
    1406 static int
    1407 symtable_visit_alias(struct symtable *st, alias_ty a)
    1408 {
    1409         /* Compute store_name, the name actually bound by the import
    1410            operation.  It is diferent than a->name when a->name is a
    1411            dotted package name (e.g. spam.eggs)
    1412         */
    1413         PyObject *store_name;
    1414         PyObject *name = (a->asname == NULL) ? a->name : a->asname;
    1415         const char *base = PyString_AS_STRING(name);
    1416         char *dot = strchr(base, '.');
    1417         if (dot) {
    1418                 store_name = PyString_FromStringAndSize(base, dot - base);
    1419                 if (!store_name)
    1420                         return 0;
    1421         }
    1422         else {
    1423                 store_name = name;
    1424                 Py_INCREF(store_name);
    1425         }
    1426         if (strcmp(PyString_AS_STRING(name), "*")) {
    1427                 int r = symtable_add_def(st, store_name, DEF_IMPORT);
    1428                 Py_DECREF(store_name);
    1429                 return r;
    1430         }
    1431         else {
    1432             if (st->st_cur->ste_type != ModuleBlock) {
    1433                 int lineno = st->st_cur->ste_lineno;
    1434                 if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
    1435                     Py_DECREF(store_name);
    1436                     return 0;
    1437                 }
    1438             }
    1439             st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
    1440             Py_DECREF(store_name);
    1441             return 1;
    1442         }
    1443 }
    1444 
    1445 
    1446 static int
    1447 symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
    1448 {
    1449         VISIT(st, expr, lc->target);
    1450         VISIT(st, expr, lc->iter);
    1451         VISIT_SEQ(st, expr, lc->ifs);
    1452         return 1;
    1453 }
    1454 
    1455 
    1456 static int
    1457 symtable_visit_keyword(struct symtable *st, keyword_ty k)
    1458 {
    1459         VISIT(st, expr, k->value);
    1460         return 1;
    1461 }
    1462 
    1463 
    1464 static int
    1465 symtable_visit_slice(struct symtable *st, slice_ty s)
    1466 {
    1467         switch (s->kind) {
    1468         case Slice_kind:
    1469                 if (s->v.Slice.lower)
    1470                         VISIT(st, expr, s->v.Slice.lower)
    1471                 if (s->v.Slice.upper)
    1472                         VISIT(st, expr, s->v.Slice.upper)
    1473                 if (s->v.Slice.step)
    1474                         VISIT(st, expr, s->v.Slice.step)
    1475                 break;
    1476         case ExtSlice_kind:
    1477                 VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
    1478                 break;
    1479         case Index_kind:
    1480                 VISIT(st, expr, s->v.Index.value)
    1481                 break;
    1482         case Ellipsis_kind:
    1483                 break;
    1484         }
    1485         return 1;
    1486 }
    1487 
    1488 static int
     1482    char tmpname[256];
     1483    identifier tmp;
     1484
     1485    PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
     1486                  ++st->st_cur->ste_tmpname);
     1487    tmp = PyString_InternFromString(tmpname);
     1488    if (!tmp)
     1489        return 0;
     1490    if (!symtable_add_def(st, tmp, DEF_LOCAL))
     1491        return 0;
     1492    Py_DECREF(tmp);
     1493    return 1;
     1494}
     1495
     1496static int
     1497symtable_handle_comprehension(struct symtable *st, expr_ty e,
     1498                              identifier scope_name, asdl_seq *generators,
     1499                              expr_ty elt, expr_ty value)
     1500{
     1501    int is_generator = (e->kind == GeneratorExp_kind);
     1502    int needs_tmp = !is_generator;
     1503    comprehension_ty outermost = ((comprehension_ty)
     1504                                    asdl_seq_GET(generators, 0));
     1505    /* Outermost iterator is evaluated in current scope */
     1506    VISIT(st, expr, outermost->iter);
     1507    /* Create comprehension scope for the rest */
     1508    if (!scope_name ||
     1509        !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e, 0)) {
     1510        return 0;
     1511    }
     1512    st->st_cur->ste_generator = is_generator;
     1513    /* Outermost iter is received as an argument */
     1514    if (!symtable_implicit_arg(st, 0)) {
     1515        symtable_exit_block(st, (void *)e);
     1516        return 0;
     1517    }
     1518    /* Allocate temporary name if needed */
     1519    if (needs_tmp && !symtable_new_tmpname(st)) {
     1520        symtable_exit_block(st, (void *)e);
     1521        return 0;
     1522    }
     1523    VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
     1524    VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
     1525    VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
     1526                            generators, 1, (void*)e);
     1527    if (value)
     1528        VISIT_IN_BLOCK(st, expr, value, (void*)e);
     1529    VISIT_IN_BLOCK(st, expr, elt, (void*)e);
     1530    return symtable_exit_block(st, (void *)e);
     1531}
     1532
     1533static int
    14891534symtable_visit_genexp(struct symtable *st, expr_ty e)
    14901535{
    1491         comprehension_ty outermost = ((comprehension_ty)
    1492                          (asdl_seq_GET(e->v.GeneratorExp.generators, 0)));
    1493         /* Outermost iterator is evaluated in current scope */
    1494         VISIT(st, expr, outermost->iter);
    1495         /* Create generator scope for the rest */
    1496         if (!GET_IDENTIFIER(genexpr) ||
    1497             !symtable_enter_block(st, genexpr, FunctionBlock, (void *)e, e->lineno)) {
    1498                 return 0;
    1499         }
    1500         st->st_cur->ste_generator = 1;
    1501         /* Outermost iter is received as an argument */
    1502         if (!symtable_implicit_arg(st, 0)) {
    1503                 symtable_exit_block(st, (void *)e);
    1504                 return 0;
    1505         }
    1506         VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
    1507         VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
    1508         VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
    1509                                 e->v.GeneratorExp.generators, 1, (void*)e);
    1510         VISIT_IN_BLOCK(st, expr, e->v.GeneratorExp.elt, (void*)e);
    1511         return symtable_exit_block(st, (void *)e);
    1512 }
     1536    return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr),
     1537                                         e->v.GeneratorExp.generators,
     1538                                         e->v.GeneratorExp.elt, NULL);
     1539}
     1540
     1541static int
     1542symtable_visit_setcomp(struct symtable *st, expr_ty e)
     1543{
     1544    return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp),
     1545                                         e->v.SetComp.generators,
     1546                                         e->v.SetComp.elt, NULL);
     1547}
     1548
     1549static int
     1550symtable_visit_dictcomp(struct symtable *st, expr_ty e)
     1551{
     1552    return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp),
     1553                                         e->v.DictComp.generators,
     1554                                         e->v.DictComp.key,
     1555                                         e->v.DictComp.value);
     1556}
Note: See TracChangeset for help on using the changeset viewer.