Commit fabff41b authored by Stefan Behnel's avatar Stefan Behnel

code simplification in ForInStatNode

parent 6c486666
...@@ -1781,15 +1781,13 @@ class ImportNode(ExprNode): ...@@ -1781,15 +1781,13 @@ class ImportNode(ExprNode):
class IteratorNode(ExprNode): class IteratorNode(ExprNode):
# Used as part of for statement implementation. # Used as part of for statement implementation.
# #
# allocate_counter_temp/release_counter_temp needs to be called
# by parent (ForInStatNode)
#
# Implements result = iter(sequence) # Implements result = iter(sequence)
# #
# sequence ExprNode # sequence ExprNode
type = py_object_type type = py_object_type
iter_func_ptr = None iter_func_ptr = None
counter_cname = None
subexprs = ['sequence'] subexprs = ['sequence']
...@@ -1808,13 +1806,6 @@ class IteratorNode(ExprNode): ...@@ -1808,13 +1806,6 @@ class IteratorNode(ExprNode):
gil_message = "Iterating over Python object" gil_message = "Iterating over Python object"
def allocate_counter_temp(self, code):
self.counter_cname = code.funcstate.allocate_temp(
PyrexTypes.c_py_ssize_t_type, manage_ref=False)
def release_counter_temp(self, code):
code.funcstate.release_temp(self.counter_cname)
_func_iternext_type = PyrexTypes.CPtrType(PyrexTypes.CFuncType( _func_iternext_type = PyrexTypes.CPtrType(PyrexTypes.CFuncType(
PyrexTypes.py_object_type, [ PyrexTypes.py_object_type, [
PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None), PyrexTypes.CFuncTypeArg("it", PyrexTypes.py_object_type, None),
...@@ -1833,6 +1824,8 @@ class IteratorNode(ExprNode): ...@@ -1833,6 +1824,8 @@ class IteratorNode(ExprNode):
self.sequence.py_result(), self.sequence.py_result(),
self.sequence.py_result())) self.sequence.py_result()))
if is_builtin_sequence or self.may_be_a_sequence: if is_builtin_sequence or self.may_be_a_sequence:
self.counter_cname = code.funcstate.allocate_temp(
PyrexTypes.c_py_ssize_t_type, manage_ref=False)
code.putln( code.putln(
"%s = 0; %s = %s; __Pyx_INCREF(%s);" % ( "%s = 0; %s = %s; __Pyx_INCREF(%s);" % (
self.counter_cname, self.counter_cname,
...@@ -1844,8 +1837,8 @@ class IteratorNode(ExprNode): ...@@ -1844,8 +1837,8 @@ class IteratorNode(ExprNode):
if self.may_be_a_sequence: if self.may_be_a_sequence:
code.putln("%s = NULL;" % self.iter_func_ptr) code.putln("%s = NULL;" % self.iter_func_ptr)
code.putln("} else {") code.putln("} else {")
code.putln("%s = -1; %s = PyObject_GetIter(%s); %s" % ( code.put("%s = -1; " % self.counter_cname)
self.counter_cname, code.putln("%s = PyObject_GetIter(%s); %s" % (
self.result(), self.result(),
self.sequence.py_result(), self.sequence.py_result(),
code.error_goto_if_null(self.result(), self.pos))) code.error_goto_if_null(self.result(), self.pos)))
...@@ -1855,6 +1848,7 @@ class IteratorNode(ExprNode): ...@@ -1855,6 +1848,7 @@ class IteratorNode(ExprNode):
code.putln("}") code.putln("}")
def generate_next_sequence_item(self, test_name, result_name, code): def generate_next_sequence_item(self, test_name, result_name, code):
assert self.counter_cname, "internal error: counter_cname temp not prepared"
code.putln( code.putln(
"if (%s >= Py%s_GET_SIZE(%s)) break;" % ( "if (%s >= Py%s_GET_SIZE(%s)) break;" % (
self.counter_cname, self.counter_cname,
...@@ -1901,6 +1895,8 @@ class IteratorNode(ExprNode): ...@@ -1901,6 +1895,8 @@ class IteratorNode(ExprNode):
code.putln("}") code.putln("}")
def free_temps(self, code): def free_temps(self, code):
if self.counter_cname:
code.funcstate.release_temp(self.counter_cname)
if self.iter_func_ptr: if self.iter_func_ptr:
code.funcstate.release_temp(self.iter_func_ptr) code.funcstate.release_temp(self.iter_func_ptr)
self.iter_func_ptr = None self.iter_func_ptr = None
......
...@@ -4644,7 +4644,6 @@ class ForInStatNode(LoopNode, StatNode): ...@@ -4644,7 +4644,6 @@ class ForInStatNode(LoopNode, StatNode):
def generate_execution_code(self, code): def generate_execution_code(self, code):
old_loop_labels = code.new_loop_labels() old_loop_labels = code.new_loop_labels()
self.iterator.allocate_counter_temp(code)
self.iterator.generate_evaluation_code(code) self.iterator.generate_evaluation_code(code)
code.putln("for (;;) {") code.putln("for (;;) {")
self.item.generate_evaluation_code(code) self.item.generate_evaluation_code(code)
...@@ -4676,7 +4675,6 @@ class ForInStatNode(LoopNode, StatNode): ...@@ -4676,7 +4675,6 @@ class ForInStatNode(LoopNode, StatNode):
if code.label_used(break_label): if code.label_used(break_label):
code.put_label(break_label) code.put_label(break_label)
self.iterator.release_counter_temp(code)
self.iterator.generate_disposal_code(code) self.iterator.generate_disposal_code(code)
self.iterator.free_temps(code) self.iterator.free_temps(code)
......
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