def create_local_scope(self, env):
genv = env
- while env.is_py_class_scope or env.is_c_class_scope:
- env = env.outer_scope
+ while genv.is_py_class_scope or genv.is_c_class_scope:
+ genv = env.outer_scope
if self.needs_closure:
- lenv = GeneratorLocalScope(name = self.entry.name, outer_scope = genv, parent_scope = env)
+ lenv = ClosureScope(name = self.entry.name, scope_name = self.entry.cname, outer_scope = genv)
else:
- lenv = LocalScope(name = self.entry.name, outer_scope = genv)
+ lenv = LocalScope(name = self.entry.name, outer_scope = genv, parent_scope = env)
lenv.return_type = self.return_type
type = self.entry.type
if type.is_cfunction:
self.visitchildren(node)
self.seen_vars_stack.pop()
return node
-
+
+ def visit_LambdaNode(self, node):
+ node.analyse_declarations(self.env_stack[-1])
+ self.visitchildren(node)
+ return node
+
+ def visit_ClassDefNode(self, node):
+ self.env_stack.append(node.scope)
+ self.visitchildren(node)
+ self.env_stack.pop()
+ return node
+
def visit_FuncDefNode(self, node):
self.seen_vars_stack.append(set())
lenv = node.create_local_scope(self.env_stack[-1])
from TypeInference import PyObjectTypeInferer
PyObjectTypeInferer().infer_types(self)
-class LocalScope(Scope):
+class LocalScope(Scope):
- def __init__(self, name, outer_scope):
- Scope.__init__(self, name, outer_scope, outer_scope)
+ def __init__(self, name, outer_scope, parent_scope = None):
+ if parent_scope is None:
+ parent_scope = outer_scope
+ Scope.__init__(self, name, outer_scope, parent_scope)
def mangle(self, prefix, name):
return prefix + name