for-from-loop: remember loopvar node instead of its name which may not be known at...
authorStefan Behnel <scoder@users.berlios.de>
Thu, 18 Dec 2008 16:34:34 +0000 (17:34 +0100)
committerStefan Behnel <scoder@users.berlios.de>
Thu, 18 Dec 2008 16:34:34 +0000 (17:34 +0100)
Cython/Compiler/Nodes.py
Cython/Compiler/Optimize.py

index 8500e843b1d08e1ed2ae84219a951c7ea80df56b..86e5b5295f59e0015a671efa2ccf697d40e367b7 100644 (file)
@@ -3798,12 +3798,12 @@ class ForFromStatNode(LoopNode, StatNode):
     #  Used internally:
     #
     #  is_py_target       bool
-    #  loopvar_name       string
+    #  loopvar_node       ExprNode (usually a NameNode or temp node)
     #  py_loopvar_node    PyTempNode or None
     child_attrs = ["target", "bound1", "bound2", "step", "body", "else_clause"]
 
     is_py_target = False
-    loopvar_name = None
+    loopvar_node = None
     py_loopvar_node = None
 
     def analyse_declarations(self, env):
@@ -3811,7 +3811,7 @@ class ForFromStatNode(LoopNode, StatNode):
         self.body.analyse_declarations(env)
         if self.else_clause:
             self.else_clause.analyse_declarations(env)
-    
+
     def analyse_expressions(self, env):
         import ExprNodes
         self.target.analyse_target_types(env)
@@ -3842,14 +3842,14 @@ class ForFromStatNode(LoopNode, StatNode):
             self.is_py_target = 0
             if isinstance(self.target, ExprNodes.IndexNode) and self.target.is_buffer_access:
                 raise error(self.pos, "Buffer indexing not allowed as for loop target.")
-            self.loopvar_name = self.target.entry.cname
+            self.loopvar_node = self.target
             self.py_loopvar_node = None
         else:
             self.is_py_target = 1
             c_loopvar_node = ExprNodes.TempNode(self.pos, 
                 PyrexTypes.c_long_type, env)
             c_loopvar_node.allocate_temps(env)
-            self.loopvar_name = c_loopvar_node.result()
+            self.loopvar_node = c_loopvar_node
             self.py_loopvar_node = \
                 ExprNodes.CloneNode(c_loopvar_node).coerce_to_pyobject(env)
         self.bound1.allocate_temps(env)
@@ -3879,12 +3879,13 @@ class ForFromStatNode(LoopNode, StatNode):
         if self.step is not None:
             self.step.generate_evaluation_code(code)
             incop = "%s=%s" % (incop[0], self.step.result())
+        loopvar_name = self.loopvar_node.result()
         code.putln(
             "for (%s = %s%s; %s %s %s; %s%s) {" % (
-                self.loopvar_name,
+                loopvar_name,
                 self.bound1.result(), offset,
-                self.loopvar_name, self.relation2, self.bound2.result(),
-                self.loopvar_name, incop))
+                loopvar_name, self.relation2, self.bound2.result(),
+                loopvar_name, incop))
         if self.py_loopvar_node:
             self.py_loopvar_node.generate_evaluation_code(code)
             self.target.generate_assignment_code(self.py_loopvar_node, code)
index c7362997241acdf5079c2f46ecdcfedfc099bcf7..1f2836dcb9a470324c28712c435ca2b4a80cc531 100644 (file)
@@ -148,7 +148,7 @@ class IterationTransform(Visitor.VisitorTransform):
             relation2=relation2, bound2=bound2,
             step=step, body=node.body,
             else_clause=node.else_clause,
-            loopvar_name = node.target.entry.cname)
+            loopvar_node=node.target)
         return for_node
 
     def _transform_dict_iteration(self, node, dict_obj, keys, values):