Propagate env directives the correct way (fallout from cdivision)
authorRobert Bradshaw <robertwb@math.washington.edu>
Thu, 9 Apr 2009 11:50:18 +0000 (04:50 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Thu, 9 Apr 2009 11:50:18 +0000 (04:50 -0700)
Cython/Compiler/Nodes.py
Cython/Compiler/Symtab.py

index 706dbea7c4b2d3355bc7134efebdc88b02f2cf3e..a51027c6d8c61b57bde3315579f0b2c6adc24238 100644 (file)
@@ -1023,6 +1023,7 @@ class FuncDefNode(StatNode, BlockNode):
         if type.is_cfunction:
             lenv.nogil = type.nogil and not type.with_gil
         self.local_scope = lenv
+        lenv.directives = env.directives
         return lenv
                 
     def generate_function_definitions(self, env, code):
@@ -1305,9 +1306,7 @@ class CFuncDefNode(FuncDefNode):
         return self.entry.name
         
     def analyse_declarations(self, env):
-        if 'locals' in env.directives and env.directives['locals']:
-            self.directive_locals = env.directives['locals']
-        directive_locals = self.directive_locals
+        directive_locals = self.directive_locals = env.directives['locals']
         base_type = self.base_type.analyse(env)
         # The 2 here is because we need both function and argument names. 
         name_declarator, type = self.declarator.analyse(base_type, env, nonempty = 2 * (self.body is not None))
@@ -1650,11 +1649,7 @@ class DefNode(FuncDefNode):
                             directive_locals = getattr(cfunc, 'directive_locals', {}))
     
     def analyse_declarations(self, env):
-        if 'locals' in env.directives:
-            directive_locals = env.directives['locals']
-        else:
-            directive_locals = {}
-        self.directive_locals = directive_locals
+        directive_locals = self.directive_locals = env.directives['locals']
         for arg in self.args:
             if hasattr(arg, 'name'):
                 type = arg.type
@@ -2564,6 +2559,7 @@ class PyClassDefNode(ClassDefNode):
     def analyse_declarations(self, env):
         self.target.analyse_target_declaration(env)
         cenv = self.create_scope(env)
+        cenv.directives = env.directives
         cenv.class_obj_cname = self.target.entry.cname
         self.body.analyse_declarations(cenv)
     
@@ -2702,6 +2698,8 @@ class CClassDefNode(ClassDefNode):
         if home_scope is not env and self.visibility == 'extern':
             env.add_imported_entry(self.class_name, self.entry, pos)
         scope = self.entry.type.scope
+        if scope is not None:
+            scope.directives = env.directives
 
         if self.doc and Options.docstrings:
             scope.doc = embed_position(self.pos, self.doc)
@@ -2752,6 +2750,7 @@ class PropertyNode(StatNode):
                 doc_entry = env.get_string_const(
                     self.doc, identifier = False)
                 entry.doc_cname = doc_entry.cname
+            entry.scope.directives = env.directives
             self.body.analyse_declarations(entry.scope)
 
     def analyse_expressions(self, env):
index fdcbe2bbce8ed9a221c6989f98736c01134653db..ff6db3b1f7dcee9a74db60c8f426bb763d6de84d 100644 (file)
@@ -211,7 +211,6 @@ class Scope(object):
     scope_prefix = ""
     in_cinclude = 0
     nogil = 0
-    directives = {}
     
     temp_prefix = Naming.pyrex_prefix