Commit aa2cc986 authored by Stefan Behnel's avatar Stefan Behnel

for-from-loop: remember loopvar node instead of its name which may not be known at analysis phase

parent d5f88aac
...@@ -3798,12 +3798,12 @@ class ForFromStatNode(LoopNode, StatNode): ...@@ -3798,12 +3798,12 @@ class ForFromStatNode(LoopNode, StatNode):
# Used internally: # Used internally:
# #
# is_py_target bool # is_py_target bool
# loopvar_name string # loopvar_node ExprNode (usually a NameNode or temp node)
# py_loopvar_node PyTempNode or None # py_loopvar_node PyTempNode or None
child_attrs = ["target", "bound1", "bound2", "step", "body", "else_clause"] child_attrs = ["target", "bound1", "bound2", "step", "body", "else_clause"]
is_py_target = False is_py_target = False
loopvar_name = None loopvar_node = None
py_loopvar_node = None py_loopvar_node = None
def analyse_declarations(self, env): def analyse_declarations(self, env):
...@@ -3811,7 +3811,7 @@ class ForFromStatNode(LoopNode, StatNode): ...@@ -3811,7 +3811,7 @@ class ForFromStatNode(LoopNode, StatNode):
self.body.analyse_declarations(env) self.body.analyse_declarations(env)
if self.else_clause: if self.else_clause:
self.else_clause.analyse_declarations(env) self.else_clause.analyse_declarations(env)
def analyse_expressions(self, env): def analyse_expressions(self, env):
import ExprNodes import ExprNodes
self.target.analyse_target_types(env) self.target.analyse_target_types(env)
...@@ -3842,14 +3842,14 @@ class ForFromStatNode(LoopNode, StatNode): ...@@ -3842,14 +3842,14 @@ class ForFromStatNode(LoopNode, StatNode):
self.is_py_target = 0 self.is_py_target = 0
if isinstance(self.target, ExprNodes.IndexNode) and self.target.is_buffer_access: if isinstance(self.target, ExprNodes.IndexNode) and self.target.is_buffer_access:
raise error(self.pos, "Buffer indexing not allowed as for loop target.") 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 self.py_loopvar_node = None
else: else:
self.is_py_target = 1 self.is_py_target = 1
c_loopvar_node = ExprNodes.TempNode(self.pos, c_loopvar_node = ExprNodes.TempNode(self.pos,
PyrexTypes.c_long_type, env) PyrexTypes.c_long_type, env)
c_loopvar_node.allocate_temps(env) c_loopvar_node.allocate_temps(env)
self.loopvar_name = c_loopvar_node.result() self.loopvar_node = c_loopvar_node
self.py_loopvar_node = \ self.py_loopvar_node = \
ExprNodes.CloneNode(c_loopvar_node).coerce_to_pyobject(env) ExprNodes.CloneNode(c_loopvar_node).coerce_to_pyobject(env)
self.bound1.allocate_temps(env) self.bound1.allocate_temps(env)
...@@ -3879,12 +3879,13 @@ class ForFromStatNode(LoopNode, StatNode): ...@@ -3879,12 +3879,13 @@ class ForFromStatNode(LoopNode, StatNode):
if self.step is not None: if self.step is not None:
self.step.generate_evaluation_code(code) self.step.generate_evaluation_code(code)
incop = "%s=%s" % (incop[0], self.step.result()) incop = "%s=%s" % (incop[0], self.step.result())
loopvar_name = self.loopvar_node.result()
code.putln( code.putln(
"for (%s = %s%s; %s %s %s; %s%s) {" % ( "for (%s = %s%s; %s %s %s; %s%s) {" % (
self.loopvar_name, loopvar_name,
self.bound1.result(), offset, self.bound1.result(), offset,
self.loopvar_name, self.relation2, self.bound2.result(), loopvar_name, self.relation2, self.bound2.result(),
self.loopvar_name, incop)) loopvar_name, incop))
if self.py_loopvar_node: if self.py_loopvar_node:
self.py_loopvar_node.generate_evaluation_code(code) self.py_loopvar_node.generate_evaluation_code(code)
self.target.generate_assignment_code(self.py_loopvar_node, code) self.target.generate_assignment_code(self.py_loopvar_node, code)
......
...@@ -148,7 +148,7 @@ class IterationTransform(Visitor.VisitorTransform): ...@@ -148,7 +148,7 @@ class IterationTransform(Visitor.VisitorTransform):
relation2=relation2, bound2=bound2, relation2=relation2, bound2=bound2,
step=step, body=node.body, step=step, body=node.body,
else_clause=node.else_clause, else_clause=node.else_clause,
loopvar_name = node.target.entry.cname) loopvar_node=node.target)
return for_node return for_node
def _transform_dict_iteration(self, node, dict_obj, keys, values): def _transform_dict_iteration(self, node, dict_obj, keys, values):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment