Commit 99c1309f authored by Stefan Behnel's avatar Stefan Behnel

infer type of loop variable when for-in-looping over pointers, C arrays, unicode strings, etc.

parent 310c7329
......@@ -70,7 +70,15 @@ class MarkAssignments(CythonTransform):
sequence.args[0],
sequence.args[2]))
if not is_special:
self.mark_assignment(node.target, object_expr)
# A for-loop basically translates to subsequent calls to
# __getitem__(), so using an IndexNode here allows us to
# naturally infer the base type of pointers, C arrays,
# Python strings, etc., while correctly falling back to an
# object type when the base type cannot be handled.
self.mark_assignment(node.target, ExprNodes.IndexNode(
node.pos,
base = sequence,
index = ExprNodes.IntNode(node.pos, value = '0')))
self.visitchildren(node)
return node
......
......@@ -187,6 +187,46 @@ def loop():
pass
assert typeof(a) == "long"
def loop_over_charptr():
"""
>>> print( loop_over_charptr() )
char
"""
cdef char* char_ptr_string = 'abcdefg'
for c in char_ptr_string:
pass
return typeof(c)
def loop_over_bytes():
"""
>>> print( loop_over_bytes() )
Python object
"""
cdef bytes bytes_string = b'abcdefg'
for c in bytes_string:
pass
return typeof(c)
def loop_over_unicode():
"""
>>> print( loop_over_unicode() )
Py_UNICODE
"""
cdef unicode ustring = u'abcdefg'
for uchar in ustring:
pass
return typeof(uchar)
def loop_over_int_array():
"""
>>> print( loop_over_int_array() )
int
"""
cdef int[10] int_array
for i in int_array:
pass
return typeof(i)
cdef unicode retu():
return u"12345"
......
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