Mercurial > cpython-lru_cache-weakref
annotate Python/symtable.c @ 78944:61446e56f683 2.7
Closed reference leak of variable 'k' in function ste_new which wasn't decrefed in error cases
| author | Christian Heimes <christian@cheimes.de> |
|---|---|
| date | Mon, 10 Sep 2012 03:08:46 +0200 |
| parents | b36cb4602e21 |
| children | f19b84915c17 |
| 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 |
|
38588
5dfb21a37f19
Patch #1346214: correctly optimize away "if 0"-style stmts
Georg Brandl <georg@python.org>
parents:
37615
diff
changeset
|
16 #define RETURN_VAL_IN_GENERATOR \ |
|
5dfb21a37f19
Patch #1346214: correctly optimize away "if 0"-style stmts
Georg Brandl <georg@python.org>
parents:
37615
diff
changeset
|
17 "'return' with argument inside generator" |
|
36089
4aa01879a8f5
Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
18 |
|
48253
9de68ad86078
PySTEntry's constructor is static; there's no point in a fancy API name
Benjamin Peterson <benjamin@python.org>
parents:
48251
diff
changeset
|
19 |
|
36739
796d150e45a9
No need to export PySTEntry_New, it is only used in symtable.c
Neal Norwitz <nnorwitz@gmail.com>
parents:
36695
diff
changeset
|
20 static PySTEntryObject * |
|
48253
9de68ad86078
PySTEntry's constructor is static; there's no point in a fancy API name
Benjamin Peterson <benjamin@python.org>
parents:
48251
diff
changeset
|
21 ste_new(struct symtable *st, identifier name, _Py_block_ty block, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
22 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
|
23 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
24 PySTEntryObject *ste = NULL; |
|
78944
61446e56f683
Closed reference leak of variable 'k' in function ste_new which wasn't decrefed in error cases
Christian Heimes <christian@cheimes.de>
parents:
68256
diff
changeset
|
25 PyObject *k = NULL; |
|
16539
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
26 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
27 k = PyLong_FromVoidPtr(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
28 if (k == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
29 goto fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
30 ste = PyObject_New(PySTEntryObject, &PySTEntry_Type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
31 if (ste == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
32 goto fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
33 ste->ste_table = st; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
34 ste->ste_id = k; |
|
16539
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
35 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
36 ste->ste_name = name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
37 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
|
38 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
39 ste->ste_symbols = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
40 ste->ste_varnames = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
41 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
|
42 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
43 ste->ste_symbols = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
44 if (ste->ste_symbols == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
45 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
|
46 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
47 ste->ste_varnames = PyList_New(0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
48 if (ste->ste_varnames == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
49 goto fail; |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
50 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
51 ste->ste_children = PyList_New(0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
52 if (ste->ste_children == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
53 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
|
54 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
55 ste->ste_type = block; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
56 ste->ste_unoptimized = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
57 ste->ste_nested = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
58 ste->ste_free = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
59 ste->ste_varargs = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
60 ste->ste_varkeywords = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
61 ste->ste_opt_lineno = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
62 ste->ste_tmpname = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
63 ste->ste_lineno = lineno; |
|
16539
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
64 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
65 if (st->st_cur != NULL && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
66 (st->st_cur->ste_nested || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
67 st->st_cur->ste_type == FunctionBlock)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
68 ste->ste_nested = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
69 ste->ste_child_free = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
70 ste->ste_generator = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
71 ste->ste_returns_value = 0; |
|
16539
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
72 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
73 if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
74 goto fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
75 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
76 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
|
77 fail: |
|
78944
61446e56f683
Closed reference leak of variable 'k' in function ste_new which wasn't decrefed in error cases
Christian Heimes <christian@cheimes.de>
parents:
68256
diff
changeset
|
78 Py_XDECREF(k); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
79 Py_XDECREF(ste); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
80 return NULL; |
|
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 |
|
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
83 static PyObject * |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
84 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
|
85 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
86 char buf[256]; |
|
16539
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
87 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
88 PyOS_snprintf(buf, sizeof(buf), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
89 "<symtable entry %.100s(%ld), line %d>", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
90 PyString_AS_STRING(ste->ste_name), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
91 PyInt_AS_LONG(ste->ste_id), ste->ste_lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
92 return PyString_FromString(buf); |
|
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 |
|
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
95 static void |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
96 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
|
97 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
98 ste->ste_table = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
99 Py_XDECREF(ste->ste_id); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
100 Py_XDECREF(ste->ste_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
101 Py_XDECREF(ste->ste_symbols); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
102 Py_XDECREF(ste->ste_varnames); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
103 Py_XDECREF(ste->ste_children); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
104 PyObject_Del(ste); |
|
16539
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
105 } |
|
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
106 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
107 #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
|
108 |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
18148
diff
changeset
|
109 static PyMemberDef ste_memberlist[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
110 {"id", T_OBJECT, OFF(ste_id), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
111 {"name", T_OBJECT, OFF(ste_name), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
112 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
113 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
114 {"children", T_OBJECT, OFF(ste_children), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
115 {"optimized",T_INT, OFF(ste_unoptimized), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
116 {"nested", T_INT, OFF(ste_nested), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
117 {"type", T_INT, OFF(ste_type), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
118 {"lineno", T_INT, OFF(ste_lineno), READONLY}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
119 {NULL} |
|
16539
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
120 }; |
|
a47d93ef103a
Relax the rules for using 'from ... import *' and exec in the presence
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
121 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
122 PyTypeObject PySTEntry_Type = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
123 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
124 "symtable entry", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
125 sizeof(PySTEntryObject), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
126 0, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
127 (destructor)ste_dealloc, /* tp_dealloc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
128 0, /* tp_print */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
129 0, /* tp_getattr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
130 0, /* tp_setattr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
131 0, /* tp_compare */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
132 (reprfunc)ste_repr, /* tp_repr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
133 0, /* tp_as_number */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
134 0, /* tp_as_sequence */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
135 0, /* tp_as_mapping */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
136 0, /* tp_hash */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
137 0, /* tp_call */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
138 0, /* tp_str */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
139 PyObject_GenericGetAttr, /* tp_getattro */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
140 0, /* tp_setattro */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
141 0, /* tp_as_buffer */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
142 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
143 0, /* tp_doc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
144 0, /* tp_traverse */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
145 0, /* tp_clear */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
146 0, /* tp_richcompare */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
147 0, /* tp_weaklistoffset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
148 0, /* tp_iter */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
149 0, /* tp_iternext */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
150 0, /* tp_methods */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
151 ste_memberlist, /* tp_members */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
152 0, /* tp_getset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
153 0, /* tp_base */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
154 0, /* tp_dict */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
155 0, /* tp_descr_get */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
156 0, /* tp_descr_set */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
157 0, /* tp_dictoffset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
158 0, /* tp_init */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
159 0, /* tp_alloc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
160 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
|
161 }; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
162 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
163 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
|
164 static int symtable_warn(struct symtable *st, char *msg, int lineno); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
165 static int symtable_enter_block(struct symtable *st, identifier name, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
166 _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
|
167 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
|
168 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
|
169 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
|
170 static int symtable_visit_genexp(struct symtable *st, expr_ty s); |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
171 static int symtable_visit_setcomp(struct symtable *st, expr_ty e); |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
172 static int symtable_visit_dictcomp(struct symtable *st, expr_ty e); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
173 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
|
174 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
|
175 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
|
176 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
|
177 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
|
178 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
|
179 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
|
180 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
|
181 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
|
182 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
183 |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
184 static identifier top = NULL, lambda = NULL, genexpr = NULL, setcomp = NULL, |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
185 dictcomp = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
186 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
187 #define GET_IDENTIFIER(VAR) \ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
188 ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR))) |
|
35742
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 #define DUPLICATE_ARGUMENT \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
191 "duplicate argument '%s' in function definition" |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
192 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
193 static struct symtable * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
194 symtable_new(void) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
195 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
196 struct symtable *st; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
197 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
198 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
199 if (st == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
200 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
201 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
202 st->st_filename = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
203 st->st_symbols = NULL; |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
204 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
205 if ((st->st_stack = PyList_New(0)) == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
206 goto fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
207 if ((st->st_symbols = PyDict_New()) == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
208 goto fail; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
209 st->st_cur = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
210 st->st_private = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
211 return st; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
212 fail: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
213 PySymtable_Free(st); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
214 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
215 } |
|
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 struct symtable * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
218 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
|
219 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
220 struct symtable *st = symtable_new(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
221 asdl_seq *seq; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
222 int i; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
223 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
224 if (st == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
225 return st; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
226 st->st_filename = filename; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
227 st->st_future = future; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
228 if (!GET_IDENTIFIER(top) || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
229 !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
230 PySymtable_Free(st); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
231 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
232 } |
|
39131
7c09b66f04bd
Handle more memory allocation failures without crashing.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38588
diff
changeset
|
233 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
234 st->st_top = st->st_cur; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
235 st->st_cur->ste_unoptimized = OPT_TOPLEVEL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
236 /* Any other top-level initialization? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
237 switch (mod->kind) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
238 case Module_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
239 seq = mod->v.Module.body; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
240 for (i = 0; i < asdl_seq_LEN(seq); i++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
241 if (!symtable_visit_stmt(st, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
242 (stmt_ty)asdl_seq_GET(seq, i))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
243 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
244 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
245 case Expression_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
246 if (!symtable_visit_expr(st, mod->v.Expression.body)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
247 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
248 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
249 case Interactive_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
250 seq = mod->v.Interactive.body; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
251 for (i = 0; i < asdl_seq_LEN(seq); i++) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
252 if (!symtable_visit_stmt(st, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
253 (stmt_ty)asdl_seq_GET(seq, i))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
254 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
255 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
256 case Suite_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
257 PyErr_SetString(PyExc_RuntimeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
258 "this compiler does not handle Suites"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
259 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
260 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
261 if (!symtable_exit_block(st, (void *)mod)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
262 PySymtable_Free(st); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
263 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
264 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
265 if (symtable_analyze(st)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
266 return st; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
267 PySymtable_Free(st); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
268 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
269 error: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
270 (void) symtable_exit_block(st, (void *)mod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
271 PySymtable_Free(st); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
272 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
273 } |
|
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 void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
276 PySymtable_Free(struct symtable *st) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
277 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
278 Py_XDECREF(st->st_symbols); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
279 Py_XDECREF(st->st_stack); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
280 PyMem_Free((void *)st); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
281 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
282 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
283 PySTEntryObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
284 PySymtable_Lookup(struct symtable *st, void *key) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
285 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
286 PyObject *k, *v; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
287 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
288 k = PyLong_FromVoidPtr(key); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
289 if (k == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
290 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
291 v = PyDict_GetItem(st->st_symbols, k); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
292 if (v) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
293 assert(PySTEntry_Check(v)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
294 Py_INCREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
295 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
296 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
297 PyErr_SetString(PyExc_KeyError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
298 "unknown symbol table entry"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
299 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
300 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
301 Py_DECREF(k); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
302 return (PySTEntryObject *)v; |
|
35742
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 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
305 int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
306 PyST_GetScope(PySTEntryObject *ste, PyObject *name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
307 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
308 PyObject *v = PyDict_GetItem(ste->ste_symbols, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
309 if (!v) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
310 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
311 assert(PyInt_Check(v)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
312 return (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
313 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
314 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
315 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
316 /* 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
|
317 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
318 The next several functions are helpers for PySymtable_Analyze(), |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
319 which determines whether a name is local, global, or free. In addition, |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
320 it determines which local variables are cell variables; they provide |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
321 bindings that are used for free variables in enclosed blocks. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
322 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
323 There are also two kinds of free variables, implicit and explicit. An |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
324 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
|
325 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
|
326 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
|
327 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
|
328 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
|
329 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
|
330 is treated as a local. |
|
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 symbol table requires two passes to determine the scope of each name. |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
333 The first pass collects raw facts from the AST: the name is a parameter |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
334 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
|
335 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
|
336 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
337 When a function is entered during the second pass, the parent passes |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
338 the set of all name bindings visible to its children. These bindings |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
339 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
|
340 After doing the local analysis, it analyzes each of its child blocks |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
341 using an updated set of name bindings. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
342 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
343 The children update the free variable set. If a local variable is free |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
344 in a child, the variable is marked as a cell. The current function must |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
345 provide runtime storage for the variable that may outlive the function's |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
346 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
|
347 function returns to its parent. |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
348 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
349 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
|
350 mapping strings to None. |
|
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 #define SET_SCOPE(DICT, NAME, I) { \ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
354 PyObject *o = PyInt_FromLong(I); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
355 if (!o) \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
356 return 0; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
357 if (PyDict_SetItem((DICT), (NAME), o) < 0) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
358 Py_DECREF(o); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
359 return 0; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
360 } \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
361 Py_DECREF(o); \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
362 } |
|
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 /* Decide on scope of name, given flags. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
365 |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
366 The namespace dictionaries may be modified to record information |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
367 about the new name. For example, a new global will add an entry to |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
368 global. A name that was global can be changed to local. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
369 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
370 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
371 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
|
372 analyze_name(PySTEntryObject *ste, PyObject *dict, PyObject *name, long flags, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
373 PyObject *bound, PyObject *local, PyObject *free, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
374 PyObject *global) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
375 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
376 if (flags & DEF_GLOBAL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
377 if (flags & DEF_PARAM) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
378 PyErr_Format(PyExc_SyntaxError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
379 "name '%s' is local and global", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
380 PyString_AS_STRING(name)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
381 PyErr_SyntaxLocation(ste->ste_table->st_filename, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
382 ste->ste_lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
383 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
384 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
385 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
386 SET_SCOPE(dict, name, GLOBAL_EXPLICIT); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
387 if (PyDict_SetItem(global, name, Py_None) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
388 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
389 if (bound && PyDict_GetItem(bound, name)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
390 if (PyDict_DelItem(bound, name) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
391 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
392 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
393 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
394 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
395 if (flags & DEF_BOUND) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
396 SET_SCOPE(dict, name, LOCAL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
397 if (PyDict_SetItem(local, name, Py_None) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
398 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
399 if (PyDict_GetItem(global, name)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
400 if (PyDict_DelItem(global, name) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
401 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
402 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
403 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
404 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
405 /* If an enclosing block has a binding for this name, it |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
406 is a free variable rather than a global variable. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
407 Note that having a non-NULL bound implies that the block |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
408 is nested. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
409 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
410 if (bound && PyDict_GetItem(bound, name)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
411 SET_SCOPE(dict, name, FREE); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
412 ste->ste_free = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
413 if (PyDict_SetItem(free, name, Py_None) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
414 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
415 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
416 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
417 /* If a parent has a global statement, then call it global |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
418 explicit? It could also be global implicit. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
419 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
420 else if (global && PyDict_GetItem(global, name)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
421 SET_SCOPE(dict, name, GLOBAL_IMPLICIT); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
422 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
423 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
424 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
425 if (ste->ste_nested) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
426 ste->ste_free = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
427 SET_SCOPE(dict, name, GLOBAL_IMPLICIT); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
428 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
429 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
430 /* Should never get here. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
431 PyErr_Format(PyExc_SystemError, "failed to set scope for %s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
432 PyString_AS_STRING(name)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
433 return 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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
436 #undef SET_SCOPE |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
437 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
438 /* 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
|
439 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
|
440 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
|
441 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
442 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
|
443 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
|
444 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
445 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
446 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
447 analyze_cells(PyObject *scope, PyObject *free) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
448 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
449 PyObject *name, *v, *w; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
450 int success = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
451 Py_ssize_t pos = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
452 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
453 w = PyInt_FromLong(CELL); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
454 if (!w) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
455 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
456 while (PyDict_Next(scope, &pos, &name, &v)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
457 long flags; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
458 assert(PyInt_Check(v)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
459 flags = PyInt_AS_LONG(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
460 if (flags != LOCAL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
461 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
462 if (!PyDict_GetItem(free, name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
463 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
464 /* Replace LOCAL with CELL for this name, and remove |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
465 from free. It is safe to replace the value of name |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
466 in the dict, because it will not cause a resize. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
467 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
468 if (PyDict_SetItem(scope, name, w) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
469 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
470 if (!PyDict_DelItem(free, name) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
471 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
472 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
473 success = 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
474 error: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
475 Py_DECREF(w); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
476 return success; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
477 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
478 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
479 /* Check for illegal statements in unoptimized namespaces */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
480 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
481 check_unoptimized(const PySTEntryObject* ste) { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
482 char buf[300]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
483 const char* trailer; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
484 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
485 if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
486 || !(ste->ste_free || ste->ste_child_free)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
487 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
488 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
489 trailer = (ste->ste_child_free ? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
490 "contains a nested function with free variables" : |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
491 "is a nested function"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
492 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
493 switch (ste->ste_unoptimized) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
494 case OPT_TOPLEVEL: /* exec / import * at top-level is fine */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
495 case OPT_EXEC: /* qualified exec is fine */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
496 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
497 case OPT_IMPORT_STAR: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
498 PyOS_snprintf(buf, sizeof(buf), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
499 "import * is not allowed in function '%.100s' " |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
500 "because it %s", |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
501 PyString_AS_STRING(ste->ste_name), trailer); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
502 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
503 case OPT_BARE_EXEC: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
504 PyOS_snprintf(buf, sizeof(buf), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
505 "unqualified exec is not allowed in function " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
506 "'%.100s' it %s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
507 PyString_AS_STRING(ste->ste_name), trailer); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
508 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
509 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
510 PyOS_snprintf(buf, sizeof(buf), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
511 "function '%.100s' uses import * and bare exec, " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
512 "which are illegal because it %s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
513 PyString_AS_STRING(ste->ste_name), trailer); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
514 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
515 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
516 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
517 PyErr_SetString(PyExc_SyntaxError, buf); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
518 PyErr_SyntaxLocation(ste->ste_table->st_filename, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
519 ste->ste_opt_lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
520 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
521 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
522 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
523 /* Enter the final scope information into the st_symbols dict. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
524 * |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
525 * 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
|
526 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
527 static int |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
528 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
|
529 PyObject *bound, PyObject *free, int classflag) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
530 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
531 PyObject *name, *v, *u, *w, *free_value = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
532 Py_ssize_t pos = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
533 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
534 while (PyDict_Next(symbols, &pos, &name, &v)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
535 long i, flags; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
536 assert(PyInt_Check(v)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
537 flags = PyInt_AS_LONG(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
538 w = PyDict_GetItem(scope, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
539 assert(w && PyInt_Check(w)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
540 i = PyInt_AS_LONG(w); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
541 flags |= (i << SCOPE_OFF); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
542 u = PyInt_FromLong(flags); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
543 if (!u) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
544 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
545 if (PyDict_SetItem(symbols, name, u) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
546 Py_DECREF(u); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
547 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
548 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
549 Py_DECREF(u); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
550 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
551 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
552 free_value = PyInt_FromLong(FREE << SCOPE_OFF); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
553 if (!free_value) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
554 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
555 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
556 /* add a free variable when it's only use is for creating a closure */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
557 pos = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
558 while (PyDict_Next(free, &pos, &name, &v)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
559 PyObject *o = PyDict_GetItem(symbols, name); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
560 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
561 if (o) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
562 /* It could be a free variable in a method of |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
563 the class that has the same name as a local |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
564 or global in the class scope. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
565 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
566 if (classflag && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
567 PyInt_AS_LONG(o) & (DEF_BOUND | DEF_GLOBAL)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
568 long i = PyInt_AS_LONG(o) | DEF_FREE_CLASS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
569 o = PyInt_FromLong(i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
570 if (!o) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
571 Py_DECREF(free_value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
572 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
573 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
574 if (PyDict_SetItem(symbols, name, o) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
575 Py_DECREF(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
576 Py_DECREF(free_value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
577 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
578 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
579 Py_DECREF(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
580 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
581 /* else it's not free, probably a cell */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
582 continue; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
583 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
584 if (!PyDict_GetItem(bound, name)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
585 continue; /* it's a global */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
586 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
587 if (PyDict_SetItem(symbols, name, free_value) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
588 Py_DECREF(free_value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
589 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
590 } |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
591 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
592 Py_DECREF(free_value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
593 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
594 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
595 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
596 /* Make final symbol table decisions for block of ste. |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
597 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
598 Arguments: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
599 ste -- current symtable entry (input/output) |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
600 bound -- set of variables bound in enclosing scopes (input). bound |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
601 is NULL for module blocks. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
602 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
|
603 globals -- set of declared global variables in enclosing scopes (input) |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
604 |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
605 The implementation uses two mutually recursive functions, |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
606 analyze_block() and analyze_child_block(). analyze_block() is |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
607 responsible for analyzing the individual names defined in a block. |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
608 analyze_child_block() prepares temporary namespace dictionaries |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
609 used to evaluated nested blocks. |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
610 |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
611 The two functions exist because a child block should see the name |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
612 bindings of its enclosing blocks, but those bindings should not |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
613 propagate back to a parent block. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
614 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
615 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
616 static int |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
617 analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
618 PyObject *global, PyObject* child_free); |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
619 |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
620 static int |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
621 analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
622 PyObject *global) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
623 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
624 PyObject *name, *v, *local = NULL, *scope = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
625 PyObject *newbound = NULL, *newglobal = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
626 PyObject *newfree = NULL, *allfree = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
627 int i, success = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
628 Py_ssize_t pos = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
629 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
630 local = PyDict_New(); /* collect new names bound in block */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
631 if (!local) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
632 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
633 scope = PyDict_New(); /* collect scopes defined for each name */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
634 if (!scope) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
635 goto error; |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
636 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
637 /* Allocate new global and bound variable dictionaries. These |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
638 dictionaries hold the names visible in nested blocks. For |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
639 ClassBlocks, the bound and global names are initialized |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
640 before analyzing names, because class bindings aren't |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
641 visible in methods. For other blocks, they are initialized |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
642 after names are analyzed. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
643 */ |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
644 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
645 /* TODO(jhylton): Package these dicts in a struct so that we |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
646 can write reasonable helper functions? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
647 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
648 newglobal = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
649 if (!newglobal) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
650 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
651 newbound = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
652 if (!newbound) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
653 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
654 newfree = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
655 if (!newfree) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
656 goto error; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
657 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
658 if (ste->ste_type == ClassBlock) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
659 if (PyDict_Update(newglobal, global) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
660 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
661 if (bound) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
662 if (PyDict_Update(newbound, bound) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
663 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
664 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
665 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
666 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
667 long flags = PyInt_AS_LONG(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
668 if (!analyze_name(ste, scope, name, flags, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
669 bound, local, free, global)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
670 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
671 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
672 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
673 if (ste->ste_type != ClassBlock) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
674 if (ste->ste_type == FunctionBlock) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
675 if (PyDict_Update(newbound, local) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
676 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
677 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
678 if (bound) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
679 if (PyDict_Update(newbound, bound) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
680 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
681 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
682 if (PyDict_Update(newglobal, global) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
683 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
684 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
685 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
686 /* Recursively call analyze_block() on each child block. |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
687 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
688 newbound, newglobal now contain the names visible in |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
689 nested blocks. The free variables in the children will |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
690 be collected in allfree. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
691 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
692 allfree = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
693 if (!allfree) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
694 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
695 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
696 PyObject *c = PyList_GET_ITEM(ste->ste_children, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
697 PySTEntryObject* entry; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
698 assert(c && PySTEntry_Check(c)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
699 entry = (PySTEntryObject*)c; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
700 if (!analyze_child_block(entry, newbound, newfree, newglobal, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
701 allfree)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
702 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
703 if (entry->ste_free || entry->ste_child_free) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
704 ste->ste_child_free = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
705 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
706 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
707 if (PyDict_Update(newfree, allfree) < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
708 goto error; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
709 if (ste->ste_type == FunctionBlock && !analyze_cells(scope, newfree)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
710 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
711 if (!update_symbols(ste->ste_symbols, scope, bound, newfree, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
712 ste->ste_type == ClassBlock)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
713 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
714 if (!check_unoptimized(ste)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
715 goto error; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
716 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
717 if (PyDict_Update(free, newfree) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
718 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
719 success = 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
720 error: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
721 Py_XDECREF(local); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
722 Py_XDECREF(scope); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
723 Py_XDECREF(newbound); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
724 Py_XDECREF(newglobal); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
725 Py_XDECREF(newfree); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
726 Py_XDECREF(allfree); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
727 if (!success) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
728 assert(PyErr_Occurred()); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
729 return success; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
730 } |
|
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 static int |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
733 analyze_child_block(PySTEntryObject *entry, PyObject *bound, PyObject *free, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
734 PyObject *global, PyObject* child_free) |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
735 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
736 PyObject *temp_bound = NULL, *temp_global = NULL, *temp_free = NULL; |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
737 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
738 /* Copy the bound and global dictionaries. |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
739 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
740 These dictionary are used by all blocks enclosed by the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
741 current block. The analyze_block() call modifies these |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
742 dictionaries. |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
743 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
744 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
745 temp_bound = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
746 if (!temp_bound) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
747 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
748 if (PyDict_Update(temp_bound, bound) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
749 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
750 temp_free = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
751 if (!temp_free) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
752 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
753 if (PyDict_Update(temp_free, free) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
754 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
755 temp_global = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
756 if (!temp_global) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
757 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
758 if (PyDict_Update(temp_global, global) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
759 goto error; |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
760 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
761 if (!analyze_block(entry, temp_bound, temp_free, temp_global)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
762 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
763 if (PyDict_Update(child_free, temp_free) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
764 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
765 Py_DECREF(temp_bound); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
766 Py_DECREF(temp_free); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
767 Py_DECREF(temp_global); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
768 return 1; |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
769 error: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
770 Py_XDECREF(temp_bound); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
771 Py_XDECREF(temp_free); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
772 Py_XDECREF(temp_global); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
773 return 0; |
|
52520
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
774 } |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
775 |
|
6910792fcd4b
Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48258
diff
changeset
|
776 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
777 symtable_analyze(struct symtable *st) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
778 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
779 PyObject *free, *global; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
780 int r; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
781 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
782 free = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
783 if (!free) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
784 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
785 global = PyDict_New(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
786 if (!global) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
787 Py_DECREF(free); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
788 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
789 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
790 r = analyze_block(st->st_top, NULL, free, global); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
791 Py_DECREF(free); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
792 Py_DECREF(global); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
793 return r; |
|
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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
796 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
797 static int |
|
36089
4aa01879a8f5
Bug #889500, fix line number on SyntaxWarning for global declarations.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
798 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
|
799 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
800 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
801 lineno, NULL, NULL) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
802 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
803 PyErr_SetString(PyExc_SyntaxError, msg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
804 PyErr_SyntaxLocation(st->st_filename, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
805 st->st_cur->ste_lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
806 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
807 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
808 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
809 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
810 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
811 |
|
48253
9de68ad86078
PySTEntry's constructor is static; there's no point in a fancy API name
Benjamin Peterson <benjamin@python.org>
parents:
48251
diff
changeset
|
812 /* symtable_enter_block() gets a reference via ste_new. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
813 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
|
814 in symtable_exit_block(). |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
815 */ |
|
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 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
818 symtable_exit_block(struct symtable *st, void *ast) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
819 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
820 Py_ssize_t end; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
821 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
822 Py_CLEAR(st->st_cur); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
823 end = PyList_GET_SIZE(st->st_stack) - 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
824 if (end >= 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
825 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
826 end); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
827 if (st->st_cur == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
828 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
829 Py_INCREF(st->st_cur); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
830 if (PySequence_DelItem(st->st_stack, end) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
831 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
832 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
833 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
834 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
835 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
836 static int |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
837 symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
838 void *ast, int lineno) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
839 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
840 PySTEntryObject *prev = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
841 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
842 if (st->st_cur) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
843 prev = st->st_cur; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
844 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
845 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
846 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
847 Py_DECREF(st->st_cur); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
848 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
849 st->st_cur = ste_new(st, name, block, ast, lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
850 if (st->st_cur == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
851 return 0; |
|
65394
0bd0e87a6851
Merged revisions 85562 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
62254
diff
changeset
|
852 if (block == ModuleBlock) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
853 st->st_global = st->st_cur->ste_symbols; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
854 if (prev) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
855 if (PyList_Append(prev->ste_children, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
856 (PyObject *)st->st_cur) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
857 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
858 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
859 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
860 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
861 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
862 |
|
36231
d3f4c467e439
Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents:
36226
diff
changeset
|
863 static long |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
864 symtable_lookup(struct symtable *st, PyObject *name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
865 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
866 PyObject *o; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
867 PyObject *mangled = _Py_Mangle(st->st_private, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
868 if (!mangled) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
869 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
870 o = PyDict_GetItem(st->st_cur->ste_symbols, mangled); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
871 Py_DECREF(mangled); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
872 if (!o) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
873 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
874 return PyInt_AsLong(o); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
875 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
876 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
877 static int |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
878 symtable_add_def(struct symtable *st, PyObject *name, int flag) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
879 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
880 PyObject *o; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
881 PyObject *dict; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
882 long val; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
883 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
|
884 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
885 if (!mangled) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
886 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
887 dict = st->st_cur->ste_symbols; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
888 if ((o = PyDict_GetItem(dict, mangled))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
889 val = PyInt_AS_LONG(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
890 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
891 /* Is it better to use 'mangled' or 'name' here? */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
892 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
893 PyString_AsString(name)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
894 PyErr_SyntaxLocation(st->st_filename, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
895 st->st_cur->ste_lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
896 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
897 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
898 val |= flag; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
899 } else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
900 val = flag; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
901 o = PyInt_FromLong(val); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
902 if (o == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
903 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
904 if (PyDict_SetItem(dict, mangled, o) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
905 Py_DECREF(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
906 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
907 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
908 Py_DECREF(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
909 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
910 if (flag & DEF_PARAM) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
911 if (PyList_Append(st->st_cur->ste_varnames, mangled) < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
912 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
913 } else if (flag & DEF_GLOBAL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
914 /* XXX need to update DEF_GLOBAL for other flags too; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
915 perhaps only DEF_FREE_GLOBAL */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
916 val = flag; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
917 if ((o = PyDict_GetItem(st->st_global, mangled))) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
918 val |= PyInt_AS_LONG(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
919 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
920 o = PyInt_FromLong(val); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
921 if (o == NULL) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
922 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
923 if (PyDict_SetItem(st->st_global, mangled, o) < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
924 Py_DECREF(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
925 goto error; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
926 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
927 Py_DECREF(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
928 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
929 Py_DECREF(mangled); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
930 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
|
931 |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35766
diff
changeset
|
932 error: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
933 Py_DECREF(mangled); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
934 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
935 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
936 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
937 /* 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
|
938 They use the ASDL name to synthesize the name of the C type and the visit |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
939 function. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
940 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
941 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
|
942 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
|
943 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
944 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
945 #define VISIT(ST, TYPE, V) \ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
946 if (!symtable_visit_ ## TYPE((ST), (V))) \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
947 return 0; |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
948 |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
949 #define VISIT_IN_BLOCK(ST, TYPE, V, S) \ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
950 if (!symtable_visit_ ## TYPE((ST), (V))) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
951 symtable_exit_block((ST), (S)); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
952 return 0; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
953 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
954 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
955 #define VISIT_SEQ(ST, TYPE, SEQ) { \ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
956 int i; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
957 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
958 for (i = 0; i < asdl_seq_LEN(seq); i++) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
959 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
960 if (!symtable_visit_ ## TYPE((ST), elt)) \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
961 return 0; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
962 } \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
963 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
964 |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
965 #define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
966 int i; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
967 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
968 for (i = 0; i < asdl_seq_LEN(seq); i++) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
969 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
970 if (!symtable_visit_ ## TYPE((ST), elt)) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
971 symtable_exit_block((ST), (S)); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
972 return 0; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
973 } \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
974 } \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
975 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
976 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
977 #define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
978 int i; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
979 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
980 for (i = (START); i < asdl_seq_LEN(seq); i++) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
981 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
982 if (!symtable_visit_ ## TYPE((ST), elt)) \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
983 return 0; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
984 } \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
985 } |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
986 |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
987 #define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
988 int i; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
989 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
990 for (i = (START); i < asdl_seq_LEN(seq); i++) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
991 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
992 if (!symtable_visit_ ## TYPE((ST), elt)) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
993 symtable_exit_block((ST), (S)); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
994 return 0; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
995 } \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
996 } \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
997 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35793
diff
changeset
|
998 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
999 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1000 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
|
1001 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1002 switch (s->kind) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1003 case FunctionDef_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1004 if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1005 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1006 if (s->v.FunctionDef.args->defaults) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1007 VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1008 if (s->v.FunctionDef.decorator_list) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1009 VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1010 if (!symtable_enter_block(st, s->v.FunctionDef.name, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1011 FunctionBlock, (void *)s, s->lineno)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1012 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1013 VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1014 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1015 if (!symtable_exit_block(st, s)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1016 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1017 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1018 case ClassDef_kind: { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1019 PyObject *tmp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1020 if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1021 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1022 VISIT_SEQ(st, expr, s->v.ClassDef.bases); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1023 if (s->v.ClassDef.decorator_list) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1024 VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1025 if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1026 (void *)s, s->lineno)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1027 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1028 tmp = st->st_private; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1029 st->st_private = s->v.ClassDef.name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1030 VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1031 st->st_private = tmp; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1032 if (!symtable_exit_block(st, s)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1033 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1034 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1035 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1036 case Return_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1037 if (s->v.Return.value) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1038 VISIT(st, expr, s->v.Return.value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1039 st->st_cur->ste_returns_value = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1040 if (st->st_cur->ste_generator) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1041 PyErr_SetString(PyExc_SyntaxError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1042 RETURN_VAL_IN_GENERATOR); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1043 PyErr_SyntaxLocation(st->st_filename, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1044 s->lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1045 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1046 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1047 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1048 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1049 case Delete_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1050 VISIT_SEQ(st, expr, s->v.Delete.targets); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1051 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1052 case Assign_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1053 VISIT_SEQ(st, expr, s->v.Assign.targets); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1054 VISIT(st, expr, s->v.Assign.value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1055 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1056 case AugAssign_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1057 VISIT(st, expr, s->v.AugAssign.target); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1058 VISIT(st, expr, s->v.AugAssign.value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1059 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1060 case Print_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1061 if (s->v.Print.dest) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1062 VISIT(st, expr, s->v.Print.dest); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1063 VISIT_SEQ(st, expr, s->v.Print.values); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1064 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1065 case For_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1066 VISIT(st, expr, s->v.For.target); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1067 VISIT(st, expr, s->v.For.iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1068 VISIT_SEQ(st, stmt, s->v.For.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1069 if (s->v.For.orelse) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1070 VISIT_SEQ(st, stmt, s->v.For.orelse); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1071 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1072 case While_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1073 VISIT(st, expr, s->v.While.test); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1074 VISIT_SEQ(st, stmt, s->v.While.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1075 if (s->v.While.orelse) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1076 VISIT_SEQ(st, stmt, s->v.While.orelse); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1077 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1078 case If_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1079 /* XXX if 0: and lookup_yield() hacks */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1080 VISIT(st, expr, s->v.If.test); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1081 VISIT_SEQ(st, stmt, s->v.If.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1082 if (s->v.If.orelse) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1083 VISIT_SEQ(st, stmt, s->v.If.orelse); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1084 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1085 case Raise_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1086 if (s->v.Raise.type) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1087 VISIT(st, expr, s->v.Raise.type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1088 if (s->v.Raise.inst) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1089 VISIT(st, expr, s->v.Raise.inst); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1090 if (s->v.Raise.tback) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1091 VISIT(st, expr, s->v.Raise.tback); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1092 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1093 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1094 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1095 case TryExcept_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1096 VISIT_SEQ(st, stmt, s->v.TryExcept.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1097 VISIT_SEQ(st, stmt, s->v.TryExcept.orelse); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1098 VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1099 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1100 case TryFinally_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1101 VISIT_SEQ(st, stmt, s->v.TryFinally.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1102 VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1103 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1104 case Assert_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1105 VISIT(st, expr, s->v.Assert.test); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1106 if (s->v.Assert.msg) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1107 VISIT(st, expr, s->v.Assert.msg); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1108 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1109 case Import_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1110 VISIT_SEQ(st, alias, s->v.Import.names); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1111 /* XXX Don't have the lineno available inside |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1112 visit_alias */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1113 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1114 st->st_cur->ste_opt_lineno = s->lineno; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1115 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1116 case ImportFrom_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1117 VISIT_SEQ(st, alias, s->v.ImportFrom.names); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1118 /* XXX Don't have the lineno available inside |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1119 visit_alias */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1120 if (st->st_cur->ste_unoptimized && !st->st_cur->ste_opt_lineno) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1121 st->st_cur->ste_opt_lineno = s->lineno; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1122 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1123 case Exec_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1124 VISIT(st, expr, s->v.Exec.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1125 if (!st->st_cur->ste_opt_lineno) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1126 st->st_cur->ste_opt_lineno = s->lineno; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1127 if (s->v.Exec.globals) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1128 st->st_cur->ste_unoptimized |= OPT_EXEC; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1129 VISIT(st, expr, s->v.Exec.globals); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1130 if (s->v.Exec.locals) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1131 VISIT(st, expr, s->v.Exec.locals); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1132 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1133 st->st_cur->ste_unoptimized |= OPT_BARE_EXEC; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1134 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1135 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1136 case Global_kind: { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1137 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1138 asdl_seq *seq = s->v.Global.names; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1139 for (i = 0; i < asdl_seq_LEN(seq); i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1140 identifier name = (identifier)asdl_seq_GET(seq, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1141 char *c_name = PyString_AS_STRING(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1142 long cur = symtable_lookup(st, name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1143 if (cur < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1144 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1145 if (cur & (DEF_LOCAL | USE)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1146 char buf[256]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1147 if (cur & DEF_LOCAL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1148 PyOS_snprintf(buf, sizeof(buf), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1149 GLOBAL_AFTER_ASSIGN, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1150 c_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1151 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1152 PyOS_snprintf(buf, sizeof(buf), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1153 GLOBAL_AFTER_USE, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1154 c_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1155 if (!symtable_warn(st, buf, s->lineno)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1156 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1157 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1158 if (!symtable_add_def(st, name, DEF_GLOBAL)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1159 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1160 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1161 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1162 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1163 case Expr_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1164 VISIT(st, expr, s->v.Expr.value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1165 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1166 case Pass_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1167 case Break_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1168 case Continue_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1169 /* nothing to do here */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1170 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1171 case With_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1172 VISIT(st, expr, s->v.With.context_expr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1173 if (s->v.With.optional_vars) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1174 VISIT(st, expr, s->v.With.optional_vars); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1175 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1176 VISIT_SEQ(st, stmt, s->v.With.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1177 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1178 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1179 return 1; |
|
35742
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 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1182 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1183 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
|
1184 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1185 switch (e->kind) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1186 case BoolOp_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1187 VISIT_SEQ(st, expr, e->v.BoolOp.values); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1188 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1189 case BinOp_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1190 VISIT(st, expr, e->v.BinOp.left); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1191 VISIT(st, expr, e->v.BinOp.right); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1192 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1193 case UnaryOp_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1194 VISIT(st, expr, e->v.UnaryOp.operand); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1195 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1196 case Lambda_kind: { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1197 if (!GET_IDENTIFIER(lambda)) |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1198 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1199 if (e->v.Lambda.args->defaults) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1200 VISIT_SEQ(st, expr, e->v.Lambda.args->defaults); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1201 if (!symtable_enter_block(st, lambda, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1202 FunctionBlock, (void *)e, e->lineno)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1203 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1204 VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1205 VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1206 if (!symtable_exit_block(st, (void *)e)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1207 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1208 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1209 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1210 case IfExp_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1211 VISIT(st, expr, e->v.IfExp.test); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1212 VISIT(st, expr, e->v.IfExp.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1213 VISIT(st, expr, e->v.IfExp.orelse); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1214 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1215 case Dict_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1216 VISIT_SEQ(st, expr, e->v.Dict.keys); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1217 VISIT_SEQ(st, expr, e->v.Dict.values); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1218 break; |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1219 case Set_kind: |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1220 VISIT_SEQ(st, expr, e->v.Set.elts); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1221 break; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1222 case ListComp_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1223 VISIT(st, expr, e->v.ListComp.elt); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1224 VISIT_SEQ(st, comprehension, e->v.ListComp.generators); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1225 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1226 case GeneratorExp_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1227 if (!symtable_visit_genexp(st, e)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1228 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1229 break; |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1230 case SetComp_kind: |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1231 if (!symtable_visit_setcomp(st, e)) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1232 return 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1233 break; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1234 case DictComp_kind: |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1235 if (!symtable_visit_dictcomp(st, e)) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1236 return 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1237 break; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1238 case Yield_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1239 if (e->v.Yield.value) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1240 VISIT(st, expr, e->v.Yield.value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1241 st->st_cur->ste_generator = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1242 if (st->st_cur->ste_returns_value) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1243 PyErr_SetString(PyExc_SyntaxError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1244 RETURN_VAL_IN_GENERATOR); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1245 PyErr_SyntaxLocation(st->st_filename, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1246 e->lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1247 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1248 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1249 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1250 case Compare_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1251 VISIT(st, expr, e->v.Compare.left); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1252 VISIT_SEQ(st, expr, e->v.Compare.comparators); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1253 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1254 case Call_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1255 VISIT(st, expr, e->v.Call.func); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1256 VISIT_SEQ(st, expr, e->v.Call.args); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1257 VISIT_SEQ(st, keyword, e->v.Call.keywords); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1258 if (e->v.Call.starargs) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1259 VISIT(st, expr, e->v.Call.starargs); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1260 if (e->v.Call.kwargs) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1261 VISIT(st, expr, e->v.Call.kwargs); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1262 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1263 case Repr_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1264 VISIT(st, expr, e->v.Repr.value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1265 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1266 case Num_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1267 case Str_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1268 /* Nothing to do here. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1269 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1270 /* The following exprs can be assignment targets. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1271 case Attribute_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1272 VISIT(st, expr, e->v.Attribute.value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1273 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1274 case Subscript_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1275 VISIT(st, expr, e->v.Subscript.value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1276 VISIT(st, slice, e->v.Subscript.slice); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1277 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1278 case Name_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1279 if (!symtable_add_def(st, e->v.Name.id, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1280 e->v.Name.ctx == Load ? USE : DEF_LOCAL)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1281 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1282 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1283 /* child nodes of List and Tuple will have expr_context set */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1284 case List_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1285 VISIT_SEQ(st, expr, e->v.List.elts); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1286 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1287 case Tuple_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1288 VISIT_SEQ(st, expr, e->v.Tuple.elts); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1289 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1290 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1291 return 1; |
|
35742
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 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1294 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1295 symtable_implicit_arg(struct symtable *st, int pos) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1296 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1297 PyObject *id = PyString_FromFormat(".%d", pos); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1298 if (id == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1299 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1300 if (!symtable_add_def(st, id, DEF_PARAM)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1301 Py_DECREF(id); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1302 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1303 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1304 Py_DECREF(id); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1305 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1306 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1307 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1308 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1309 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
|
1310 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1311 int i; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1312 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1313 /* go through all the toplevel arguments first */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1314 for (i = 0; i < asdl_seq_LEN(args); i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1315 expr_ty arg = (expr_ty)asdl_seq_GET(args, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1316 if (arg->kind == Name_kind) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1317 assert(arg->v.Name.ctx == Param || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1318 (arg->v.Name.ctx == Store && !toplevel)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1319 if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1320 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1321 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1322 else if (arg->kind == Tuple_kind) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1323 assert(arg->v.Tuple.ctx == Store); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1324 if (toplevel) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1325 if (!symtable_implicit_arg(st, i)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1326 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1327 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1328 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1329 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1330 PyErr_SetString(PyExc_SyntaxError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1331 "invalid expression in parameter list"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1332 PyErr_SyntaxLocation(st->st_filename, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1333 st->st_cur->ste_lineno); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1334 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1335 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1336 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1337 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1338 if (!toplevel) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1339 if (!symtable_visit_params_nested(st, args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1340 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1341 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1342 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1343 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1344 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1345 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1346 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1347 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
|
1348 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1349 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1350 for (i = 0; i < asdl_seq_LEN(args); i++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1351 expr_ty arg = (expr_ty)asdl_seq_GET(args, i); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1352 if (arg->kind == Tuple_kind && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1353 !symtable_visit_params(st, arg->v.Tuple.elts, 0)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1354 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1355 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1356 |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1357 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1358 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1359 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1360 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1361 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
|
1362 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1363 /* skip default arguments inside function block |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1364 XXX should ast be different? |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1365 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1366 if (a->args && !symtable_visit_params(st, a->args, 1)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1367 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1368 if (a->vararg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1369 if (!symtable_add_def(st, a->vararg, DEF_PARAM)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1370 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1371 st->st_cur->ste_varargs = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1372 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1373 if (a->kwarg) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1374 if (!symtable_add_def(st, a->kwarg, DEF_PARAM)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1375 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1376 st->st_cur->ste_varkeywords = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1377 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1378 if (a->args && !symtable_visit_params_nested(st, a->args)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1379 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1380 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1381 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1382 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1383 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1384 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1385 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
|
1386 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1387 if (eh->v.ExceptHandler.type) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1388 VISIT(st, expr, eh->v.ExceptHandler.type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1389 if (eh->v.ExceptHandler.name) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1390 VISIT(st, expr, eh->v.ExceptHandler.name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1391 VISIT_SEQ(st, stmt, eh->v.ExceptHandler.body); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1392 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1393 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1394 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1395 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1396 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1397 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
|
1398 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1399 /* Compute store_name, the name actually bound by the import |
|
62254
661519fec3b8
different spellings are just unacceptable
Benjamin Peterson <benjamin@python.org>
parents:
61463
diff
changeset
|
1400 operation. It is different than a->name when a->name is a |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1401 dotted package name (e.g. spam.eggs) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1402 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1403 PyObject *store_name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1404 PyObject *name = (a->asname == NULL) ? a->name : a->asname; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1405 const char *base = PyString_AS_STRING(name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1406 char *dot = strchr(base, '.'); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1407 if (dot) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1408 store_name = PyString_FromStringAndSize(base, dot - base); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1409 if (!store_name) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1410 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1411 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1412 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1413 store_name = name; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1414 Py_INCREF(store_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1415 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1416 if (strcmp(PyString_AS_STRING(name), "*")) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1417 int r = symtable_add_def(st, store_name, DEF_IMPORT); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1418 Py_DECREF(store_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1419 return r; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1420 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1421 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1422 if (st->st_cur->ste_type != ModuleBlock) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1423 int lineno = st->st_cur->ste_lineno; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1424 if (!symtable_warn(st, IMPORT_STAR_WARNING, lineno)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1425 Py_DECREF(store_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1426 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1427 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1428 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1429 st->st_cur->ste_unoptimized |= OPT_IMPORT_STAR; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1430 Py_DECREF(store_name); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1431 return 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1432 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1433 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1434 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1435 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1436 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1437 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
|
1438 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1439 VISIT(st, expr, lc->target); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1440 VISIT(st, expr, lc->iter); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1441 VISIT_SEQ(st, expr, lc->ifs); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1442 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1443 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1444 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1445 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1446 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1447 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
|
1448 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1449 VISIT(st, expr, k->value); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1450 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1451 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1452 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1453 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1454 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1455 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
|
1456 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1457 switch (s->kind) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1458 case Slice_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1459 if (s->v.Slice.lower) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1460 VISIT(st, expr, s->v.Slice.lower) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1461 if (s->v.Slice.upper) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1462 VISIT(st, expr, s->v.Slice.upper) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1463 if (s->v.Slice.step) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1464 VISIT(st, expr, s->v.Slice.step) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1465 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1466 case ExtSlice_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1467 VISIT_SEQ(st, slice, s->v.ExtSlice.dims) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1468 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1469 case Index_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1470 VISIT(st, expr, s->v.Index.value) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1471 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1472 case Ellipsis_kind: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1473 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1474 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1475 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1476 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1477 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1478 static int |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1479 symtable_new_tmpname(struct symtable *st) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1480 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1481 char tmpname[256]; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1482 identifier tmp; |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1483 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1484 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1485 ++st->st_cur->ste_tmpname); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1486 tmp = PyString_InternFromString(tmpname); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1487 if (!tmp) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1488 return 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1489 if (!symtable_add_def(st, tmp, DEF_LOCAL)) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1490 return 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1491 Py_DECREF(tmp); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1492 return 1; |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1493 } |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1494 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1495 static int |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1496 symtable_handle_comprehension(struct symtable *st, expr_ty e, |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1497 identifier scope_name, asdl_seq *generators, |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1498 expr_ty elt, expr_ty value) |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1499 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1500 int is_generator = (e->kind == GeneratorExp_kind); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1501 int needs_tmp = !is_generator; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1502 comprehension_ty outermost = ((comprehension_ty) |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1503 asdl_seq_GET(generators, 0)); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1504 /* Outermost iterator is evaluated in current scope */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1505 VISIT(st, expr, outermost->iter); |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1506 /* Create comprehension scope for the rest */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1507 if (!scope_name || |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1508 !symtable_enter_block(st, scope_name, FunctionBlock, (void *)e, 0)) { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1509 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1510 } |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1511 st->st_cur->ste_generator = is_generator; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1512 /* Outermost iter is received as an argument */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1513 if (!symtable_implicit_arg(st, 0)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1514 symtable_exit_block(st, (void *)e); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1515 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1516 } |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1517 /* Allocate temporary name if needed */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1518 if (needs_tmp && !symtable_new_tmpname(st)) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1519 symtable_exit_block(st, (void *)e); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1520 return 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1521 } |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1522 VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1523 VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1524 VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension, |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1525 generators, 1, (void*)e); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1526 if (value) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1527 VISIT_IN_BLOCK(st, expr, value, (void*)e); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1528 VISIT_IN_BLOCK(st, expr, elt, (void*)e); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57377
diff
changeset
|
1529 return symtable_exit_block(st, (void *)e); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
32121
diff
changeset
|
1530 } |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1531 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1532 static int |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1533 symtable_visit_genexp(struct symtable *st, expr_ty e) |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1534 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1535 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr), |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1536 e->v.GeneratorExp.generators, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1537 e->v.GeneratorExp.elt, NULL); |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1538 } |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1539 |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1540 static int |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1541 symtable_visit_setcomp(struct symtable *st, expr_ty e) |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1542 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1543 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp), |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1544 e->v.SetComp.generators, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1545 e->v.SetComp.elt, NULL); |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1546 } |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1547 |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1548 static int |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1549 symtable_visit_dictcomp(struct symtable *st, expr_ty e) |
|
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1550 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1551 return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp), |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1552 e->v.DictComp.generators, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1553 e->v.DictComp.key, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
58250
diff
changeset
|
1554 e->v.DictComp.value); |
|
58250
edfed0e32ced
Issue #2333: Backport set and dict comprehensions syntax.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
58229
diff
changeset
|
1555 } |
