Commit 74a20277 authored by Stefan Behnel's avatar Stefan Behnel

drop redundant specialisation code from for-in loop if we know it's not a list or tuple

parent 2fd9231a
...@@ -1518,22 +1518,24 @@ class IteratorNode(ExprNode): ...@@ -1518,22 +1518,24 @@ class IteratorNode(ExprNode):
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
may_be_a_sequence = is_builtin_sequence or not self.sequence.type.is_builtin_type
if is_builtin_sequence: if is_builtin_sequence:
code.putln( code.putln(
"if (likely(%s != Py_None)) {" % self.sequence.py_result()) "if (likely(%s != Py_None)) {" % self.sequence.py_result())
else: elif may_be_a_sequence:
code.putln( code.putln(
"if (PyList_CheckExact(%s) || PyTuple_CheckExact(%s)) {" % ( "if (PyList_CheckExact(%s) || PyTuple_CheckExact(%s)) {" % (
self.sequence.py_result(), self.sequence.py_result(),
self.sequence.py_result())) self.sequence.py_result()))
code.putln( if may_be_a_sequence:
"%s = 0; %s = %s; __Pyx_INCREF(%s);" % ( code.putln(
self.counter_cname, "%s = 0; %s = %s; __Pyx_INCREF(%s);" % (
self.result(), self.counter_cname,
self.sequence.py_result(), self.result(),
self.result())) self.sequence.py_result(),
code.putln("} else {") self.result()))
code.putln("} else {")
if is_builtin_sequence: if is_builtin_sequence:
code.putln( code.putln(
'PyErr_SetString(PyExc_TypeError, "\'NoneType\' object is not iterable"); %s' % 'PyErr_SetString(PyExc_TypeError, "\'NoneType\' object is not iterable"); %s' %
...@@ -1545,7 +1547,8 @@ class IteratorNode(ExprNode): ...@@ -1545,7 +1547,8 @@ class IteratorNode(ExprNode):
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)))
code.put_gotref(self.py_result()) code.put_gotref(self.py_result())
code.putln("}") if may_be_a_sequence:
code.putln("}")
class NextNode(AtomicExprNode): class NextNode(AtomicExprNode):
...@@ -1564,12 +1567,15 @@ class NextNode(AtomicExprNode): ...@@ -1564,12 +1567,15 @@ class NextNode(AtomicExprNode):
self.is_temp = 1 self.is_temp = 1
def generate_result_code(self, code): def generate_result_code(self, code):
if self.iterator.sequence.type is list_type: sequence_type = self.iterator.sequence.type
if sequence_type is list_type:
type_checks = [(list_type, "List")] type_checks = [(list_type, "List")]
elif self.iterator.sequence.type is tuple_type: elif sequence_type is tuple_type:
type_checks = [(tuple_type, "Tuple")] type_checks = [(tuple_type, "Tuple")]
else: elif not sequence_type.is_builtin_type:
type_checks = [(list_type, "List"), (tuple_type, "Tuple")] type_checks = [(list_type, "List"), (tuple_type, "Tuple")]
else:
type_checks = []
for py_type, prefix in type_checks: for py_type, prefix in type_checks:
if len(type_checks) > 1: if len(type_checks) > 1:
......
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