Commit f018513e authored by scoder's avatar scoder

Merge pull request #352 from BigFav/reverse_range_optimize

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