Support retrieving "delayed" temps before or after allocate_temps phase (dead code...
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Tue, 22 Jul 2008 14:57:46 +0000 (16:57 +0200)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Tue, 22 Jul 2008 14:57:46 +0000 (16:57 +0200)
Cython/Compiler/ExprNodes.py
Cython/Compiler/Main.py
Cython/Compiler/Nodes.py
Cython/Compiler/Symtab.py

index 4f02ef1eab18e1ff03ca5735f3629f81aff5b28e..5a19305517d2101917425746c8b60cf49a94e4e7 100644 (file)
@@ -810,6 +810,7 @@ class NameNode(AtomicExprNode):
     
     is_name = 1
     skip_assignment_decref = False
+    entry = None
 
     def create_analysed_rvalue(pos, env, entry):
         node = NameNode(pos)
@@ -845,7 +846,9 @@ class NameNode(AtomicExprNode):
     def analyse_as_module(self, env):
         # Try to interpret this as a reference to a cimported module.
         # Returns the module scope, or None.
-        entry = env.lookup(self.name)
+        entry = self.entry
+        if not entry:
+            entry = env.lookup(self.name)
         if entry and entry.as_module:
             return entry.as_module
         return None
@@ -853,14 +856,17 @@ class NameNode(AtomicExprNode):
     def analyse_as_extension_type(self, env):
         # Try to interpret this as a reference to an extension type.
         # Returns the extension type, or None.
-        entry = env.lookup(self.name)
+        entry = self.entry
+        if not entry:
+            entry = env.lookup(self.name)
         if entry and entry.is_type and entry.type.is_extension_type:
             return entry.type
         else:
             return None
     
     def analyse_target_declaration(self, env):
-        self.entry = env.lookup_here(self.name)
+        if not self.entry:
+            self.entry = env.lookup_here(self.name)
         if not self.entry:
             self.entry = env.declare_var(self.name, py_object_type, self.pos)
         env.control_flow.set_state(self.pos, (self.name, 'initalized'), True)
@@ -870,10 +876,9 @@ class NameNode(AtomicExprNode):
         if self.entry.is_pyglobal and self.entry.is_member:
             env.use_utility_code(type_cache_invalidation_code)
     
-    def analyse_types(self, env, entry=None):
-        if entry is None:
-            entry = env.lookup(self.name)
-        self.entry = entry
+    def analyse_types(self, env):
+        if self.entry is None:
+            self.entry = env.lookup(self.name)
         if not self.entry:
             self.entry = env.declare_builtin(self.name, self.pos)
         if not self.entry:
index ea2ed78d711ff8bd1f967417206e28b17600c74b..6bd15d29f8f0d111656ad51b6d6952a39cf223b0 100644 (file)
@@ -360,6 +360,7 @@ def create_default_pipeline(context, options, result):
     from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
     from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform
     from Optimize import FlattenInListTransform, SwitchTransform, OptimizeRefcounting
+    from CodeGeneration import AnchorTemps
     from Buffer import BufferTransform
     from ModuleNode import check_c_classes
     
@@ -376,6 +377,7 @@ def create_default_pipeline(context, options, result):
         BufferTransform(context),
         SwitchTransform(),
         OptimizeRefcounting(context),
+#        AnchorTemps(context),
 #        CreateClosureClasses(context),
         create_generate_code(context, options, result)
     ]
index 6ad8ce4a2a49bead37cc5e65bb3ee6c111e355e6..302d66898402a998f83366ec53d188a411a7477e 100644 (file)
@@ -73,6 +73,7 @@ class Node(object):
     
     is_name = 0
     is_literal = 0
+    temps = None
 
     # All descandants should set child_attrs to a list of the attributes
     # containing nodes considered "children" in the tree. Each such attribute
index 05d38cc79cf4c2d055039f081c3b6174567857ab..48c0fada31ae99ff1b516d06d4168db355c3490b 100644 (file)
@@ -141,6 +141,15 @@ class Entry:
     def redeclared(self, pos):
         error(pos, "'%s' does not match previous declaration" % self.name)
         error(self.pos, "Previous declaration is here")
+
+def new_temp(type, description=""):
+    # Returns a temporary entry which is "floating" and not finally resolved
+    # before the AnchorTemps transform is run. cname will not be available on
+    # the temp before this transform is run. See the mentioned transform for
+    # more docs.
+    e = Entry(name="$" + description, type=type, cname="<temperror>")
+    e.is_variable = True
+    return e
         
 class Scope:
     # name              string             Unqualified name