Commit 63f591a3 authored by root's avatar root

Optimized reversed range with negative steps.

parent 4f0ff235
......@@ -661,23 +661,30 @@ class IterationTransform(Visitor.EnvTransform):
if reversed:
bound1, bound2 = bound2, bound1
if step_value < 0:
if step_value != -1:
# FIXME: not currently supported
return node
step_value = -step_value
if step_value != 1:
begin_value = bound2.constant_result
end_value = bound1.constant_result
if isinstance(begin_value, (int, long)) and isinstance(end_value, (int, long)):
bound1_value = begin_value - step_value * ((begin_value - end_value - 1) // step_value) - 1
bound1 = ExprNodes.IntNode(
bound1.pos, value=str(bound1_value), constant_result=bound1_value,
type=PyrexTypes.spanning_type(bound1.type, bound2.type))
else:
# FIXME: Optimize when variable is in range (e.g. reversed(range(x, y, -3)))
return node
elif step_value != 1:
begin_value = bound1.constant_result
end_value = bound2.constant_result
if isinstance(begin_value, (int, long)) and isinstance(end_value, (int, long)):
bound1_value = step_value * ((begin_value - end_value - 1) // step_value) + end_value + 1
bound1_value = end_value + step_value * ((begin_value - end_value - 1) // step_value) + 1
bound1 = ExprNodes.IntNode(
bound1.pos, value=str(bound1_value), constant_result=bound1_value,
type=PyrexTypes.spanning_type(bound1.type, bound2.type))
else:
# FIXME: Optimize when variable is in range (e.g. reversed(range(x, y, 3)))
return node
else:
if step_value < 0:
elif step_value < 0:
step_value = -step_value
step.value = str(step_value)
......
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