annotate Python/symtable.c @ 37468:04afb3650847 legacy-trunk

Generate line number table entries for except handlers. Re-enable all the tests in test_trace.py except one. Still not sure that these tests test what they used to test, but they pass. One failing test seems to be caused by undocumented line number table behavior in Python 2.4.
author Jeremy Hylton <jeremy@alum.mit.edu>
date Tue, 04 Apr 2006 14:26:39 +0000
parents 796d150e45a9
children 19d99b31555c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 #include "Python.h"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
2 #include "Python-ast.h"
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
3 #include "code.h"
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4 #include "symtable.h"
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5 #include "structmember.h"
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
6
36089
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
7 /* error strings used for warnings */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
8 #define GLOBAL_AFTER_ASSIGN \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
9 "name '%.400s' is assigned to before global declaration"
21325
8a26bb369f53 Add a comment explaining the st_symbols cache.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21314
diff changeset
10
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
11 #define GLOBAL_AFTER_USE \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
12 "name '%.400s' is used prior to global declaration"
21325
8a26bb369f53 Add a comment explaining the st_symbols cache.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21314
diff changeset
13
36089
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
14 #define IMPORT_STAR_WARNING "import * only allowed at module level"
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
15
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
16
36739
796d150e45a9 No need to export PySTEntry_New, it is only used in symtable.c
Neal Norwitz <nnorwitz@gmail.com>
parents: 36695
diff changeset
17 /* XXX(nnorwitz): change name since static? */
796d150e45a9 No need to export PySTEntry_New, it is only used in symtable.c
Neal Norwitz <nnorwitz@gmail.com>
parents: 36695
diff changeset
18 static PySTEntryObject *
35793
914ec0afa51c Do not pollute name block_ty, prefix with _Py_
Neal Norwitz <nnorwitz@gmail.com>
parents: 35780
diff changeset
19 PySTEntry_New(struct symtable *st, identifier name, _Py_block_ty block,
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
20 void *key, int lineno)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21 {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
22 PySTEntryObject *ste = NULL;
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
23 PyObject *k;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
25 k = PyLong_FromVoidPtr(key);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 if (k == NULL)
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
27 goto fail;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
28 ste = (PySTEntryObject *)PyObject_New(PySTEntryObject,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
29 &PySTEntry_Type);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30 ste->ste_table = st;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31 ste->ste_id = k;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
32 ste->ste_tmpname = 0;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
33
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
34 ste->ste_name = name;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
35 Py_INCREF(name);
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
36
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
37 ste->ste_symbols = NULL;
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
38 ste->ste_varnames = NULL;
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
39 ste->ste_children = NULL;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
40
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
41 ste->ste_symbols = PyDict_New();
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
42 if (ste->ste_symbols == NULL)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
43 goto fail;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
44
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
45 ste->ste_varnames = PyList_New(0);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
46 if (ste->ste_varnames == NULL)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
47 goto fail;
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
48
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
49 ste->ste_children = PyList_New(0);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
50 if (ste->ste_children == NULL)
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
51 goto fail;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
52
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
53 ste->ste_type = block;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
54 ste->ste_unoptimized = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
55 ste->ste_nested = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
56 ste->ste_free = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
57 ste->ste_varargs = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
58 ste->ste_varkeywords = 0;
21179
485422900ef0 SF bug #488687 reported by Neal Norwitz
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21090
diff changeset
59 ste->ste_opt_lineno = 0;
29226
3aaf24b949df Backport fix for SF bug 734869 and sundry compiler cleanups.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21325
diff changeset
60 ste->ste_tmpname = 0;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
61 ste->ste_lineno = lineno;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
62
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
63 if (st->st_cur != NULL &&
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
64 (st->st_cur->ste_nested ||
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
65 st->st_cur->ste_type == FunctionBlock))
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
66 ste->ste_nested = 1;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
67 ste->ste_child_free = 0;
18148
7bc473b2c654 Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents: 16799
diff changeset
68 ste->ste_generator = 0;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
69
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
70 if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0)
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
71 goto fail;
16753
51977af230fa Fix for bug 133489: compiler leaks memory
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16539
diff changeset
72
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
73 return ste;
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
74 fail:
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
75 Py_XDECREF(ste);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
76 return NULL;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
77 }
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
78
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
79 static PyObject *
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
80 ste_repr(PySTEntryObject *ste)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
81 {
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
82 char buf[256];
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
83
21090
5e25c669741c ste_repr(): Conversion of sprintf() to PyOS_snprintf() for buffer
Barry Warsaw <barry@python.org>
parents: 20012
diff changeset
84 PyOS_snprintf(buf, sizeof(buf),
5e25c669741c ste_repr(): Conversion of sprintf() to PyOS_snprintf() for buffer
Barry Warsaw <barry@python.org>
parents: 20012
diff changeset
85 "<symtable entry %.100s(%ld), line %d>",
5e25c669741c ste_repr(): Conversion of sprintf() to PyOS_snprintf() for buffer
Barry Warsaw <barry@python.org>
parents: 20012
diff changeset
86 PyString_AS_STRING(ste->ste_name),
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
87 PyInt_AS_LONG(ste->ste_id), ste->ste_lineno);
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
88 return PyString_FromString(buf);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
89 }
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
90
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
91 static void
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
92 ste_dealloc(PySTEntryObject *ste)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
93 {
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
94 ste->ste_table = NULL;
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
95 Py_XDECREF(ste->ste_id);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
96 Py_XDECREF(ste->ste_name);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
97 Py_XDECREF(ste->ste_symbols);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
98 Py_XDECREF(ste->ste_varnames);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
99 Py_XDECREF(ste->ste_children);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
100 PyObject_Del(ste);
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
101 }
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
102
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
103 #define OFF(x) offsetof(PySTEntryObject, x)
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
104
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
105 static PyMemberDef ste_memberlist[] = {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
106 {"id", T_OBJECT, OFF(ste_id), READONLY},
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
107 {"name", T_OBJECT, OFF(ste_name), READONLY},
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
108 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
109 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
110 {"children", T_OBJECT, OFF(ste_children), READONLY},
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
111 {"type", T_INT, OFF(ste_type), READONLY},
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
112 {"lineno", T_INT, OFF(ste_lineno), READONLY},
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
113 {NULL}
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
114 };
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
115
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
116 PyTypeObject PySTEntry_Type = {
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
117 PyObject_HEAD_INIT(&PyType_Type)
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
118 0,
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
119 "symtable entry",
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
120 sizeof(PySTEntryObject),
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
121 0,
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
122 (destructor)ste_dealloc, /* tp_dealloc */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
123 0, /* tp_print */
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
124 0, /* tp_getattr */
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
125 0, /* tp_setattr */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
126 0, /* tp_compare */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
127 (reprfunc)ste_repr, /* tp_repr */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
128 0, /* tp_as_number */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
129 0, /* tp_as_sequence */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
130 0, /* tp_as_mapping */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
131 0, /* tp_hash */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
132 0, /* tp_call */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
133 0, /* tp_str */
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
134 PyObject_GenericGetAttr, /* tp_getattro */
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
135 0, /* tp_setattro */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
136 0, /* tp_as_buffer */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
137 Py_TPFLAGS_DEFAULT, /* tp_flags */
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
138 0, /* tp_doc */
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
139 0, /* tp_traverse */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
140 0, /* tp_clear */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
141 0, /* tp_richcompare */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
142 0, /* tp_weaklistoffset */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
143 0, /* tp_iter */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
144 0, /* tp_iternext */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
145 0, /* tp_methods */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
146 ste_memberlist, /* tp_members */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
147 0, /* tp_getset */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
148 0, /* tp_base */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
149 0, /* tp_dict */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
150 0, /* tp_descr_get */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
151 0, /* tp_descr_set */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
152 0, /* tp_dictoffset */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
153 0, /* tp_init */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
154 0, /* tp_alloc */
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18148
diff changeset
155 0, /* tp_new */
16539
a47d93ef103a Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
156 };
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
157
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
158 static int symtable_analyze(struct symtable *st);
36089
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
159 static int symtable_warn(struct symtable *st, char *msg, int lineno);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
160 static int symtable_enter_block(struct symtable *st, identifier name,
35793
914ec0afa51c Do not pollute name block_ty, prefix with _Py_
Neal Norwitz <nnorwitz@gmail.com>
parents: 35780
diff changeset
161 _Py_block_ty block, void *ast, int lineno);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
162 static int symtable_exit_block(struct symtable *st, void *ast);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
163 static int symtable_visit_stmt(struct symtable *st, stmt_ty s);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
164 static int symtable_visit_expr(struct symtable *st, expr_ty s);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
165 static int symtable_visit_genexp(struct symtable *st, expr_ty s);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
166 static int symtable_visit_arguments(struct symtable *st, arguments_ty);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
167 static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
168 static int symtable_visit_alias(struct symtable *st, alias_ty);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
169 static int symtable_visit_comprehension(struct symtable *st, comprehension_ty);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
170 static int symtable_visit_keyword(struct symtable *st, keyword_ty);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
171 static int symtable_visit_slice(struct symtable *st, slice_ty);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
172 static int symtable_visit_params(struct symtable *st, asdl_seq *args, int top);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
173 static int symtable_visit_params_nested(struct symtable *st, asdl_seq *args);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
174 static int symtable_implicit_arg(struct symtable *st, int pos);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
175
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
176
35880
0d1e2e73c3ec Bring handling of genexpr in line with other anonymous scope names
Nick Coghlan <ncoghlan@gmail.com>
parents: 35863
diff changeset
177 static identifier top = NULL, lambda = NULL, genexpr = NULL;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
178
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
179 #define GET_IDENTIFIER(VAR) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
180 ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
181
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
182 #define DUPLICATE_ARGUMENT \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
183 "duplicate argument '%s' in function definition"
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
184
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
185 static struct symtable *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
186 symtable_new(void)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
187 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
188 struct symtable *st;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
189
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
190 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
191 if (st == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
192 return NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
193
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
194 st->st_filename = NULL;
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
195 st->st_symbols = NULL;
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
196
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
197 if ((st->st_stack = PyList_New(0)) == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
198 goto fail;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
199 if ((st->st_symbols = PyDict_New()) == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
200 goto fail;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
201 st->st_cur = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
202 st->st_tmpname = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
203 st->st_private = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
204 return st;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
205 fail:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
206 PySymtable_Free(st);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
207 return NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
208 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
209
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
210 struct symtable *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
211 PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
212 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
213 struct symtable *st = symtable_new();
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
214 asdl_seq *seq;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
215 int i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
216
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
217 if (st == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
218 return st;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
219 st->st_filename = filename;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
220 st->st_future = future;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
221 symtable_enter_block(st, GET_IDENTIFIER(top), ModuleBlock,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
222 (void *)mod, 0);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
223 st->st_top = st->st_cur;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
224 st->st_cur->ste_unoptimized = OPT_TOPLEVEL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
225 /* Any other top-level initialization? */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
226 switch (mod->kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
227 case Module_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
228 seq = mod->v.Module.body;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
229 for (i = 0; i < asdl_seq_LEN(seq); i++)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
230 if (!symtable_visit_stmt(st, asdl_seq_GET(seq, i)))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
231 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
232 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
233 case Expression_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
234 if (!symtable_visit_expr(st, mod->v.Expression.body))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
235 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
236 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
237 case Interactive_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
238 seq = mod->v.Interactive.body;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
239 for (i = 0; i < asdl_seq_LEN(seq); i++)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
240 if (!symtable_visit_stmt(st, asdl_seq_GET(seq, i)))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
241 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
242 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
243 case Suite_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
244 PyErr_SetString(PyExc_RuntimeError,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
245 "this compiler does not handle Suites");
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
246 goto error;
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
247 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
248 if (!symtable_exit_block(st, (void *)mod)) {
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
249 PySymtable_Free(st);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
250 return NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
251 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
252 if (symtable_analyze(st))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
253 return st;
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
254 PySymtable_Free(st);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
255 return NULL;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
256 error:
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
257 (void) symtable_exit_block(st, (void *)mod);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
258 PySymtable_Free(st);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
259 return NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
260 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
261
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
262 void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
263 PySymtable_Free(struct symtable *st)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
264 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
265 Py_XDECREF(st->st_symbols);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
266 Py_XDECREF(st->st_stack);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
267 PyMem_Free((void *)st);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
268 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
269
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
270 PySTEntryObject *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
271 PySymtable_Lookup(struct symtable *st, void *key)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
272 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
273 PyObject *k, *v;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
274
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
275 k = PyLong_FromVoidPtr(key);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
276 if (k == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
277 return NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
278 v = PyDict_GetItem(st->st_symbols, k);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
279 if (v) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
280 assert(PySTEntry_Check(v));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
281 Py_INCREF(v);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
282 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
283 else {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
284 PyErr_SetString(PyExc_KeyError,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
285 "unknown symbol table entry");
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
286 }
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
287
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
288 Py_DECREF(k);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
289 return (PySTEntryObject *)v;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
290 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
291
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
292 int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
293 PyST_GetScope(PySTEntryObject *ste, PyObject *name)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
294 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
295 PyObject *v = PyDict_GetItem(ste->ste_symbols, name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
296 if (!v)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
297 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
298 assert(PyInt_Check(v));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
299 return (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
300 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
301
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
302
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
303 /* Analyze raw symbol information to determine scope of each name.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
304
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
305 The next several functions are helpers for PySymtable_Analyze(),
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
306 which determines whether a name is local, global, or free. In addition,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
307 it determines which local variables are cell variables; they provide
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
308 bindings that are used for free variables in enclosed blocks.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
309
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
310 There are also two kinds of free variables, implicit and explicit. An
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
311 explicit global is declared with the global statement. An implicit
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
312 global is a free variable for which the compiler has found no binding
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
313 in an enclosing function scope. The implicit global is either a global
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
314 or a builtin. Python's module and class blocks use the xxx_NAME opcodes
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
315 to handle these names to implement slightly odd semantics. In such a
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
316 block, the name is treated as global until it is assigned to; then it
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
317 is treated as a local.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
318
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
319 The symbol table requires two passes to determine the scope of each name.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
320 The first pass collects raw facts from the AST: the name is a parameter
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
321 here, the name is used by not defined here, etc. The second pass analyzes
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
322 these facts during a pass over the PySTEntryObjects created during pass 1.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
323
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
324 When a function is entered during the second pass, the parent passes
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
325 the set of all name bindings visible to its children. These bindings
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
326 are used to determine if the variable is free or an implicit global.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
327 After doing the local analysis, it analyzes each of its child blocks
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
328 using an updated set of name bindings.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
329
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
330 The children update the free variable set. If a local variable is free
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
331 in a child, the variable is marked as a cell. The current function must
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
332 provide runtime storage for the variable that may outlive the function's
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
333 frame. Cell variables are removed from the free set before the analyze
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
334 function returns to its parent.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
335
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
336 The sets of bound and free variables are implemented as dictionaries
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
337 mapping strings to None.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
338 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
339
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
340 #define SET_SCOPE(DICT, NAME, I) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
341 PyObject *o = PyInt_FromLong(I); \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
342 if (!o) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
343 return 0; \
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
344 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
345 Py_DECREF(o); \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
346 return 0; \
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
347 } \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
348 Py_DECREF(o); \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
349 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
350
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
351 /* Decide on scope of name, given flags.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
352
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
353 The dicts passed in as arguments are modified as necessary.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
354 ste is passed so that flags can be updated.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
355 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
356
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
357 static int
36231
d3f4c467e439 Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents: 36226
diff changeset
358 analyze_name(PySTEntryObject *ste, PyObject *dict, PyObject *name, long flags,
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
359 PyObject *bound, PyObject *local, PyObject *free,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
360 PyObject *global)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
361 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
362 if (flags & DEF_GLOBAL) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
363 if (flags & DEF_PARAM) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
364 PyErr_Format(PyExc_SyntaxError,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
365 "name '%s' is local and global",
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
366 PyString_AS_STRING(name));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
367 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
368 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
369 SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
370 if (PyDict_SetItem(global, name, Py_None) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
371 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
372 if (bound && PyDict_GetItem(bound, name)) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
373 if (PyDict_DelItem(bound, name) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
374 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
375 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
376 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
377 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
378 if (flags & DEF_BOUND) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
379 SET_SCOPE(dict, name, LOCAL);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
380 if (PyDict_SetItem(local, name, Py_None) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
381 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
382 if (PyDict_GetItem(global, name)) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
383 if (PyDict_DelItem(global, name) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
384 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
385 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
386 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
387 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
388 /* If an enclosing block has a binding for this name, it
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
389 is a free variable rather than a global variable.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
390 Note that having a non-NULL bound implies that the block
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
391 is nested.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
392 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
393 if (bound && PyDict_GetItem(bound, name)) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
394 SET_SCOPE(dict, name, FREE);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
395 ste->ste_free = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
396 if (PyDict_SetItem(free, name, Py_None) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
397 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
398 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
399 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
400 /* If a parent has a global statement, then call it global
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
401 explicit? It could also be global implicit.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
402 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
403 else if (global && PyDict_GetItem(global, name)) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
404 SET_SCOPE(dict, name, GLOBAL_EXPLICIT);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
405 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
406 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
407 else {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
408 if (ste->ste_nested)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
409 ste->ste_free = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
410 SET_SCOPE(dict, name, GLOBAL_IMPLICIT);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
411 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
412 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
413 return 0; /* Can't get here */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
414 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
415
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
416 #undef SET_SCOPE
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
417
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
418 /* If a name is defined in free and also in locals, then this block
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
419 provides the binding for the free variable. The name should be
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
420 marked CELL in this block and removed from the free list.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
421
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
422 Note that the current block's free variables are included in free.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
423 That's safe because no name can be free and local in the same scope.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
424 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
425
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
426 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
427 analyze_cells(PyObject *scope, PyObject *free)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
428 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
429 PyObject *name, *v, *w;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36240
diff changeset
430 int success = 0;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36240
diff changeset
431 Py_ssize_t pos = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
432
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
433 w = PyInt_FromLong(CELL);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
434 if (!w)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
435 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
436 while (PyDict_Next(scope, &pos, &name, &v)) {
36240
af7d484208e9 analyze_cells(): This no longer compiled under VC 7.1.
Tim Peters <tim.peters@gmail.com>
parents: 36231
diff changeset
437 long flags;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
438 assert(PyInt_Check(v));
36240
af7d484208e9 analyze_cells(): This no longer compiled under VC 7.1.
Tim Peters <tim.peters@gmail.com>
parents: 36231
diff changeset
439 flags = PyInt_AS_LONG(v);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
440 if (flags != LOCAL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
441 continue;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
442 if (!PyDict_GetItem(free, name))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
443 continue;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
444 /* Replace LOCAL with CELL for this name, and remove
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
445 from free. It is safe to replace the value of name
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
446 in the dict, because it will not cause a resize.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
447 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
448 if (PyDict_SetItem(scope, name, w) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
449 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
450 if (!PyDict_DelItem(free, name) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
451 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
452 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
453 success = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
454 error:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
455 Py_DECREF(w);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
456 return success;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
457 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
458
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
459 /* Check for illegal statements in unoptimized namespaces */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
460 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
461 check_unoptimized(const PySTEntryObject* ste) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
462 char buf[300];
35759
d91ed7107fd2 ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents: 35742
diff changeset
463 const char* trailer;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
464
35780
72cb041ccde3 Fix check_unoptimized() function. The only optimized namespaces are
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35779
diff changeset
465 if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
466 || !(ste->ste_free || ste->ste_child_free))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
467 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
468
35759
d91ed7107fd2 ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents: 35742
diff changeset
469 trailer = (ste->ste_child_free ?
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
470 "contains a nested function with free variables" :
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
471 "is a nested function");
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
472
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
473 switch (ste->ste_unoptimized) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
474 case OPT_TOPLEVEL: /* exec / import * at top-level is fine */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
475 case OPT_EXEC: /* qualified exec is fine */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
476 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
477 case OPT_IMPORT_STAR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
478 PyOS_snprintf(buf, sizeof(buf),
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
479 "import * is not allowed in function '%.100s' "
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
480 "because it is %s",
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
481 PyString_AS_STRING(ste->ste_name), trailer);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
482 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
483 case OPT_BARE_EXEC:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
484 PyOS_snprintf(buf, sizeof(buf),
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
485 "unqualified exec is not allowed in function "
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
486 "'%.100s' it %s",
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
487 PyString_AS_STRING(ste->ste_name), trailer);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
488 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
489 default:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
490 PyOS_snprintf(buf, sizeof(buf),
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
491 "function '%.100s' uses import * and bare exec, "
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
492 "which are illegal because it %s",
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
493 PyString_AS_STRING(ste->ste_name), trailer);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
494 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
495 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
496
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
497 PyErr_SetString(PyExc_SyntaxError, buf);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
498 PyErr_SyntaxLocation(ste->ste_table->st_filename,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
499 ste->ste_opt_lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
500 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
501 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
502
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
503 /* Enter the final scope information into the st_symbols dict.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
504 *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
505 * All arguments are dicts. Modifies symbols, others are read-only.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
506 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
507 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
508 update_symbols(PyObject *symbols, PyObject *scope,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
509 PyObject *bound, PyObject *free, int class)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
510 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
511 PyObject *name, *v, *u, *w, *free_value = NULL;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36240
diff changeset
512 Py_ssize_t pos = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
513
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
514 while (PyDict_Next(symbols, &pos, &name, &v)) {
36231
d3f4c467e439 Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents: 36226
diff changeset
515 long i, flags;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
516 assert(PyInt_Check(v));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
517 flags = PyInt_AS_LONG(v);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
518 w = PyDict_GetItem(scope, name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
519 assert(w && PyInt_Check(w));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
520 i = PyInt_AS_LONG(w);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
521 flags |= (i << SCOPE_OFF);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
522 u = PyInt_FromLong(flags);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
523 if (PyDict_SetItem(symbols, name, u) < 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
524 Py_DECREF(u);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
525 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
526 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
527 Py_DECREF(u);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
528 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
529
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
530 free_value = PyInt_FromLong(FREE << SCOPE_OFF);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
531 if (!free_value)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
532 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
533
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
534 /* add a free variable when it's only use is for creating a closure */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
535 pos = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
536 while (PyDict_Next(free, &pos, &name, &v)) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
537 PyObject *o = PyDict_GetItem(symbols, name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
538
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
539 if (o) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
540 /* It could be a free variable in a method of
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
541 the class that has the same name as a local
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
542 or global in the class scope.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
543 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
544 if (class &&
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
545 PyInt_AS_LONG(o) & (DEF_BOUND | DEF_GLOBAL)) {
36231
d3f4c467e439 Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents: 36226
diff changeset
546 long i = PyInt_AS_LONG(o) | DEF_FREE_CLASS;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
547 o = PyInt_FromLong(i);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
548 if (!o) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
549 Py_DECREF(free_value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
550 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
551 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
552 if (PyDict_SetItem(symbols, name, o) < 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
553 Py_DECREF(o);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
554 Py_DECREF(free_value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
555 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
556 }
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
557 Py_DECREF(o);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
558 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
559 /* else it's not free, probably a cell */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
560 continue;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
561 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
562 if (!PyDict_GetItem(bound, name))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
563 continue; /* it's a global */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
564
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
565 if (PyDict_SetItem(symbols, name, free_value) < 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
566 Py_DECREF(free_value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
567 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
568 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
569 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
570 Py_DECREF(free_value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
571 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
572 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
573
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
574 /* Make final symbol table decisions for block of ste.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
575 Arguments:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
576 ste -- current symtable entry (input/output)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
577 bound -- set of variables bound in enclosing scopes (input)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
578 free -- set of free variables in enclosed scopes (output)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
579 globals -- set of declared global variables in enclosing scopes (input)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
580 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
581
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
582 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
583 analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
584 PyObject *global)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
585 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
586 PyObject *name, *v, *local = NULL, *scope = NULL, *newbound = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
587 PyObject *newglobal = NULL, *newfree = NULL;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36240
diff changeset
588 int i, success = 0;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36240
diff changeset
589 Py_ssize_t pos = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
590
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
591 local = PyDict_New();
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
592 if (!local)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
593 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
594 scope = PyDict_New();
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
595 if (!scope)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
596 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
597 newglobal = PyDict_New();
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
598 if (!newglobal)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
599 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
600 newfree = PyDict_New();
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
601 if (!newfree)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
602 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
603 newbound = PyDict_New();
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
604 if (!newbound)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
605 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
606
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
607 if (ste->ste_type == ClassBlock) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
608 /* make a copy of globals before calling analyze_name(),
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
609 because global statements in the class have no effect
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
610 on nested functions.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
611 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
612 if (PyDict_Update(newglobal, global) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
613 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
614 if (bound)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
615 if (PyDict_Update(newbound, bound) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
616 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
617 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
618
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
619 assert(PySTEntry_Check(ste));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
620 assert(PyDict_Check(ste->ste_symbols));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
621 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
36231
d3f4c467e439 Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents: 36226
diff changeset
622 long flags = PyInt_AS_LONG(v);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
623 if (!analyze_name(ste, scope, name, flags, bound, local, free,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
624 global))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
625 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
626 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
627
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
628 if (ste->ste_type != ClassBlock) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
629 if (ste->ste_type == FunctionBlock) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
630 if (PyDict_Update(newbound, local) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
631 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
632 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
633 if (bound) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
634 if (PyDict_Update(newbound, bound) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
635 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
636 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
637 if (PyDict_Update(newglobal, global) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
638 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
639 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
640
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
641 /* Recursively call analyze_block() on each child block */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
642 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
643 PyObject *c = PyList_GET_ITEM(ste->ste_children, i);
35759
d91ed7107fd2 ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents: 35742
diff changeset
644 PySTEntryObject* entry;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
645 assert(c && PySTEntry_Check(c));
35759
d91ed7107fd2 ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents: 35742
diff changeset
646 entry = (PySTEntryObject*)c;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
647 if (!analyze_block(entry, newbound, newfree, newglobal))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
648 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
649 if (entry->ste_free || entry->ste_child_free)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
650 ste->ste_child_free = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
651 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
652
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
653 if (ste->ste_type == FunctionBlock && !analyze_cells(scope, newfree))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
654 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
655 if (!update_symbols(ste->ste_symbols, scope, bound, newfree,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
656 ste->ste_type == ClassBlock))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
657 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
658 if (!check_unoptimized(ste))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
659 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
660
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
661 if (PyDict_Update(free, newfree) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
662 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
663 success = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
664 error:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
665 Py_XDECREF(local);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
666 Py_XDECREF(scope);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
667 Py_XDECREF(newbound);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
668 Py_XDECREF(newglobal);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
669 Py_XDECREF(newfree);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
670 if (!success)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
671 assert(PyErr_Occurred());
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
672 return success;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
673 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
674
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
675 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
676 symtable_analyze(struct symtable *st)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
677 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
678 PyObject *free, *global;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
679 int r;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
680
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
681 free = PyDict_New();
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
682 if (!free)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
683 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
684 global = PyDict_New();
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
685 if (!global) {
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
686 Py_DECREF(free);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
687 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
688 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
689 r = analyze_block(st->st_top, NULL, free, global);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
690 Py_DECREF(free);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
691 Py_DECREF(global);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
692 return r;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
693 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
694
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
695
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
696 static int
36089
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
697 symtable_warn(struct symtable *st, char *msg, int lineno)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
698 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
699 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
36089
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
700 lineno, NULL, NULL) < 0) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
701 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
702 PyErr_SetString(PyExc_SyntaxError, msg);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
703 PyErr_SyntaxLocation(st->st_filename,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
704 st->st_cur->ste_lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
705 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
706 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
707 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
708 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
709 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
710
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
711 /* symtable_enter_block() gets a reference via PySTEntry_New().
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
712 This reference is released when the block is exited, via the DECREF
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
713 in symtable_exit_block().
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
714 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
715
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
716 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
717 symtable_exit_block(struct symtable *st, void *ast)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
718 {
36521
30aef3ce2b26 Use Py_ssize_t to count the
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
719 Py_ssize_t end;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
720
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
721 Py_DECREF(st->st_cur);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
722 end = PyList_GET_SIZE(st->st_stack) - 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
723 if (end >= 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
724 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
725 end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
726 Py_INCREF(st->st_cur);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
727 if (PySequence_DelItem(st->st_stack, end) < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
728 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
729 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
730 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
731 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
732
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
733 static int
35793
914ec0afa51c Do not pollute name block_ty, prefix with _Py_
Neal Norwitz <nnorwitz@gmail.com>
parents: 35780
diff changeset
734 symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
735 void *ast, int lineno)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
736 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
737 PySTEntryObject *prev = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
738
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
739 if (st->st_cur) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
740 prev = st->st_cur;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
741 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
742 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
743 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
744 Py_DECREF(st->st_cur);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
745 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
746 st->st_cur = PySTEntry_New(st, name, block, ast, lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
747 if (name == GET_IDENTIFIER(top))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
748 st->st_global = st->st_cur->ste_symbols;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
749 if (prev) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
750 if (PyList_Append(prev->ste_children,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
751 (PyObject *)st->st_cur) < 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
752 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
753 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
754 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
755 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
756 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
757
36231
d3f4c467e439 Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents: 36226
diff changeset
758 static long
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
759 symtable_lookup(struct symtable *st, PyObject *name)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
760 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
761 PyObject *o;
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
762 PyObject *mangled = _Py_Mangle(st->st_private, name);
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
763 if (!mangled)
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
764 return 0;
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
765 o = PyDict_GetItem(st->st_cur->ste_symbols, mangled);
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
766 Py_DECREF(mangled);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
767 if (!o)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
768 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
769 return PyInt_AsLong(o);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
770 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
771
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
772 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
773 symtable_add_def(struct symtable *st, PyObject *name, int flag)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
774 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
775 PyObject *o;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
776 PyObject *dict;
36231
d3f4c467e439 Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents: 36226
diff changeset
777 long val;
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
778 PyObject *mangled = _Py_Mangle(st->st_private, name);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
779
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
780 if (!mangled)
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
781 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
782 dict = st->st_cur->ste_symbols;
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
783 if ((o = PyDict_GetItem(dict, mangled))) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
784 val = PyInt_AS_LONG(o);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
785 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
786 /* Is it better to use 'mangled' or 'name' here? */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
787 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
788 PyString_AsString(name));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
789 PyErr_SyntaxLocation(st->st_filename,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
790 st->st_cur->ste_lineno);
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
791 goto error;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
792 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
793 val |= flag;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
794 } else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
795 val = flag;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
796 o = PyInt_FromLong(val);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
797 if (o == NULL)
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
798 goto error;
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
799 if (PyDict_SetItem(dict, mangled, o) < 0) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
800 Py_DECREF(o);
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
801 goto error;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
802 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
803 Py_DECREF(o);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
804
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
805 if (flag & DEF_PARAM) {
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
806 if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0)
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
807 goto error;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
808 } else if (flag & DEF_GLOBAL) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
809 /* XXX need to update DEF_GLOBAL for other flags too;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
810 perhaps only DEF_FREE_GLOBAL */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
811 val = flag;
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
812 if ((o = PyDict_GetItem(st->st_global, mangled))) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
813 val |= PyInt_AS_LONG(o);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
814 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
815 o = PyInt_FromLong(val);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
816 if (o == NULL)
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
817 goto error;
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
818 if (PyDict_SetItem(st->st_global, mangled, o) < 0) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
819 Py_DECREF(o);
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
820 goto error;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
821 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
822 Py_DECREF(o);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
823 }
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35880
diff changeset
824 Py_DECREF(mangled);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
825 return 1;
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
826
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
827 error:
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
828 Py_DECREF(mangled);
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
829 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
830 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
831
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
832 /* VISIT, VISIT_SEQ and VIST_SEQ_TAIL take an ASDL type as their second argument.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
833 They use the ASDL name to synthesize the name of the C type and the visit
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
834 function.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
835
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
836 VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
837 useful if the first node in the sequence requires special treatment.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
838 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
839
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
840 #define VISIT(ST, TYPE, V) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
841 if (!symtable_visit_ ## TYPE((ST), (V))) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
842 return 0;
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
843
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
844 #define VISIT_IN_BLOCK(ST, TYPE, V, S) \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
845 if (!symtable_visit_ ## TYPE((ST), (V))) { \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
846 symtable_exit_block((ST), (S)); \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
847 return 0; \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
848 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
849
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
850 #define VISIT_SEQ(ST, TYPE, SEQ) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
851 int i; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
852 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
853 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
854 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
855 if (!symtable_visit_ ## TYPE((ST), elt)) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
856 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
857 } \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
858 }
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
859
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
860 #define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
861 int i; \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
862 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
863 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
864 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
865 if (!symtable_visit_ ## TYPE((ST), elt)) { \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
866 symtable_exit_block((ST), (S)); \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
867 return 0; \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
868 } \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
869 } \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
870 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
871
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
872 #define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
873 int i; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
874 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
875 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
876 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
877 if (!symtable_visit_ ## TYPE((ST), elt)) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
878 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
879 } \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
880 }
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
881
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
882 #define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
883 int i; \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
884 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
885 for (i = (START); i < asdl_seq_LEN(seq); i++) { \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
886 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
887 if (!symtable_visit_ ## TYPE((ST), elt)) { \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
888 symtable_exit_block((ST), (S)); \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
889 return 0; \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
890 } \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
891 } \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
892 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
893
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
894 static int
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
895 symtable_new_tmpname(struct symtable *st)
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
896 {
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
897 char tmpname[256];
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
898 identifier tmp;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
899
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
900 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
901 ++st->st_cur->ste_tmpname);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
902 tmp = PyString_InternFromString(tmpname);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
903 if (!symtable_add_def(st, tmp, DEF_LOCAL))
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
904 return 0;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
905 Py_DECREF(tmp);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
906 return 1;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
907 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
908
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
909 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
910 symtable_visit_stmt(struct symtable *st, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
911 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
912 switch (s->kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
913 case FunctionDef_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
914 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
915 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
916 if (s->v.FunctionDef.args->defaults)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
917 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
918 if (s->v.FunctionDef.decorators)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
919 VISIT_SEQ(st, expr, s->v.FunctionDef.decorators);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
920 if (!symtable_enter_block(st, s->v.FunctionDef.name,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
921 FunctionBlock, (void *)s, s->lineno))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
922 return 0;
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
923 VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
924 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
925 if (!symtable_exit_block(st, s))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
926 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
927 break;
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
928 case ClassDef_kind: {
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
929 PyObject *tmp;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
930 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
931 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
932 VISIT_SEQ(st, expr, s->v.ClassDef.bases);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
933 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
934 (void *)s, s->lineno))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
935 return 0;
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
936 tmp = st->st_private;
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
937 st->st_private = s->v.ClassDef.name;
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
938 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
939 st->st_private = tmp;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
940 if (!symtable_exit_block(st, s))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
941 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
942 break;
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35766
diff changeset
943 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
944 case Return_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
945 if (s->v.Return.value)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
946 VISIT(st, expr, s->v.Return.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
947 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
948 case Delete_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
949 VISIT_SEQ(st, expr, s->v.Delete.targets);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
950 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
951 case Assign_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
952 VISIT_SEQ(st, expr, s->v.Assign.targets);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
953 VISIT(st, expr, s->v.Assign.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
954 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
955 case AugAssign_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
956 VISIT(st, expr, s->v.AugAssign.target);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
957 VISIT(st, expr, s->v.AugAssign.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
958 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
959 case Print_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
960 if (s->v.Print.dest)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
961 VISIT(st, expr, s->v.Print.dest);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
962 VISIT_SEQ(st, expr, s->v.Print.values);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
963 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
964 case For_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
965 VISIT(st, expr, s->v.For.target);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
966 VISIT(st, expr, s->v.For.iter);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
967 VISIT_SEQ(st, stmt, s->v.For.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
968 if (s->v.For.orelse)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
969 VISIT_SEQ(st, stmt, s->v.For.orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
970 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
971 case While_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
972 VISIT(st, expr, s->v.While.test);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
973 VISIT_SEQ(st, stmt, s->v.While.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
974 if (s->v.While.orelse)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
975 VISIT_SEQ(st, stmt, s->v.While.orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
976 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
977 case If_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
978 /* XXX if 0: and lookup_yield() hacks */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
979 VISIT(st, expr, s->v.If.test);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
980 VISIT_SEQ(st, stmt, s->v.If.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
981 if (s->v.If.orelse)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
982 VISIT_SEQ(st, stmt, s->v.If.orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
983 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
984 case Raise_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
985 if (s->v.Raise.type) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
986 VISIT(st, expr, s->v.Raise.type);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
987 if (s->v.Raise.inst) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
988 VISIT(st, expr, s->v.Raise.inst);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
989 if (s->v.Raise.tback)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
990 VISIT(st, expr, s->v.Raise.tback);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
991 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
992 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
993 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
994 case TryExcept_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
995 VISIT_SEQ(st, stmt, s->v.TryExcept.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
996 VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
997 VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
998 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
999 case TryFinally_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1000 VISIT_SEQ(st, stmt, s->v.TryFinally.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1001 VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1002 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1003 case Assert_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1004 VISIT(st, expr, s->v.Assert.test);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1005 if (s->v.Assert.msg)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1006 VISIT(st, expr, s->v.Assert.msg);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1007 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1008 case Import_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1009 VISIT_SEQ(st, alias, s->v.Import.names);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1010 /* XXX Don't have the lineno available inside
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1011 visit_alias */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1012 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1013 st->st_cur->ste_opt_lineno = s->lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1014 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1015 case ImportFrom_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1016 VISIT_SEQ(st, alias, s->v.ImportFrom.names);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1017 /* XXX Don't have the lineno available inside
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1018 visit_alias */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1019 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1020 st->st_cur->ste_opt_lineno = s->lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1021 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1022 case Exec_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1023 VISIT(st, expr, s->v.Exec.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1024 if (!st->st_cur->ste_opt_lineno)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1025 st->st_cur->ste_opt_lineno = s->lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1026 if (s->v.Exec.globals) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1027 st->st_cur->ste_unoptimized |= OPT_EXEC;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1028 VISIT(st, expr, s->v.Exec.globals);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1029 if (s->v.Exec.locals)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1030 VISIT(st, expr, s->v.Exec.locals);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1031 } else {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1032 st->st_cur->ste_unoptimized |= OPT_BARE_EXEC;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1033 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1034 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1035 case Global_kind: {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1036 int i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1037 asdl_seq *seq = s->v.Global.names;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1038 for (i = 0; i < asdl_seq_LEN(seq); i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1039 identifier name = asdl_seq_GET(seq, i);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1040 char *c_name = PyString_AS_STRING(name);
36231
d3f4c467e439 Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents: 36226
diff changeset
1041 long cur = symtable_lookup(st, name);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1042 if (cur < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1043 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1044 if (cur & (DEF_LOCAL | USE)) {
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1045 char buf[256];
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1046 if (cur & DEF_LOCAL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1047 PyOS_snprintf(buf, sizeof(buf),
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1048 GLOBAL_AFTER_ASSIGN,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1049 c_name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1050 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1051 PyOS_snprintf(buf, sizeof(buf),
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1052 GLOBAL_AFTER_USE,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1053 c_name);
36089
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
1054 if (!symtable_warn(st, buf, s->lineno))
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1055 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1056 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1057 if (!symtable_add_def(st, name, DEF_GLOBAL))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1058 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1059 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1060 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1061 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1062 case Expr_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1063 VISIT(st, expr, s->v.Expr.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1064 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1065 case Pass_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1066 case Break_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1067 case Continue_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1068 /* nothing to do here */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1069 break;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1070 case With_kind:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1071 if (!symtable_new_tmpname(st))
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1072 return 0;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1073 VISIT(st, expr, s->v.With.context_expr);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1074 if (s->v.With.optional_vars) {
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1075 if (!symtable_new_tmpname(st))
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1076 return 0;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1077 VISIT(st, expr, s->v.With.optional_vars);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1078 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1079 VISIT_SEQ(st, stmt, s->v.With.body);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1080 break;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1081 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1082 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1083 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1084
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1085 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1086 symtable_visit_expr(struct symtable *st, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1087 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1088 switch (e->kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1089 case BoolOp_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1090 VISIT_SEQ(st, expr, e->v.BoolOp.values);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1091 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1092 case BinOp_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1093 VISIT(st, expr, e->v.BinOp.left);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1094 VISIT(st, expr, e->v.BinOp.right);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1095 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1096 case UnaryOp_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1097 VISIT(st, expr, e->v.UnaryOp.operand);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1098 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1099 case Lambda_kind: {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1100 if (!symtable_add_def(st, GET_IDENTIFIER(lambda), DEF_LOCAL))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1101 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1102 if (e->v.Lambda.args->defaults)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1103 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1104 /* XXX how to get line numbers for expressions */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1105 if (!symtable_enter_block(st, GET_IDENTIFIER(lambda),
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1106 FunctionBlock, (void *)e, 0))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1107 return 0;
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1108 VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1109 VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1110 if (!symtable_exit_block(st, (void *)e))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1111 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1112 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1113 }
36666
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36521
diff changeset
1114 case IfExp_kind:
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36521
diff changeset
1115 VISIT(st, expr, e->v.IfExp.test);
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36521
diff changeset
1116 VISIT(st, expr, e->v.IfExp.body);
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36521
diff changeset
1117 VISIT(st, expr, e->v.IfExp.orelse);
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36521
diff changeset
1118 break;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1119 case Dict_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1120 VISIT_SEQ(st, expr, e->v.Dict.keys);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1121 VISIT_SEQ(st, expr, e->v.Dict.values);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1122 break;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1123 case ListComp_kind:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1124 if (!symtable_new_tmpname(st))
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1125 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1126 VISIT(st, expr, e->v.ListComp.elt);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1127 VISIT_SEQ(st, comprehension, e->v.ListComp.generators);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1128 break;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1129 case GeneratorExp_kind:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
1130 if (!symtable_visit_genexp(st, e))
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1131 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1132 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1133 case Yield_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1134 if (e->v.Yield.value)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1135 VISIT(st, expr, e->v.Yield.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1136 st->st_cur->ste_generator = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1137 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1138 case Compare_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1139 VISIT(st, expr, e->v.Compare.left);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1140 VISIT_SEQ(st, expr, e->v.Compare.comparators);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1141 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1142 case Call_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1143 VISIT(st, expr, e->v.Call.func);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1144 VISIT_SEQ(st, expr, e->v.Call.args);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1145 VISIT_SEQ(st, keyword, e->v.Call.keywords);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1146 if (e->v.Call.starargs)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1147 VISIT(st, expr, e->v.Call.starargs);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1148 if (e->v.Call.kwargs)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1149 VISIT(st, expr, e->v.Call.kwargs);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1150 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1151 case Repr_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1152 VISIT(st, expr, e->v.Repr.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1153 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1154 case Num_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1155 case Str_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1156 /* Nothing to do here. */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1157 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1158 /* The following exprs can be assignment targets. */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1159 case Attribute_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1160 VISIT(st, expr, e->v.Attribute.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1161 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1162 case Subscript_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1163 VISIT(st, expr, e->v.Subscript.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1164 VISIT(st, slice, e->v.Subscript.slice);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1165 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1166 case Name_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1167 if (!symtable_add_def(st, e->v.Name.id,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1168 e->v.Name.ctx == Load ? USE : DEF_LOCAL))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1169 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1170 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1171 /* child nodes of List and Tuple will have expr_context set */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1172 case List_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1173 VISIT_SEQ(st, expr, e->v.List.elts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1174 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1175 case Tuple_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1176 VISIT_SEQ(st, expr, e->v.Tuple.elts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1177 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1178 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1179 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1180 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1181
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1182 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1183 symtable_implicit_arg(struct symtable *st, int pos)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1184 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1185 PyObject *id = PyString_FromFormat(".%d", pos);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1186 if (id == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1187 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1188 if (!symtable_add_def(st, id, DEF_PARAM)) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1189 Py_DECREF(id);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1190 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1191 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1192 Py_DECREF(id);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1193 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1194 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1195
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1196 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1197 symtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1198 {
36226
bb6fa4a31f15 Fix icc warnings: shadowing local variable (i) and complex is set but not used, so remove
Neal Norwitz <nnorwitz@gmail.com>
parents: 36089
diff changeset
1199 int i;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1200
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1201 /* go through all the toplevel arguments first */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1202 for (i = 0; i < asdl_seq_LEN(args); i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1203 expr_ty arg = asdl_seq_GET(args, i);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1204 if (arg->kind == Name_kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1205 assert(arg->v.Name.ctx == Param ||
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1206 (arg->v.Name.ctx == Store && !toplevel));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1207 if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1208 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1209 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1210 else if (arg->kind == Tuple_kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1211 assert(arg->v.Tuple.ctx == Store);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1212 if (toplevel) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1213 if (!symtable_implicit_arg(st, i))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1214 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1215 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1216 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1217 else {
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35880
diff changeset
1218 PyErr_SetString(PyExc_SyntaxError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35880
diff changeset
1219 "invalid expression in parameter list");
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35880
diff changeset
1220 PyErr_SyntaxLocation(st->st_filename,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35880
diff changeset
1221 st->st_cur->ste_lineno);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1222 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1223 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1224 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1225
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1226 if (!toplevel) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1227 if (!symtable_visit_params_nested(st, args))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1228 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1229 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1230
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1231 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1232 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1233
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1234 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1235 symtable_visit_params_nested(struct symtable *st, asdl_seq *args)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1236 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1237 int i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1238 for (i = 0; i < asdl_seq_LEN(args); i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1239 expr_ty arg = asdl_seq_GET(args, i);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1240 if (arg->kind == Tuple_kind &&
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1241 !symtable_visit_params(st, arg->v.Tuple.elts, 0))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1242 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1243 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1244
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1245 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1246 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1247
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1248 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1249 symtable_visit_arguments(struct symtable *st, arguments_ty a)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1250 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1251 /* skip default arguments inside function block
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1252 XXX should ast be different?
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1253 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1254 if (a->args && !symtable_visit_params(st, a->args, 1))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1255 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1256 if (a->vararg) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1257 if (!symtable_add_def(st, a->vararg, DEF_PARAM))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1258 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1259 st->st_cur->ste_varargs = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1260 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1261 if (a->kwarg) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1262 if (!symtable_add_def(st, a->kwarg, DEF_PARAM))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1263 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1264 st->st_cur->ste_varkeywords = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1265 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1266 if (a->args && !symtable_visit_params_nested(st, a->args))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1267 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1268 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1269 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1270
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1271
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1272 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1273 symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1274 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1275 if (eh->type)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1276 VISIT(st, expr, eh->type);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1277 if (eh->name)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1278 VISIT(st, expr, eh->name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1279 VISIT_SEQ(st, stmt, eh->body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1280 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1281 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1282
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1283
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1284 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1285 symtable_visit_alias(struct symtable *st, alias_ty a)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1286 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1287 /* Compute store_name, the name actually bound by the import
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1288 operation. It is diferent than a->name when a->name is a
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1289 dotted package name (e.g. spam.eggs)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1290 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1291 PyObject *store_name;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1292 PyObject *name = (a->asname == NULL) ? a->name : a->asname;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1293 const char *base = PyString_AS_STRING(name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1294 char *dot = strchr(base, '.');
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1295 if (dot)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1296 store_name = PyString_FromStringAndSize(base, dot - base);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1297 else {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1298 store_name = name;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1299 Py_INCREF(store_name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1300 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1301 if (strcmp(PyString_AS_STRING(name), "*")) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1302 int r = symtable_add_def(st, store_name, DEF_IMPORT);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1303 Py_DECREF(store_name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1304 return r;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1305 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1306 else {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1307 if (st->st_cur->ste_type != ModuleBlock) {
36089
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
1308 int lineno = st->st_cur->ste_lineno;
4aa01879a8f5 Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
1309 if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) {
35939
79374eb6db51 Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents: 35893
diff changeset
1310 Py_DECREF(store_name);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1311 return 0;
35939
79374eb6db51 Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents: 35893
diff changeset
1312 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1313 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1314 st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR;
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35880
diff changeset
1315 Py_DECREF(store_name);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1316 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1317 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1318 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1319
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1320
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1321 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1322 symtable_visit_comprehension(struct symtable *st, comprehension_ty lc)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1323 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1324 VISIT(st, expr, lc->target);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1325 VISIT(st, expr, lc->iter);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1326 VISIT_SEQ(st, expr, lc->ifs);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1327 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1328 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1329
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1330
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1331 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1332 symtable_visit_keyword(struct symtable *st, keyword_ty k)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1333 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1334 VISIT(st, expr, k->value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1335 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1336 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1337
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1338
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1339 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1340 symtable_visit_slice(struct symtable *st, slice_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1341 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1342 switch (s->kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1343 case Slice_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1344 if (s->v.Slice.lower)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1345 VISIT(st, expr, s->v.Slice.lower)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1346 if (s->v.Slice.upper)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1347 VISIT(st, expr, s->v.Slice.upper)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1348 if (s->v.Slice.step)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1349 VISIT(st, expr, s->v.Slice.step)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1350 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1351 case ExtSlice_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1352 VISIT_SEQ(st, slice, s->v.ExtSlice.dims)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1353 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1354 case Index_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1355 VISIT(st, expr, s->v.Index.value)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1356 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1357 case Ellipsis_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1358 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1359 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1360 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1361 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1362
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1363 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1364 symtable_visit_genexp(struct symtable *st, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1365 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1366 comprehension_ty outermost = ((comprehension_ty)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1367 (asdl_seq_GET(e->v.GeneratorExp.generators, 0)));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1368 /* Outermost iterator is evaluated in current scope */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1369 VISIT(st, expr, outermost->iter);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1370 /* Create generator scope for the rest */
35880
0d1e2e73c3ec Bring handling of genexpr in line with other anonymous scope names
Nick Coghlan <ncoghlan@gmail.com>
parents: 35863
diff changeset
1371 if (!symtable_enter_block(st, GET_IDENTIFIER(genexpr),
0d1e2e73c3ec Bring handling of genexpr in line with other anonymous scope names
Nick Coghlan <ncoghlan@gmail.com>
parents: 35863
diff changeset
1372 FunctionBlock, (void *)e, 0)) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1373 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1374 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1375 st->st_cur->ste_generator = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1376 /* Outermost iter is received as an argument */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1377 if (!symtable_implicit_arg(st, 0)) {
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1378 symtable_exit_block(st, (void *)e);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1379 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1380 }
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1381 VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1382 VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1383 VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1384 e->v.GeneratorExp.generators, 1, (void*)e);
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35793
diff changeset
1385 VISIT_IN_BLOCK(st, expr, e->v.GeneratorExp.elt, (void*)e);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1386 if (!symtable_exit_block(st, (void *)e))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1387 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1388 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 32121
diff changeset
1389 }