From 868538b3e4c19902fc81f5d01549ec684bde3468 Mon Sep 17 00:00:00 2001 From: Dag Sverre Seljebotn Date: Thu, 19 Jun 2008 12:18:18 -0700 Subject: [PATCH] Scope now creating by parse stage in Main --- Cython/Compiler/Main.py | 41 ++++++++++++++++++++--------------- Cython/Compiler/ModuleNode.py | 5 +++++ 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/Cython/Compiler/Main.py b/Cython/Compiler/Main.py index f2c88456..25e5c91f 100644 --- a/Cython/Compiler/Main.py +++ b/Cython/Compiler/Main.py @@ -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 diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index 47e0a034..7061515f 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -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) -- 2.26.2