Scope now creating by parse stage in Main
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Thu, 19 Jun 2008 19:18:18 +0000 (12:18 -0700)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Thu, 19 Jun 2008 19:18:18 +0000 (12:18 -0700)
Cython/Compiler/Main.py
Cython/Compiler/ModuleNode.py

index f2c88456d1484f4df0d88dc68241062c80e62832..25e5c91ff568aa0728aadeea873549e84ec2cab3 100644 (file)
@@ -318,40 +318,50 @@ class Context:
         
 
 class CompilationSource(object):
-    def __init__(self, source_desc, full_module_name):
+    """
+    Contains the data necesarry to start up a compilation pipeline for
+    a single compilation source (= file, usually).
+    """
+    def __init__(self, source_desc, full_module_name, cwd):
         self.source_desc = source_desc
         self.full_module_name = full_module_name
+        self.cwd = cwd
 
-def create_parse(context, scope):
+def create_parse(context):
     def parse(compsrc):
         source_desc = compsrc.source_desc
         full_module_name = compsrc.full_module_name
+        initial_pos = (source_desc, 1, 0)
+        scope = context.find_module(full_module_name, pos = initial_pos, need_pxd = 0)
         tree = context.parse(source_desc, scope, pxd = 0, full_module_name = full_module_name)
         tree.compilation_source = compsrc
+        tree.scope = scope
         return tree
     return parse
 
-def create_generate_code(context, scope, options):
-    def generate_code(tree):
-        result = create_default_resultobj(tree.compilation_source.source_desc, options, os.getcwd())
-        tree.process_implementation(scope, options, result)
+def create_generate_code(context, options):
+    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)
         return result
     return generate_code
 
-def create_default_pipeline(context, scope, options):
+def create_default_pipeline(context, options):
     from ParseTreeTransforms import WithTransform, PostParse
     return [
-        create_parse(context, scope),
+        create_parse(context),
         PostParse(),
         WithTransform(),
-        create_generate_code(context, scope, options)
+        create_generate_code(context, options)
     ]
 
-def create_default_resultobj(source_desc, options, cwd):
+def create_default_resultobj(compilation_source, options):
     result = CompilationResult()
-    result.main_source_file = source_desc.filename
+    result.main_source_file = compilation_source.source_desc.filename
+    source_desc = compilation_source.source_desc
     if options.output_file:
-        result.c_file = os.path.join(cwd, options.output_file)
+        result.c_file = os.path.join(compilation_source.cwd, options.output_file)
     else:
         if options.cplus:
             c_suffix = ".cpp"
@@ -379,13 +389,10 @@ def run_pipeline(source, options = None, full_module_name = None):
     cwd = os.getcwd()
     source_desc = FileSourceDescriptor(os.path.join(cwd, source))
     full_module_name = full_module_name or context.extract_module_name(source, options)
-    source = CompilationSource(source_desc, full_module_name)
+    source = CompilationSource(source_desc, full_module_name, cwd)
 
     # Get pipeline
-    initial_pos = (source_desc, 1, 0)
-    scope = context.find_module(full_module_name, pos = initial_pos, need_pxd = 0)
-
-    pipeline = create_default_pipeline(context, scope, options)
+    pipeline = create_default_pipeline(context, options)
 
     data = source
     errors_occurred = False
index 47e0a034e7b30b8bc5edb332243f06569fe3bb3d..7061515ff045291042d175b90cf9138d502649fe 100644 (file)
@@ -32,6 +32,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
     #  referenced_modules   [ModuleScope]
     #  module_temp_cname    string
     #  full_module_name     string
+    #
+    #  scope                The module scope.
+    #  compilation_source   A CompilationSource (see Main)
 
     child_attrs = ["body"]
     
@@ -45,6 +48,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
         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)