def generate_code(module_node):
scope = module_node.scope
result = create_default_resultobj(module_node.compilation_source, options)
- module_node.process_implementation(scope, options, result)
+ module_node.process_implementation(options, result)
return result
return generate_code
def create_default_pipeline(context, options):
from ParseTreeTransforms import WithTransform, PostParse
+ from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
+ from ModuleNode import check_c_classes
+
return [
create_parse(context),
PostParse(),
WithTransform(),
+ AnalyseDeclarationsTransform(),
+ check_c_classes,
+ AnalyseExpressionsTransform(),
create_generate_code(context, options)
]
from Cython.Utils import open_new_file, replace_suffix
+def check_c_classes(module_node):
+ module_node.scope.check_c_classes()
+ return module_node
+
class ModuleNode(Nodes.Node, Nodes.BlockNode):
# doc string or None
# body StatListNode
env.doc = self.doc
self.body.analyse_declarations(env)
- def process_implementation(self, env, options, result):
- # Currently, scope is also set by the parse step in Main.py; they will be the same
- assert self.scope is env
- self.scope = env
- from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
- AnalyseDeclarationsTransform(env).visit_ModuleNode(self) # self.analyse_declarations(env)
- env.check_c_classes()
- AnalyseExpressionsTransform().visit_ModuleNode(self) # self.body.analyse_expressions(env)
+ def process_implementation(self, options, result):
+ env = self.scope
env.return_type = PyrexTypes.c_void_type
self.referenced_modules = []
self.find_referenced_modules(env, self.referenced_modules, {})
class AnalyseDeclarationsTransform(VisitorTransform):
- def __init__(self, env):
- VisitorTransform.__init__(self)
- self.env_stack = [env]
+ def __call__(self, root):
+ self.env_stack = [root.scope]
+ return super(AnalyseDeclarationsTransform, self).__call__(root)
def visit_ModuleNode(self, node):
node.analyse_declarations(self.env_stack[-1])
self.visitchildren(node)
return node
-
+
def visit_FuncDefNode(self, node):
lenv = node.create_local_scope(self.env_stack[-1])
node.body.analyse_control_flow(lenv) # this will be totally refactored