from cython import foo
authorRobert Bradshaw <robertwb@math.washington.edu>
Tue, 7 Oct 2008 05:12:53 +0000 (22:12 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Tue, 7 Oct 2008 05:12:53 +0000 (22:12 -0700)
Cython/Compiler/ExprNodes.py
Cython/Compiler/ParseTreeTransforms.py

index 46323cd697602d8f37b411fee7f172b91cf33c7e..8bb8cfaef625f9e91231c1274a830a23cf123af5 100644 (file)
@@ -857,6 +857,7 @@ class NameNode(AtomicExprNode):
     
     is_name = True
     is_cython_module = False
+    cython_attribute = None
     skip_assignment_decref = False
     entry = None
 
@@ -864,6 +865,9 @@ class NameNode(AtomicExprNode):
         node = NameNode(pos)
         node.analyse_types(env, entry=entry)
         return node
+        
+    def as_cython_attribute(self):
+        return self.cython_attribute
     
     create_analysed_rvalue = staticmethod(create_analysed_rvalue)
     
index c04b2e22e4f2608bde607b63d9defa70ef7a5d60..d8d97f07281a0a4a9d15976dc47ed236c73ec0f3 100644 (file)
@@ -300,16 +300,32 @@ class InterpretCompilerDirectives(CythonTransform):
             newimp = []
             for pos, name, as_name, kind in node.imported_names:
                 if name in Options.option_types:
+                    if as_name is None:
+                        as_name = name
                     self.option_names[as_name] = name
                     if kind is not None:
                         self.context.nonfatal_error(PostParseError(pos,
                             "Compiler option imports must be plain imports"))
-                    return None
                 else:
                     newimp.append((pos, name, as_name, kind))
-            node.imported_names = newimpo
+            if not newimp:
+                return None
+            node.imported_names = newimp
         return node
         
+    def visit_FromImportStatNode(self, node):
+        if node.module.module_name.value == u"cython":
+            newimp = []
+            for true_name, name_node in node.items:
+                if true_name in Options.option_types:
+                    self.option_names[name_node.name] = true_name
+                else:
+                    newimp.append((true_name, name_node))
+            if not newimp:
+                return None
+            node.items = newimp
+        return node
+
     def visit_SingleAssignmentNode(self, node):
         if (isinstance(node.rhs, ImportNode) and
                 node.rhs.module_name.value == u'cython'):
@@ -324,8 +340,10 @@ class InterpretCompilerDirectives(CythonTransform):
     def visit_NameNode(self, node):
         if node.name in self.cython_module_names:
             node.is_cython_module = True
+        else:
+            node.cython_attribute = self.option_names.get(node.name)
         return node
-
+        
     def visit_Node(self, node):
         self.visitchildren(node)
         return node
@@ -336,13 +354,15 @@ class InterpretCompilerDirectives(CythonTransform):
         # Otherwise, returns None
         optname = None
         if isinstance(node, CallNode):
-            if (isinstance(node.function, AttributeNode) and
-                  isinstance(node.function.obj, NameNode) and
-                  node.function.obj.name in self.cython_module_names):
-                optname = node.function.attribute
-            elif (isinstance(node.function, NameNode) and
-                  node.function.name in self.option_names):
-                optname = self.option_names[node.function.name]
+            self.visit(node.function)
+            optname = node.function.as_cython_attribute()
+#            if (isinstance(node.function, AttributeNode) and
+#                  isinstance(node.function.obj, NameNode) and
+#                  node.function.obj.name in self.cython_module_names):
+#                optname = node.function.attribute
+#            elif (isinstance(node.function, NameNode) and
+#                  node.function.name in self.option_names):
+#                optname = self.option_names[node.function.name]
 
         if optname:
             optiontype = Options.option_types.get(optname)