Commit 33fe1b67 authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

merge

parents 6ff9d8a5 518b87b5
...@@ -1332,6 +1332,10 @@ class ImportNode(ExprNode): ...@@ -1332,6 +1332,10 @@ 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
...@@ -1344,16 +1348,19 @@ class IteratorNode(ExprNode): ...@@ -1344,16 +1348,19 @@ class IteratorNode(ExprNode):
self.type = py_object_type self.type = py_object_type
self.gil_check(env) self.gil_check(env)
self.is_temp = 1 self.is_temp = 1
self.counter = TempNode(self.pos, PyrexTypes.c_py_ssize_t_type, env)
self.counter.allocate_temp(env)
gil_message = "Iterating over Python object" gil_message = "Iterating over Python object"
def release_temp(self, env): def release_temp(self, env):
env.release_temp(self.result()) env.release_temp(self.result())
self.counter.release_temp(env)
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)
def generate_result_code(self, code): def generate_result_code(self, code):
is_builtin_sequence = self.sequence.type is list_type or \ is_builtin_sequence = self.sequence.type is list_type or \
self.sequence.type is tuple_type self.sequence.type is tuple_type
...@@ -1367,7 +1374,7 @@ class IteratorNode(ExprNode): ...@@ -1367,7 +1374,7 @@ class IteratorNode(ExprNode):
self.sequence.py_result())) self.sequence.py_result()))
code.putln( code.putln(
"%s = 0; %s = %s; Py_INCREF(%s);" % ( "%s = 0; %s = %s; Py_INCREF(%s);" % (
self.counter.result(), self.counter_cname,
self.result(), self.result(),
self.sequence.py_result(), self.sequence.py_result(),
self.result())) self.result()))
...@@ -1378,7 +1385,7 @@ class IteratorNode(ExprNode): ...@@ -1378,7 +1385,7 @@ class IteratorNode(ExprNode):
code.error_goto(self.pos)) code.error_goto(self.pos))
else: else:
code.putln("%s = -1; %s = PyObject_GetIter(%s); %s" % ( code.putln("%s = -1; %s = PyObject_GetIter(%s); %s" % (
self.counter.result(), self.counter_cname,
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)))
...@@ -1414,7 +1421,7 @@ class NextNode(AtomicExprNode): ...@@ -1414,7 +1421,7 @@ class NextNode(AtomicExprNode):
prefix, self.iterator.py_result())) prefix, self.iterator.py_result()))
code.putln( code.putln(
"if (%s >= Py%s_GET_SIZE(%s)) break;" % ( "if (%s >= Py%s_GET_SIZE(%s)) break;" % (
self.iterator.counter.result(), self.iterator.counter_cname,
prefix, prefix,
self.iterator.py_result())) self.iterator.py_result()))
code.putln( code.putln(
...@@ -1422,9 +1429,9 @@ class NextNode(AtomicExprNode): ...@@ -1422,9 +1429,9 @@ class NextNode(AtomicExprNode):
self.result(), self.result(),
prefix, prefix,
self.iterator.py_result(), self.iterator.py_result(),
self.iterator.counter.result(), self.iterator.counter_cname,
self.result(), self.result(),
self.iterator.counter.result())) self.iterator.counter_cname))
if len(type_checks) > 1: if len(type_checks) > 1:
code.put("} else ") code.put("} else ")
if len(type_checks) == 1: if len(type_checks) == 1:
......
...@@ -3737,6 +3737,7 @@ class ForInStatNode(LoopNode, StatNode): ...@@ -3737,6 +3737,7 @@ 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( code.putln(
"for (;;) {") "for (;;) {")
...@@ -3753,6 +3754,7 @@ class ForInStatNode(LoopNode, StatNode): ...@@ -3753,6 +3754,7 @@ class ForInStatNode(LoopNode, StatNode):
self.else_clause.generate_execution_code(code) self.else_clause.generate_execution_code(code)
code.putln("}") code.putln("}")
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)
def annotate(self, code): def annotate(self, 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