Commit fc263982 authored by Stefan Behnel's avatar Stefan Behnel

patch for ticket 203 by Prajwal Suhas P

parent 61521d27
...@@ -3967,17 +3967,26 @@ class ForFromStatNode(LoopNode, StatNode): ...@@ -3967,17 +3967,26 @@ class ForFromStatNode(LoopNode, StatNode):
decop = "%s=%s" % (decop[0], step) decop = "%s=%s" % (decop[0], step)
loopvar_name = self.loopvar_node.result() loopvar_name = self.loopvar_node.result()
if from_range: if from_range:
temp_range_bound = code.funcstate.allocate_temp(self.bound2.type, manage_ref=False)
code.putln("%s = %s;" % (temp_range_bound, self.bound2.result()))
# Skip the loop entirely (and avoid assigning to the loopvar) if # Skip the loop entirely (and avoid assigning to the loopvar) if
# the loop is empty: # the loop is empty:
code.putln("if (%s%s %s %s) {" % ( code.putln("if (%s%s %s %s) {" % (
self.bound1.result(), offset, self.relation2, self.bound2.result() self.bound1.result(), offset, self.relation2, temp_range_bound
)) ))
code.putln( code.putln(
"for (%s = %s%s; %s %s %s; %s%s) {" % ( "for (%s = %s%s; %s %s %s; %s%s) {" % (
loopvar_name, loopvar_name,
self.bound1.result(), offset, self.bound1.result(), offset,
loopvar_name, self.relation2, self.bound2.result(), loopvar_name, self.relation2, temp_range_bound,
loopvar_name, incop)) loopvar_name, incop))
else:
code.putln(
"for (%s = %s%s; %s %s %s; %s%s) {" % (
loopvar_name,
self.bound1.result(), offset,
loopvar_name, self.relation2, self.bound2.result(),
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)
...@@ -3988,6 +3997,7 @@ class ForFromStatNode(LoopNode, StatNode): ...@@ -3988,6 +3997,7 @@ class ForFromStatNode(LoopNode, StatNode):
code.putln("} %s%s;" % (loopvar_name, decop)) code.putln("} %s%s;" % (loopvar_name, decop))
# End the outer if statement: # End the outer if statement:
code.putln("} /* end if */") code.putln("} /* end if */")
code.funcstate.release_temp(temp_range_bound)
else: else:
code.putln("}") code.putln("}")
break_label = code.break_label break_label = code.break_label
......
__doc__ = u"""
>>> test_var(10, 5)
at 0
at 1
at 2
at 3
at 4
5
>>> test_func(5)
get_bound(5)
at 0
at 1
at 2
at 3
at 4
5
>>> test_f()
9
>>> f()
g called
0
1
2
2
"""
cdef int get_bound(int m):
print "get_bound(%s)"%m
return m
def test_var(int n, int m):
cdef int i
for i from 0 <= i < n:
print "at", i
n = m
return i
def test_func(int n):
cdef int i
for i from 0 <= i < get_bound(n):
print "at", i
return i
def test_f():
cdef int i,n
n = 10
for i in range(n):
if i == 5: n *= 2
print i
cdef int g():
print "g called"
return 3
def f():
cdef int i
for i in range(g()):
print i
print i
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