self.target.analyse_target_types(env)
self.iterator.analyse_expressions(env)
self.item = ExprNodes.NextNode(self.iterator, env)
- self.item = self.item.coerce_to(self.target.type, env)
+ if (self.iterator.type.is_ptr or self.iterator.type.is_array) and \
+ self.target.type.assignable_from(self.iterator.type):
+ # C array slice optimization.
+ pass
+ else:
+ self.item = self.item.coerce_to(self.target.type, env)
self.body.analyse_expressions(env)
if self.else_clause:
self.else_clause.analyse_expressions(env)
base=counter_temp,
type=Builtin.bytes_type,
is_temp=1)
+ elif node.target.type.is_ptr and not node.target.type.assignable_from(ptr_type.base_type):
+ # Allow iteration with pointer target to avoid copy.
+ target_value = counter_temp
else:
target_value = ExprNodes.IndexNode(
node.target.pos,
"""
cdef double d
print [ d for d in cdoubles ]
+
+
+cdef struct MyStruct:
+ int i
+
+def struct_ptr_iter():
+ """
+ >>> struct_ptr_iter()
+ ([0, 1, 2, 3, 4], [0, 1, 2, 3, 4])
+ """
+ cdef MyStruct my_structs[5]
+ for i in range(5):
+ my_structs[i].i = i
+ cdef MyStruct value
+ cdef MyStruct *ptr
+ return [ value.i for value in my_structs[:5] ], [ ptr.i for ptr in my_structs[:5] ]