Lines Matching +full:self +full:- +full:assign
1 """Module symbol-table generator"""
16 def __init__(self, name, module, klass=None): argument
17 self.name = name
18 self.module = module
19 self.defs = {}
20 self.uses = {}
21 self.globals = {}
22 self.params = {}
23 self.frees = {}
24 self.cells = {}
25 self.children = []
28 self.nested = None
29 self.generator = None
30 self.klass = None
34 self.klass = klass[i:]
37 def __repr__(self): argument
38 return "<%s: %s>" % (self.__class__.__name__, self.name)
40 def mangle(self, name): argument
41 if self.klass is None:
43 return mangle(name, self.klass)
45 def add_def(self, name): argument
46 self.defs[self.mangle(name)] = 1
48 def add_use(self, name): argument
49 self.uses[self.mangle(name)] = 1
51 def add_global(self, name): argument
52 name = self.mangle(name)
53 if name in self.uses or name in self.defs:
55 if name in self.params:
57 (name, self.name)
58 self.globals[name] = 1
59 self.module.add_def(name)
61 def add_param(self, name): argument
62 name = self.mangle(name)
63 self.defs[name] = 1
64 self.params[name] = 1
66 def get_names(self): argument
68 d.update(self.defs)
69 d.update(self.uses)
70 d.update(self.globals)
73 def add_child(self, child): argument
74 self.children.append(child)
76 def get_children(self): argument
77 return self.children
79 def DEBUG(self): argument
80 print >> sys.stderr, self.name, self.nested and "nested" or ""
81 print >> sys.stderr, "\tglobals: ", self.globals
82 print >> sys.stderr, "\tcells: ", self.cells
83 print >> sys.stderr, "\tdefs: ", self.defs
84 print >> sys.stderr, "\tuses: ", self.uses
85 print >> sys.stderr, "\tfrees:", self.frees
87 def check_name(self, name): argument
92 if name in self.globals:
94 if name in self.cells:
96 if name in self.defs:
98 if self.nested and (name in self.frees or name in self.uses):
100 if self.nested:
105 def get_free_vars(self): argument
106 if not self.nested:
109 free.update(self.frees)
110 for name in self.uses.keys():
111 if name not in self.defs and name not in self.globals:
115 def handle_children(self): argument
116 for child in self.children:
118 globals = self.add_frees(frees)
122 def force_global(self, name): argument
135 self.globals[name] = 1
136 if name in self.frees:
137 del self.frees[name]
138 for child in self.children:
142 def add_frees(self, names): argument
146 parent or 2) undefined in a top-level parent. In either case,
151 sc = self.check_name(name)
152 if self.nested:
154 or isinstance(self, ClassScope):
155 self.frees[name] = 1
158 elif isinstance(self, FunctionScope) and sc == SC_LOCAL:
159 self.cells[name] = 1
164 self.cells[name] = 1
169 def get_cell_vars(self): argument
170 return self.cells.keys()
175 def __init__(self): argument
176 self.__super_init("global", self)
186 def __init__(self, module, klass=None): argument
187 i = self.__counter
188 self.__counter += 1
189 self.__super_init("generator expression<%d>"%i, module, klass)
190 self.add_param('.0')
192 def get_names(self): argument
193 keys = Scope.get_names(self)
201 def __init__(self, module, klass=None): argument
202 i = self.__counter
203 self.__counter += 1
204 self.__super_init("lambda.%d" % i, module, klass)
209 def __init__(self, name, module): argument
210 self.__super_init(name, module, name)
213 def __init__(self): argument
214 self.scopes = {}
215 self.klass = None
219 def visitModule(self, node): argument
220 scope = self.module = self.scopes[node] = ModuleScope()
221 self.visit(node.node, scope)
225 def visitFunction(self, node, parent): argument
227 self.visit(node.decorators, parent)
230 self.visit(n, parent)
231 scope = FunctionScope(node.name, self.module, self.klass)
234 self.scopes[node] = scope
235 self._do_args(scope, node.argnames)
236 self.visit(node.code, scope)
237 self.handle_free_vars(scope, parent)
239 def visitGenExpr(self, node, parent): argument
240 scope = GenExprScope(self.module, self.klass);
245 self.scopes[node] = scope
246 self.visit(node.code, scope)
248 self.handle_free_vars(scope, parent)
250 def visitGenExprInner(self, node, scope): argument
252 self.visit(genfor, scope)
254 self.visit(node.expr, scope)
256 def visitGenExprFor(self, node, scope): argument
257 self.visit(node.assign, scope, 1)
258 self.visit(node.iter, scope)
260 self.visit(if_, scope)
262 def visitGenExprIf(self, node, scope): argument
263 self.visit(node.test, scope)
265 def visitLambda(self, node, parent, assign=0): argument
267 # context where assign is passed. The transformer should catch
268 # any code that has a lambda on the left-hand side.
269 assert not assign
272 self.visit(n, parent)
273 scope = LambdaScope(self.module, self.klass)
276 self.scopes[node] = scope
277 self._do_args(scope, node.argnames)
278 self.visit(node.code, scope)
279 self.handle_free_vars(scope, parent)
281 def _do_args(self, scope, args): argument
284 self._do_args(scope, name)
288 def handle_free_vars(self, scope, parent): argument
292 def visitClass(self, node, parent): argument
295 self.visit(n, parent)
296 scope = ClassScope(node.name, self.module)
302 self.scopes[node] = scope
303 prev = self.klass
304 self.klass = node.name
305 self.visit(node.code, scope)
306 self.klass = prev
307 self.handle_free_vars(scope, parent)
311 # XXX a few calls and nodes expect a third "assign" arg that is
313 # expressions contained within statements may have the assign arg.
315 def visitName(self, node, scope, assign=0): argument
316 if assign:
323 def visitFor(self, node, scope): argument
324 self.visit(node.assign, scope, 1)
325 self.visit(node.list, scope)
326 self.visit(node.body, scope)
328 self.visit(node.else_, scope)
330 def visitFrom(self, node, scope): argument
336 def visitImport(self, node, scope): argument
339 if i > -1:
343 def visitGlobal(self, node, scope): argument
347 def visitAssign(self, node, scope): argument
350 The Assign node doesn't itself contains the variables being
352 with the assign flag set to true. When the names occur in
358 the assign flag to their children.
361 self.visit(n, scope, 1)
362 self.visit(node.expr, scope)
364 def visitAssName(self, node, scope, assign=1): argument
367 def visitAssAttr(self, node, scope, assign=0): argument
368 self.visit(node.expr, scope, 0)
370 def visitSubscript(self, node, scope, assign=0): argument
371 self.visit(node.expr, scope, 0)
373 self.visit(n, scope, 0)
375 def visitSlice(self, node, scope, assign=0): argument
376 self.visit(node.expr, scope, 0)
378 self.visit(node.lower, scope, 0)
380 self.visit(node.upper, scope, 0)
382 def visitAugAssign(self, node, scope): argument
385 self.visit(node.node, scope)
387 self.visit(node.node, scope, 1) # XXX worry about this
388 self.visit(node.expr, scope)
394 def visitIf(self, node, scope): argument
397 if type(test.value) in self._const_types:
400 self.visit(test, scope)
401 self.visit(body, scope)
403 self.visit(node.else_, scope)
407 def visitYield(self, node, scope): argument
409 self.visit(node.value, scope)
434 # compare module-level symbols
442 sys.exit(-1)
462 sys.exit(-1)