Commit ad10cfea authored by Stefan Behnel's avatar Stefan Behnel

removed original iter-range optimisation (now replaced by a transform)

parent 85164e8e
...@@ -3687,58 +3687,10 @@ class ForInStatNode(LoopNode, StatNode): ...@@ -3687,58 +3687,10 @@ class ForInStatNode(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_range_step(self, args):
import ExprNodes
# The direction must be determined at compile time to set relations.
# Otherwise, return False.
if len(args) < 3:
self.step = ExprNodes.IntNode(pos = args[0].pos, value='1')
self.relation1 = '<='
self.relation2 = '<'
return True
else:
step = args[2]
if isinstance(step, ExprNodes.UnaryMinusNode) and isinstance(step.operand, ExprNodes.IntNode):
step = ExprNodes.IntNode(pos = step.pos, value=str(-int(step.operand.value, 0)))
if isinstance(step, ExprNodes.IntNode):
step_value = int(step.value, 0)
if step_value > 0:
self.step = step
self.relation1 = '<='
self.relation2 = '<'
return True
elif step_value < 0:
self.step = ExprNodes.IntNode(pos = step.pos, value=str(-step_value))
self.relation1 = '>='
self.relation2 = '>'
return True
return False
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)
if False: # Options.convert_range and self.target.type.is_int:
sequence = self.iterator.sequence
if isinstance(sequence, ExprNodes.SimpleCallNode) \
and sequence.self is None \
and isinstance(sequence.function, ExprNodes.NameNode) \
and (sequence.function.name == 'range' or sequence.function.name == 'xrange'):
args = sequence.args
# Make sure we can determine direction from step
if self.analyse_range_step(args):
# Mutate to ForFrom loop type
self.__class__ = ForFromStatNode
if len(args) == 1:
self.bound1 = ExprNodes.IntNode(pos = sequence.pos, value='0')
self.bound2 = args[0]
else:
self.bound1 = args[0]
self.bound2 = args[1]
ForFromStatNode.analyse_expressions(self, env)
return
self.iterator.analyse_expressions(env) self.iterator.analyse_expressions(env)
self.item = ExprNodes.NextNode(self.iterator, env) self.item = ExprNodes.NextNode(self.iterator, env)
self.item = self.item.coerce_to(self.target.type, env) self.item = self.item.coerce_to(self.target.type, env)
......
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