Mercurial > cpython-lru_cache-weakref
annotate Python/symtable.c @ 37756:7b2e436a4a21 legacy-trunk
Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
using a custom, nearly-identical macro. This probably changes how some of
these functions are compiled, which may result in fractionally slower (or
faster) execution. Considering the nature of traversal, visiting much of the
address space in unpredictable patterns, I'd argue the code readability and
maintainability is well worth it ;P
| author | Thomas Wouters <thomas@python.org> |
|---|---|
| date | Sat, 15 Apr 2006 21:47:09 +0000 |
| parents | 19d99b31555c |
| children | 5dfb21a37f19 |
| 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++) |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
230 if (!symtable_visit_stmt(st, |
|
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
231 (stmt_ty)asdl_seq_GET(seq, i))) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
232 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
233 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
234 case Expression_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
235 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
|
236 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
237 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
238 case Interactive_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
239 seq = mod->v.Interactive.body; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
240 for (i = 0; i < asdl_seq_LEN(seq); i++) |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
241 if (!symtable_visit_stmt(st, |
|
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
242 (stmt_ty)asdl_seq_GET(seq, i))) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
243 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
244 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
245 case Suite_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
246 PyErr_SetString(PyExc_RuntimeError, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
247 "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
|
248 goto error; |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
249 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
250 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
|
251 PySymtable_Free(st); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
252 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
253 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
254 if (symtable_analyze(st)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
255 return st; |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
256 PySymtable_Free(st); |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
257 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
258 error: |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
259 (void) symtable_exit_block(st, (void *)mod); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
260 PySymtable_Free(st); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
261 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
262 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
263 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
264 void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
265 PySymtable_Free(struct symtable *st) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
266 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
267 Py_XDECREF(st->st_symbols); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
268 Py_XDECREF(st->st_stack); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
269 PyMem_Free((void *)st); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
270 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
271 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
272 PySTEntryObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
273 PySymtable_Lookup(struct symtable *st, void *key) |
|
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 PyObject *k, *v; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
276 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
277 k = PyLong_FromVoidPtr(key); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
278 if (k == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
279 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
280 v = PyDict_GetItem(st->st_symbols, k); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
281 if (v) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
282 assert(PySTEntry_Check(v)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
283 Py_INCREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
284 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
285 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
286 PyErr_SetString(PyExc_KeyError, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
287 "unknown symbol table entry"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
288 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
289 |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
290 Py_DECREF(k); |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
291 return (PySTEntryObject *)v; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
292 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
293 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
294 int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
295 PyST_GetScope(PySTEntryObject *ste, PyObject *name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
296 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
297 PyObject *v = PyDict_GetItem(ste->ste_symbols, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
298 if (!v) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
299 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
300 assert(PyInt_Check(v)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
301 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
|
302 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
303 |
|
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 /* 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
|
306 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 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
|
311 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
312 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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 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
|
318 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
|
319 is treated as a local. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
320 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
321 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
|
322 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
|
323 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
|
324 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
|
325 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
326 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
|
327 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
|
328 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
|
329 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
|
330 using an updated set of name bindings. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
331 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
332 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
|
333 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
|
334 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
|
335 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
|
336 function returns to its parent. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
337 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
338 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
|
339 mapping strings to None. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
340 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
341 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
342 #define SET_SCOPE(DICT, NAME, I) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
343 PyObject *o = PyInt_FromLong(I); \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
344 if (!o) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
345 return 0; \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
346 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
|
347 Py_DECREF(o); \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
348 return 0; \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
349 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
350 Py_DECREF(o); \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
351 } |
|
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 /* Decide on scope of name, given flags. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
354 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
355 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
|
356 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
|
357 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
358 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
359 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
|
360 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
|
361 PyObject *bound, PyObject *local, PyObject *free, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
362 PyObject *global) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
363 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
364 if (flags & DEF_GLOBAL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
365 if (flags & DEF_PARAM) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
366 PyErr_Format(PyExc_SyntaxError, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
367 "name '%s' is local and global", |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
368 PyString_AS_STRING(name)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
369 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
370 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
371 SET_SCOPE(dict, name, GLOBAL_EXPLICIT); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
372 if (PyDict_SetItem(global, name, Py_None) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
373 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
374 if (bound && PyDict_GetItem(bound, name)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
375 if (PyDict_DelItem(bound, name) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
376 return 0; |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
379 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
380 if (flags & DEF_BOUND) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
381 SET_SCOPE(dict, name, LOCAL); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
382 if (PyDict_SetItem(local, name, Py_None) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
383 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
384 if (PyDict_GetItem(global, name)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
385 if (PyDict_DelItem(global, name) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
386 return 0; |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
389 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
390 /* 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
|
391 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
|
392 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
|
393 is nested. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
394 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
395 if (bound && PyDict_GetItem(bound, name)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
396 SET_SCOPE(dict, name, FREE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
397 ste->ste_free = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
398 if (PyDict_SetItem(free, name, Py_None) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
399 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
400 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
401 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
402 /* 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
|
403 explicit? It could also be global implicit. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
404 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
405 else if (global && PyDict_GetItem(global, name)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
406 SET_SCOPE(dict, name, GLOBAL_EXPLICIT); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
407 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
408 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
409 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
410 if (ste->ste_nested) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
411 ste->ste_free = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
412 SET_SCOPE(dict, name, GLOBAL_IMPLICIT); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
413 return 1; |
|
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 return 0; /* Can't get here */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
416 } |
|
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 #undef SET_SCOPE |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
419 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
420 /* 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
|
421 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
|
422 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
|
423 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
424 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
|
425 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
|
426 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
427 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
428 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
429 analyze_cells(PyObject *scope, PyObject *free) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
430 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
431 PyObject *name, *v, *w; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36240
diff
changeset
|
432 int success = 0; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36240
diff
changeset
|
433 Py_ssize_t pos = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
434 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
435 w = PyInt_FromLong(CELL); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
436 if (!w) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
437 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
438 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
|
439 long flags; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
440 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
|
441 flags = PyInt_AS_LONG(v); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
442 if (flags != LOCAL) |
|
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 if (!PyDict_GetItem(free, name)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
445 continue; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
446 /* 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
|
447 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
|
448 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
|
449 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
450 if (PyDict_SetItem(scope, name, w) < 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 if (!PyDict_DelItem(free, name) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
453 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
454 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
455 success = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
456 error: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
457 Py_DECREF(w); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
458 return success; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
459 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
460 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
461 /* Check for illegal statements in unoptimized namespaces */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
462 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
463 check_unoptimized(const PySTEntryObject* ste) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
464 char buf[300]; |
|
35759
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35742
diff
changeset
|
465 const char* trailer; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
466 |
|
35780
72cb041ccde3
Fix check_unoptimized() function. The only optimized namespaces are
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35779
diff
changeset
|
467 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
|
468 || !(ste->ste_free || ste->ste_child_free)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
469 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
470 |
|
35759
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35742
diff
changeset
|
471 trailer = (ste->ste_child_free ? |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
472 "contains a nested function with free variables" : |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
473 "is a nested function"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
474 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
475 switch (ste->ste_unoptimized) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
476 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
|
477 case OPT_EXEC: /* qualified exec is fine */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
478 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
479 case OPT_IMPORT_STAR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
480 PyOS_snprintf(buf, sizeof(buf), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
481 "import * is not allowed in function '%.100s' " |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
482 "because it is %s", |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
483 PyString_AS_STRING(ste->ste_name), trailer); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
484 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
485 case OPT_BARE_EXEC: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
486 PyOS_snprintf(buf, sizeof(buf), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
487 "unqualified exec is not allowed in function " |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
488 "'%.100s' it %s", |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
489 PyString_AS_STRING(ste->ste_name), trailer); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
490 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
491 default: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
492 PyOS_snprintf(buf, sizeof(buf), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
493 "function '%.100s' uses import * and bare exec, " |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
494 "which are illegal because it %s", |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
495 PyString_AS_STRING(ste->ste_name), trailer); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
496 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
497 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
498 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
499 PyErr_SetString(PyExc_SyntaxError, buf); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
500 PyErr_SyntaxLocation(ste->ste_table->st_filename, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
501 ste->ste_opt_lineno); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
502 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
503 } |
|
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 /* 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
|
506 * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
507 * 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
|
508 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
509 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
510 update_symbols(PyObject *symbols, PyObject *scope, |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
511 PyObject *bound, PyObject *free, int classflag) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
512 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
513 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
|
514 Py_ssize_t pos = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
515 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
516 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
|
517 long i, flags; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
518 assert(PyInt_Check(v)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
519 flags = PyInt_AS_LONG(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
520 w = PyDict_GetItem(scope, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
521 assert(w && PyInt_Check(w)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
522 i = PyInt_AS_LONG(w); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
523 flags |= (i << SCOPE_OFF); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
524 u = PyInt_FromLong(flags); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
525 if (PyDict_SetItem(symbols, name, u) < 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
526 Py_DECREF(u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
527 return 0; |
|
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 Py_DECREF(u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
530 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
531 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
532 free_value = PyInt_FromLong(FREE << SCOPE_OFF); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
533 if (!free_value) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
534 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
535 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
536 /* 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
|
537 pos = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
538 while (PyDict_Next(free, &pos, &name, &v)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
539 PyObject *o = PyDict_GetItem(symbols, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
540 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
541 if (o) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
542 /* 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
|
543 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
|
544 or global in the class scope. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
545 */ |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
546 if (classflag && |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
547 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
|
548 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
|
549 o = PyInt_FromLong(i); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
550 if (!o) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
551 Py_DECREF(free_value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
552 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
553 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
554 if (PyDict_SetItem(symbols, name, o) < 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
555 Py_DECREF(o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
556 Py_DECREF(free_value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
557 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
558 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
559 Py_DECREF(o); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
560 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
561 /* else it's not free, probably a cell */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
562 continue; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
563 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
564 if (!PyDict_GetItem(bound, name)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
565 continue; /* it's a global */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
566 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
567 if (PyDict_SetItem(symbols, name, free_value) < 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
568 Py_DECREF(free_value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
569 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
570 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
571 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
572 Py_DECREF(free_value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
573 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
574 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
575 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
576 /* 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
|
577 Arguments: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
578 ste -- current symtable entry (input/output) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
579 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
|
580 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
|
581 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
|
582 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
583 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
584 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
585 analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
586 PyObject *global) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
587 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
588 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
|
589 PyObject *newglobal = NULL, *newfree = NULL; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36240
diff
changeset
|
590 int i, success = 0; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36240
diff
changeset
|
591 Py_ssize_t pos = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
592 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
593 local = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
594 if (!local) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
595 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
596 scope = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
597 if (!scope) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
598 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
599 newglobal = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
600 if (!newglobal) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
601 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
602 newfree = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
603 if (!newfree) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
604 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
605 newbound = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
606 if (!newbound) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
607 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
608 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
609 if (ste->ste_type == ClassBlock) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
610 /* 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
|
611 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
|
612 on nested functions. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
613 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
614 if (PyDict_Update(newglobal, global) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
615 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
616 if (bound) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
617 if (PyDict_Update(newbound, bound) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
618 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
619 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
620 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
621 assert(PySTEntry_Check(ste)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
622 assert(PyDict_Check(ste->ste_symbols)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
623 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
|
624 long flags = PyInt_AS_LONG(v); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
625 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
|
626 global)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
627 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
628 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
629 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
630 if (ste->ste_type != ClassBlock) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
631 if (ste->ste_type == FunctionBlock) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
632 if (PyDict_Update(newbound, local) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
633 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
634 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
635 if (bound) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
636 if (PyDict_Update(newbound, bound) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
637 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
638 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
639 if (PyDict_Update(newglobal, global) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
640 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
641 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
642 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
643 /* Recursively call analyze_block() on each child block */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
644 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
|
645 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
|
646 PySTEntryObject* entry; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
647 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
|
648 entry = (PySTEntryObject*)c; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
649 if (!analyze_block(entry, newbound, newfree, newglobal)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
650 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
651 if (entry->ste_free || entry->ste_child_free) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
652 ste->ste_child_free = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
653 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
654 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
655 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
|
656 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
657 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
|
658 ste->ste_type == ClassBlock)) |
|
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 if (!check_unoptimized(ste)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
661 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
662 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
663 if (PyDict_Update(free, newfree) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
664 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
665 success = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
666 error: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
667 Py_XDECREF(local); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
668 Py_XDECREF(scope); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
669 Py_XDECREF(newbound); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
670 Py_XDECREF(newglobal); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
671 Py_XDECREF(newfree); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
672 if (!success) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
673 assert(PyErr_Occurred()); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
674 return success; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
675 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
676 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
677 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
678 symtable_analyze(struct symtable *st) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
679 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
680 PyObject *free, *global; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
681 int r; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
682 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
683 free = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
684 if (!free) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
685 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
686 global = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
687 if (!global) { |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
688 Py_DECREF(free); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
689 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
690 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
691 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
|
692 Py_DECREF(free); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
693 Py_DECREF(global); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
694 return r; |
|
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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
697 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
698 static int |
|
36089
4aa01879a8f5
Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
699 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
|
700 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
701 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
|
702 lineno, NULL, NULL) < 0) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
703 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
704 PyErr_SetString(PyExc_SyntaxError, msg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
705 PyErr_SyntaxLocation(st->st_filename, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
706 st->st_cur->ste_lineno); |
|
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 0; |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
711 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
712 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
713 /* 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
|
714 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
|
715 in symtable_exit_block(). |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
716 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
717 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
718 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
719 symtable_exit_block(struct symtable *st, void *ast) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
720 { |
|
36521
30aef3ce2b26
Use Py_ssize_t to count the
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
721 Py_ssize_t end; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
722 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
723 Py_DECREF(st->st_cur); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
724 end = PyList_GET_SIZE(st->st_stack) - 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
725 if (end >= 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
726 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
|
727 end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
728 Py_INCREF(st->st_cur); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
729 if (PySequence_DelItem(st->st_stack, end) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
730 return 0; |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
733 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
734 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
735 static int |
|
35793
914ec0afa51c
Do not pollute name block_ty, prefix with _Py_
Neal Norwitz <nnorwitz@gmail.com>
parents:
35780
diff
changeset
|
736 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
|
737 void *ast, int lineno) |
|
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 PySTEntryObject *prev = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
740 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
741 if (st->st_cur) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
742 prev = st->st_cur; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
743 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
|
744 return 0; |
|
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 Py_DECREF(st->st_cur); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
747 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
748 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
|
749 if (name == GET_IDENTIFIER(top)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
750 st->st_global = st->st_cur->ste_symbols; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
751 if (prev) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
752 if (PyList_Append(prev->ste_children, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
753 (PyObject *)st->st_cur) < 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
754 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
755 } |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
758 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
759 |
|
36231
d3f4c467e439
Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents:
36226
diff
changeset
|
760 static long |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
761 symtable_lookup(struct symtable *st, PyObject *name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
762 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
763 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
|
764 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
|
765 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
|
766 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
|
767 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
|
768 Py_DECREF(mangled); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
769 if (!o) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
770 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
771 return PyInt_AsLong(o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
772 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
773 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
774 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
775 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
|
776 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
777 PyObject *o; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
778 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
|
779 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
|
780 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
|
781 |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35766
diff
changeset
|
782 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
|
783 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
784 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
|
785 if ((o = PyDict_GetItem(dict, mangled))) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
786 val = PyInt_AS_LONG(o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
787 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
|
788 /* 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
|
789 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
790 PyString_AsString(name)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
791 PyErr_SyntaxLocation(st->st_filename, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
792 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
|
793 goto error; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
794 } |
|
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 } else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
797 val = flag; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
798 o = PyInt_FromLong(val); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
799 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
|
800 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
|
801 if (PyDict_SetItem(dict, mangled, o) < 0) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
802 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
|
803 goto error; |
|
35742
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 Py_DECREF(o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
806 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
807 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
|
808 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
|
809 goto error; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
810 } else if (flag & DEF_GLOBAL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
811 /* 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
|
812 perhaps only DEF_FREE_GLOBAL */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
813 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
|
814 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
|
815 val |= PyInt_AS_LONG(o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
816 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
817 o = PyInt_FromLong(val); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
818 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
|
819 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
|
820 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
|
821 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
|
822 goto error; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
823 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
824 Py_DECREF(o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
825 } |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35880
diff
changeset
|
826 Py_DECREF(mangled); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
827 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
|
828 |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35766
diff
changeset
|
829 error: |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35766
diff
changeset
|
830 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
|
831 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
832 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
833 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
834 /* 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
|
835 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
|
836 function. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
837 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
838 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
|
839 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
|
840 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
841 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
842 #define VISIT(ST, TYPE, V) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
843 if (!symtable_visit_ ## TYPE((ST), (V))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
844 return 0; |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
845 |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
846 #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
|
847 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
|
848 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
|
849 return 0; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
850 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
851 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
852 #define VISIT_SEQ(ST, TYPE, SEQ) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
853 int i; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
854 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
855 for (i = 0; i < asdl_seq_LEN(seq); i++) { \ |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
856 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
857 if (!symtable_visit_ ## TYPE((ST), elt)) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
858 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
859 } \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
860 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
861 |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
862 #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
|
863 int i; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
864 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
|
865 for (i = 0; i < asdl_seq_LEN(seq); i++) { \ |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
866 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
867 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
|
868 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
|
869 return 0; \ |
|
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 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
872 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
873 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
874 #define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
875 int i; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
876 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
877 for (i = (START); i < asdl_seq_LEN(seq); i++) { \ |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
878 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
879 if (!symtable_visit_ ## TYPE((ST), elt)) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
880 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
881 } \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
882 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
883 |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
884 #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
|
885 int i; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
886 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
|
887 for (i = (START); i < asdl_seq_LEN(seq); i++) { \ |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
888 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
889 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
|
890 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
|
891 return 0; \ |
|
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 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
894 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
895 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
896 static int |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
897 symtable_new_tmpname(struct symtable *st) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
898 { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
899 char tmpname[256]; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
900 identifier tmp; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
901 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
902 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
903 ++st->st_cur->ste_tmpname); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
904 tmp = PyString_InternFromString(tmpname); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
905 if (!symtable_add_def(st, tmp, DEF_LOCAL)) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
906 return 0; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
907 Py_DECREF(tmp); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
908 return 1; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
909 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
910 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
911 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
912 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
|
913 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
914 switch (s->kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
915 case FunctionDef_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
916 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
|
917 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
918 if (s->v.FunctionDef.args->defaults) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
919 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
|
920 if (s->v.FunctionDef.decorators) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
921 VISIT_SEQ(st, expr, s->v.FunctionDef.decorators); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
922 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
|
923 FunctionBlock, (void *)s, s->lineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
924 return 0; |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
925 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
|
926 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
|
927 if (!symtable_exit_block(st, s)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
928 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
929 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
|
930 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
|
931 PyObject *tmp; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
932 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
|
933 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
934 VISIT_SEQ(st, expr, s->v.ClassDef.bases); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
935 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
|
936 (void *)s, s->lineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
937 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
|
938 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
|
939 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
|
940 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
|
941 st->st_private = tmp; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
942 if (!symtable_exit_block(st, s)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
943 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
944 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
|
945 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
946 case Return_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
947 if (s->v.Return.value) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
948 VISIT(st, expr, s->v.Return.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
949 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
950 case Delete_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
951 VISIT_SEQ(st, expr, s->v.Delete.targets); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
952 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
953 case Assign_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
954 VISIT_SEQ(st, expr, s->v.Assign.targets); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
955 VISIT(st, expr, s->v.Assign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
956 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
957 case AugAssign_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
958 VISIT(st, expr, s->v.AugAssign.target); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
959 VISIT(st, expr, s->v.AugAssign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
960 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
961 case Print_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
962 if (s->v.Print.dest) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
963 VISIT(st, expr, s->v.Print.dest); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
964 VISIT_SEQ(st, expr, s->v.Print.values); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
965 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
966 case For_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
967 VISIT(st, expr, s->v.For.target); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
968 VISIT(st, expr, s->v.For.iter); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
969 VISIT_SEQ(st, stmt, s->v.For.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
970 if (s->v.For.orelse) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
971 VISIT_SEQ(st, stmt, s->v.For.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
972 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
973 case While_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
974 VISIT(st, expr, s->v.While.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
975 VISIT_SEQ(st, stmt, s->v.While.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
976 if (s->v.While.orelse) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
977 VISIT_SEQ(st, stmt, s->v.While.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
978 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
979 case If_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
980 /* XXX if 0: and lookup_yield() hacks */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
981 VISIT(st, expr, s->v.If.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
982 VISIT_SEQ(st, stmt, s->v.If.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
983 if (s->v.If.orelse) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
984 VISIT_SEQ(st, stmt, s->v.If.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
985 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
986 case Raise_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
987 if (s->v.Raise.type) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
988 VISIT(st, expr, s->v.Raise.type); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
989 if (s->v.Raise.inst) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
990 VISIT(st, expr, s->v.Raise.inst); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
991 if (s->v.Raise.tback) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
992 VISIT(st, expr, s->v.Raise.tback); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
993 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
994 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
995 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
996 case TryExcept_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
997 VISIT_SEQ(st, stmt, s->v.TryExcept.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
998 VISIT_SEQ(st, stmt, s->v.TryExcept.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
999 VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1000 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1001 case TryFinally_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1002 VISIT_SEQ(st, stmt, s->v.TryFinally.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1003 VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1004 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1005 case Assert_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1006 VISIT(st, expr, s->v.Assert.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1007 if (s->v.Assert.msg) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1008 VISIT(st, expr, s->v.Assert.msg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1009 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1010 case Import_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1011 VISIT_SEQ(st, alias, s->v.Import.names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1012 /* XXX Don't have the lineno available inside |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1013 visit_alias */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1014 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
|
1015 st->st_cur->ste_opt_lineno = s->lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1016 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1017 case ImportFrom_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1018 VISIT_SEQ(st, alias, s->v.ImportFrom.names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1019 /* XXX Don't have the lineno available inside |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1020 visit_alias */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1021 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
|
1022 st->st_cur->ste_opt_lineno = s->lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1023 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1024 case Exec_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1025 VISIT(st, expr, s->v.Exec.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1026 if (!st->st_cur->ste_opt_lineno) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1027 st->st_cur->ste_opt_lineno = s->lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1028 if (s->v.Exec.globals) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1029 st->st_cur->ste_unoptimized |= OPT_EXEC; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1030 VISIT(st, expr, s->v.Exec.globals); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1031 if (s->v.Exec.locals) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1032 VISIT(st, expr, s->v.Exec.locals); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1033 } else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1034 st->st_cur->ste_unoptimized |= OPT_BARE_EXEC; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1035 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1036 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1037 case Global_kind: { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1038 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1039 asdl_seq *seq = s->v.Global.names; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1040 for (i = 0; i < asdl_seq_LEN(seq); i++) { |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
1041 identifier name = (identifier)asdl_seq_GET(seq, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1042 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
|
1043 long cur = symtable_lookup(st, name); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1044 if (cur < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1045 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1046 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
|
1047 char buf[256]; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1048 if (cur & DEF_LOCAL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1049 PyOS_snprintf(buf, sizeof(buf), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1050 GLOBAL_AFTER_ASSIGN, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1051 c_name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1052 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1053 PyOS_snprintf(buf, sizeof(buf), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1054 GLOBAL_AFTER_USE, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1055 c_name); |
|
36089
4aa01879a8f5
Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
1056 if (!symtable_warn(st, buf, s->lineno)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1057 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1058 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1059 if (!symtable_add_def(st, name, DEF_GLOBAL)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1060 return 0; |
|
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 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1063 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1064 case Expr_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1065 VISIT(st, expr, s->v.Expr.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1066 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1067 case Pass_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1068 case Break_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1069 case Continue_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1070 /* nothing to do here */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1071 break; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1072 case With_kind: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1073 if (!symtable_new_tmpname(st)) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1074 return 0; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1075 VISIT(st, expr, s->v.With.context_expr); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1076 if (s->v.With.optional_vars) { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1077 if (!symtable_new_tmpname(st)) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1078 return 0; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1079 VISIT(st, expr, s->v.With.optional_vars); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1080 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1081 VISIT_SEQ(st, stmt, s->v.With.body); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1082 break; |
|
35742
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1085 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1086 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1087 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1088 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
|
1089 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1090 switch (e->kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1091 case BoolOp_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1092 VISIT_SEQ(st, expr, e->v.BoolOp.values); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1093 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1094 case BinOp_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1095 VISIT(st, expr, e->v.BinOp.left); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1096 VISIT(st, expr, e->v.BinOp.right); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1097 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1098 case UnaryOp_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1099 VISIT(st, expr, e->v.UnaryOp.operand); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1100 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1101 case Lambda_kind: { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1102 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
|
1103 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1104 if (e->v.Lambda.args->defaults) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1105 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
|
1106 /* XXX how to get line numbers for expressions */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1107 if (!symtable_enter_block(st, GET_IDENTIFIER(lambda), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1108 FunctionBlock, (void *)e, 0)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1109 return 0; |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
1110 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
|
1111 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
|
1112 if (!symtable_exit_block(st, (void *)e)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1113 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1114 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1115 } |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36521
diff
changeset
|
1116 case IfExp_kind: |
|
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.test); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36521
diff
changeset
|
1118 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
|
1119 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
|
1120 break; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1121 case Dict_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1122 VISIT_SEQ(st, expr, e->v.Dict.keys); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1123 VISIT_SEQ(st, expr, e->v.Dict.values); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1124 break; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1125 case ListComp_kind: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1126 if (!symtable_new_tmpname(st)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1127 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1128 VISIT(st, expr, e->v.ListComp.elt); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1129 VISIT_SEQ(st, comprehension, e->v.ListComp.generators); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1130 break; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1131 case GeneratorExp_kind: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1132 if (!symtable_visit_genexp(st, e)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1133 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1134 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1135 case Yield_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1136 if (e->v.Yield.value) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1137 VISIT(st, expr, e->v.Yield.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1138 st->st_cur->ste_generator = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1139 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1140 case Compare_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1141 VISIT(st, expr, e->v.Compare.left); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1142 VISIT_SEQ(st, expr, e->v.Compare.comparators); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1143 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1144 case Call_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1145 VISIT(st, expr, e->v.Call.func); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1146 VISIT_SEQ(st, expr, e->v.Call.args); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1147 VISIT_SEQ(st, keyword, e->v.Call.keywords); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1148 if (e->v.Call.starargs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1149 VISIT(st, expr, e->v.Call.starargs); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1150 if (e->v.Call.kwargs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1151 VISIT(st, expr, e->v.Call.kwargs); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1152 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1153 case Repr_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1154 VISIT(st, expr, e->v.Repr.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1155 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1156 case Num_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1157 case Str_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1158 /* Nothing to do here. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1159 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1160 /* The following exprs can be assignment targets. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1161 case Attribute_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1162 VISIT(st, expr, e->v.Attribute.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1163 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1164 case Subscript_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1165 VISIT(st, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1166 VISIT(st, slice, e->v.Subscript.slice); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1167 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1168 case Name_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1169 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
|
1170 e->v.Name.ctx == Load ? USE : DEF_LOCAL)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1171 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1172 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1173 /* 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
|
1174 case List_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1175 VISIT_SEQ(st, expr, e->v.List.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1176 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1177 case Tuple_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1178 VISIT_SEQ(st, expr, e->v.Tuple.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1179 break; |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1182 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1183 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1184 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1185 symtable_implicit_arg(struct symtable *st, int pos) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1186 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1187 PyObject *id = PyString_FromFormat(".%d", pos); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1188 if (id == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1189 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1190 if (!symtable_add_def(st, id, DEF_PARAM)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1191 Py_DECREF(id); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1192 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1193 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1194 Py_DECREF(id); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1195 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1196 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1197 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1198 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1199 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
|
1200 { |
|
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
|
1201 int i; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1202 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1203 /* go through all the toplevel arguments first */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1204 for (i = 0; i < asdl_seq_LEN(args); i++) { |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
1205 expr_ty arg = (expr_ty)asdl_seq_GET(args, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1206 if (arg->kind == Name_kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1207 assert(arg->v.Name.ctx == Param || |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1208 (arg->v.Name.ctx == Store && !toplevel)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1209 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
|
1210 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1211 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1212 else if (arg->kind == Tuple_kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1213 assert(arg->v.Tuple.ctx == Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1214 if (toplevel) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1215 if (!symtable_implicit_arg(st, i)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1216 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1217 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1218 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1219 else { |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35880
diff
changeset
|
1220 PyErr_SetString(PyExc_SyntaxError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35880
diff
changeset
|
1221 "invalid expression in parameter list"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35880
diff
changeset
|
1222 PyErr_SyntaxLocation(st->st_filename, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35880
diff
changeset
|
1223 st->st_cur->ste_lineno); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1224 return 0; |
|
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 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1227 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1228 if (!toplevel) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1229 if (!symtable_visit_params_nested(st, args)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1230 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1231 } |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1234 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1235 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1236 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1237 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
|
1238 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1239 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1240 for (i = 0; i < asdl_seq_LEN(args); i++) { |
|
37615
19d99b31555c
Make symtable.c safe for C++ compilers. Changed macros in the same way as
Anthony Baxter <anthonybaxter@gmail.com>
parents:
36739
diff
changeset
|
1241 expr_ty arg = (expr_ty)asdl_seq_GET(args, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1242 if (arg->kind == Tuple_kind && |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1243 !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
|
1244 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1245 } |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1248 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1249 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1250 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1251 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
|
1252 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1253 /* skip default arguments inside function block |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1254 XXX should ast be different? |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1255 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1256 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
|
1257 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1258 if (a->vararg) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1259 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
|
1260 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1261 st->st_cur->ste_varargs = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1262 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1263 if (a->kwarg) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1264 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
|
1265 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1266 st->st_cur->ste_varkeywords = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1267 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1268 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
|
1269 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1270 return 1; |
|
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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1273 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1274 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1275 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
|
1276 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1277 if (eh->type) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1278 VISIT(st, expr, eh->type); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1279 if (eh->name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1280 VISIT(st, expr, eh->name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1281 VISIT_SEQ(st, stmt, eh->body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1282 return 1; |
|
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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1285 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1286 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1287 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
|
1288 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1289 /* 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
|
1290 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
|
1291 dotted package name (e.g. spam.eggs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1292 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1293 PyObject *store_name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1294 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
|
1295 const char *base = PyString_AS_STRING(name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1296 char *dot = strchr(base, '.'); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1297 if (dot) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1298 store_name = PyString_FromStringAndSize(base, dot - base); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1299 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1300 store_name = name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1301 Py_INCREF(store_name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1302 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1303 if (strcmp(PyString_AS_STRING(name), "*")) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1304 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
|
1305 Py_DECREF(store_name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1306 return r; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1307 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1308 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1309 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
|
1310 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
|
1311 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
|
1312 Py_DECREF(store_name); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1313 return 0; |
|
35939
79374eb6db51
Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents:
35893
diff
changeset
|
1314 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1315 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1316 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
|
1317 Py_DECREF(store_name); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1318 return 1; |
|
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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1322 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1323 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1324 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
|
1325 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1326 VISIT(st, expr, lc->target); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1327 VISIT(st, expr, lc->iter); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1328 VISIT_SEQ(st, expr, lc->ifs); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1329 return 1; |
|
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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1332 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1333 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1334 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
|
1335 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1336 VISIT(st, expr, k->value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1337 return 1; |
|
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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1340 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1341 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1342 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
|
1343 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1344 switch (s->kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1345 case Slice_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1346 if (s->v.Slice.lower) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1347 VISIT(st, expr, s->v.Slice.lower) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1348 if (s->v.Slice.upper) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1349 VISIT(st, expr, s->v.Slice.upper) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1350 if (s->v.Slice.step) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1351 VISIT(st, expr, s->v.Slice.step) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1352 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1353 case ExtSlice_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1354 VISIT_SEQ(st, slice, s->v.ExtSlice.dims) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1355 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1356 case Index_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1357 VISIT(st, expr, s->v.Index.value) |
|
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 case Ellipsis_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1360 break; |
|
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 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1363 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1364 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1365 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1366 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
|
1367 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1368 comprehension_ty outermost = ((comprehension_ty) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1369 (asdl_seq_GET(e->v.GeneratorExp.generators, 0))); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1370 /* Outermost iterator is evaluated in current scope */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1371 VISIT(st, expr, outermost->iter); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1372 /* 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
|
1373 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
|
1374 FunctionBlock, (void *)e, 0)) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1375 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1376 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1377 st->st_cur->ste_generator = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1378 /* Outermost iter is received as an argument */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1379 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
|
1380 symtable_exit_block(st, (void *)e); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1381 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1382 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
1383 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
|
1384 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
|
1385 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
|
1386 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
|
1387 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
|
1388 if (!symtable_exit_block(st, (void *)e)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1389 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1390 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1391 } |
