Commit e6429bcd authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Pulled transforms from ModuleNode to Main

parent 868538b3
...@@ -343,16 +343,22 @@ def create_generate_code(context, options): ...@@ -343,16 +343,22 @@ def create_generate_code(context, options):
def generate_code(module_node): def generate_code(module_node):
scope = module_node.scope scope = module_node.scope
result = create_default_resultobj(module_node.compilation_source, options) 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 result
return generate_code return generate_code
def create_default_pipeline(context, options): def create_default_pipeline(context, options):
from ParseTreeTransforms import WithTransform, PostParse from ParseTreeTransforms import WithTransform, PostParse
from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
from ModuleNode import check_c_classes
return [ return [
create_parse(context), create_parse(context),
PostParse(), PostParse(),
WithTransform(), WithTransform(),
AnalyseDeclarationsTransform(),
check_c_classes,
AnalyseExpressionsTransform(),
create_generate_code(context, options) create_generate_code(context, options)
] ]
......
...@@ -25,6 +25,10 @@ from PyrexTypes import py_object_type ...@@ -25,6 +25,10 @@ from PyrexTypes import py_object_type
from Cython.Utils import open_new_file, replace_suffix 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): class ModuleNode(Nodes.Node, Nodes.BlockNode):
# doc string or None # doc string or None
# body StatListNode # body StatListNode
...@@ -47,14 +51,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -47,14 +51,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
env.doc = self.doc env.doc = self.doc
self.body.analyse_declarations(env) self.body.analyse_declarations(env)
def process_implementation(self, env, options, result): def process_implementation(self, options, result):
# Currently, scope is also set by the parse step in Main.py; they will be the same env = self.scope
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)
env.return_type = PyrexTypes.c_void_type env.return_type = PyrexTypes.c_void_type
self.referenced_modules = [] self.referenced_modules = []
self.find_referenced_modules(env, self.referenced_modules, {}) self.find_referenced_modules(env, self.referenced_modules, {})
......
...@@ -145,15 +145,15 @@ class WithTransform(VisitorTransform): ...@@ -145,15 +145,15 @@ class WithTransform(VisitorTransform):
class AnalyseDeclarationsTransform(VisitorTransform): class AnalyseDeclarationsTransform(VisitorTransform):
def __init__(self, env): def __call__(self, root):
VisitorTransform.__init__(self) self.env_stack = [root.scope]
self.env_stack = [env] return super(AnalyseDeclarationsTransform, self).__call__(root)
def visit_ModuleNode(self, node): def visit_ModuleNode(self, node):
node.analyse_declarations(self.env_stack[-1]) node.analyse_declarations(self.env_stack[-1])
self.visitchildren(node) self.visitchildren(node)
return node return node
def visit_FuncDefNode(self, node): def visit_FuncDefNode(self, node):
lenv = node.create_local_scope(self.env_stack[-1]) lenv = node.create_local_scope(self.env_stack[-1])
node.body.analyse_control_flow(lenv) # this will be totally refactored node.body.analyse_control_flow(lenv) # this will be totally refactored
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment