Commit 93ade469 authored by Stefan Behnel's avatar Stefan Behnel

infer type of slices for some builtin types

parent ae84b380
......@@ -1942,8 +1942,12 @@ class IndexNode(ExprNode):
return self.base.type_dependencies(env)
def infer_type(self, env):
is_slice = isinstance(self.index, SliceNode)
if isinstance(self.base, BytesNode):
return py_object_type
if is_slice:
return bytes_type
else:
return py_object_type # Py2/3 return different types
base_type = self.base.infer_type(env)
if base_type.is_ptr or base_type.is_array:
return base_type.base_type
......@@ -1957,7 +1961,10 @@ class IndexNode(ExprNode):
# on a subsequent PyObject coercion.
return PyrexTypes.c_py_unicode_type
elif base_type in (str_type, unicode_type):
# these types will always return themselves on Python indexing
# these types will always return their own type on Python indexing/slicing
return base_type
elif is_slice and base_type in (bytes_type, list_type, tuple_type):
# slicing these returns the same type
return base_type
else:
# TODO: Handle buffers (hopefully without too much redundancy).
......
......@@ -68,10 +68,14 @@ def slicing():
assert typeof(L) == "list object", typeof(L)
L1 = L[1:2]
assert typeof(L1) == "list object", typeof(L1)
L2 = L[1:2:2]
assert typeof(L2) == "list object", typeof(L2)
t = (4,5,6)
assert typeof(t) == "tuple object", typeof(t)
t1 = t[1:2]
assert typeof(t1) == "tuple object", typeof(t1)
t2 = t[1:2:2]
assert typeof(t2) == "tuple object", typeof(t2)
def indexing():
"""
......
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