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;