1 /**
2   Mirror _symtable.h
3   */
4 module deimos.python.symtable;
5 
6 import deimos.python.pyport;
7 import deimos.python.object;
8 import deimos.python.compile;
9 import deimos.python.ast;
10 import deimos.python.node;
11 
12 extern(C):
13 
14 /// _
15 struct _symtable_entry;
16 
17 version(Python_2_5_Or_Later) {
18     /// Availability: >= 2.5
19     enum _Py_block_ty{ 
20         /// _
21         FunctionBlock, 
22         /// _
23         ClassBlock, 
24         /// _
25         ModuleBlock 
26     }
27 }
28 
29 /// _
30 struct symtable {
31     version(Python_2_5_Or_Later) {
32     }else{
33         /** pass == 1 or 2 */
34         /// Availability: 2.4
35         int st_pass;             
36     }
37     /** name of file being compiled */
38     const(char)*st_filename; 
39     /** current symbol table entry */
40     _symtable_entry* st_cur; 
41     version(Python_2_5_Or_Later) {
42         /* module entry */
43         /// Availability: >= 2.5
44         _symtable_entry *st_top; 
45     }
46     /** dictionary of symbol table entries */
47     PyObject* st_symbols;    
48     /** stack of namespace info */
49     PyObject* st_stack;      
50     /** borrowed ref to MODULE in st_symbols */
51     Borrowed!PyObject* st_global;     
52     version(Python_2_5_Or_Later) {
53         /** number of blocks */
54         /// Availability: >= 2.5
55         int st_nblocks;          
56         /** name of current class or NULL */
57         /// Availability: >= 2.5
58         PyObject* st_private;        
59         /** temporary name counter */
60         /// Availability: >= 2.5
61         int st_tmpname;          
62     }else{
63         /** number of scopes */
64         /// Availability: 2.4
65         int st_nscopes;
66         /** number of errors */
67         /// Availability: 2.4
68         int st_errors;
69         /** name of current class or NULL */
70         /// Availability: 2.4
71         char* st_private;        
72     }
73     /** module's future features */
74     PyFutureFeatures* st_future; 
75 };
76 
77 /// _
78 struct PySTEntryObject{
79 	mixin PyObject_HEAD;
80         /** int: key in st_symbols) */
81 	PyObject* ste_id;        
82         /** dict: name to flags) */
83 	PyObject* ste_symbols;   
84         /** string: name of scope */
85 	PyObject* ste_name;      
86         /** list of variable names */
87 	PyObject* ste_varnames;  
88         /** list of child ids */
89 	PyObject* ste_children;  
90         version(Python_2_5_Or_Later) {
91             /** module, class, or function */
92             _Py_block_ty ste_type;   
93             /** false if namespace is optimized */
94             /// Availability: >= 2.5
95             int ste_unoptimized;     
96             /** true if block is nested */
97             uint ste_nested ;      
98             /** true if block has free variables */
99             /// Availability: >= 2.5
100             uint ste_free ;        
101             /** true if a child block has free vars,
102             including free refs to globals */
103             uint ste_child_free ;  
104             /** true if namespace is a generator */
105             uint ste_generator ;   
106             /** true if block has varargs */
107             /// Availability: >= 2.5
108             uint ste_varargs ;     
109             /** true if block has varkeywords */
110             /// Availability: >= 2.5
111             uint ste_varkeywords ; 
112             /** true if namespace uses return with
113             an argument */
114             /// Availability: >= 2.5
115             uint ste_returns_value ;  
116             /** first line of block */
117             int ste_lineno;          
118 
119         }else{
120             /** module, class, or function */
121             int ste_type;            
122             /** first line of scope */
123             int ste_lineno;          
124             /** true if namespace can't be optimized */
125             /// Availability: 2.4
126             int ste_optimized;       
127             /** true if scope is nested */
128             int ste_nested;          
129             /** true if a child scope has free variables,
130                including free refs to globals */
131             int ste_child_free;      
132             /** true if namespace is a generator */
133             int ste_generator;       
134         }
135         /** lineno of last exec or import * */
136 	int ste_opt_lineno;      
137         /** temporary name counter */
138 	int ste_tmpname;         
139         /// _
140 	symtable* ste_table;
141 } 
142 
143 version(Python_2_5_Or_Later) {
144     /// Availability: >= 2.5
145     mixin(PyAPI_DATA!"PyTypeObject PySTEntry_Type");
146 
147     /// _
148     int PySymtableEntry_Check()(PyObject* op) {
149         return (Py_TYPE(op) is &PySTEntry_Type);
150     }
151     /// Availability: >= 2.5
152     int PyST_GetScope(PySTEntryObject*, PyObject*);
153     /// Availability: >= 2.5
154     symtable* PySymtable_Build(
155             mod_ty, const(char)*, 
156             PyFutureFeatures*);
157 
158     /// Availability: >= 2.5
159     PySTEntryObject* PySymtable_Lookup(symtable*, void*);
160     /// _
161     void PySymtable_Free(symtable*);
162 }else{
163     /// Availability: 2.4
164     alias PySTEntryObject PySymtableEntryObject;
165     /// Availability: 2.4
166     mixin(PyAPI_DATA!"PyTypeObject PySymtableEntry_Type");
167 
168     /// _
169     int PySymtableEntry_Check()(PyObject* op) {
170         return (Py_TYPE(op) is &PySymtableEntry_Type);
171     }
172 
173     /// Availability: 2.4
174     PyObject* PySymtableEntry_New(
175             symtable*,
176             char*, 
177             int, 
178             int);
179     /// Availability: 2.4
180     symtable* PyNode_CompileSymtable(node*, const(char)*);
181     /// _
182     void PySymtable_Free(symtable*);
183 }
184 
185 
186 /* Flags for def-use information */
187 
188 /** global stmt */
189 enum DEF_GLOBAL=1;          
190 /** assignment in code block */
191 enum DEF_LOCAL=2;           
192 /** formal parameter */
193 enum DEF_PARAM=2<<1;        
194 /** name is used */
195 enum USE=2<<2;              
196 version(Python_2_5_Or_Later) {
197     /** name used but not defined in nested block */
198     enum DEF_FREE=2<<3;        
199     /** free variable from class's method */
200     enum DEF_FREE_CLASS=2<<4;   
201     /** assignment occurred via import */
202     enum DEF_IMPORT=2<<5;       
203 }else{
204     /** parameter is star arg */
205     enum DEF_STAR=2<<3;         
206     /** parameter is star-star arg */
207     enum DEF_DOUBLESTAR=2<<4;   
208     /** name defined in tuple in parameters */
209     enum DEF_INTUPLE=2<<5 ;     
210     /** name used but not defined in nested scope */
211     enum DEF_FREE=2<<6;         
212     /** free variable is actually implicit global */
213     enum DEF_FREE_GLOBAL=2<<7;  
214     /** free variable from class's method */
215     enum DEF_FREE_CLASS=2<<8;   
216     /** assignment occurred via import */
217     enum DEF_IMPORT=2<<9;       
218 }
219 
220 /// _
221 enum DEF_BOUND = (DEF_LOCAL | DEF_PARAM | DEF_IMPORT);
222 
223 /// _
224 enum TYPE_FUNCTION =1;
225 /// _
226 enum TYPE_CLASS=2;
227 /// _
228 enum TYPE_MODULE=3;
229 
230 /// _
231 enum LOCAL=1;
232 /// _
233 enum GLOBAL_EXPLICIT=2;
234 /// _
235 enum GLOBAL_IMPLICIT=3;
236 /// _
237 enum FREE=4;
238 /// _
239 enum CELL=5;
240 
241 /// _
242 enum OPT_IMPORT_STAR=1;
243 /// _
244 enum OPT_EXEC=2;
245 /// _
246 enum OPT_BARE_EXEC=4;
247 
248 /// _
249 enum GENERATOR=1;
250 /// _
251 enum GENERATOR_EXPRESSION=2;