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): ...@@ -1942,8 +1942,12 @@ class IndexNode(ExprNode):
return self.base.type_dependencies(env) return self.base.type_dependencies(env)
def infer_type(self, env): def infer_type(self, env):
is_slice = isinstance(self.index, SliceNode)
if isinstance(self.base, BytesNode): 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) base_type = self.base.infer_type(env)
if base_type.is_ptr or base_type.is_array: if base_type.is_ptr or base_type.is_array:
return base_type.base_type return base_type.base_type
...@@ -1957,7 +1961,10 @@ class IndexNode(ExprNode): ...@@ -1957,7 +1961,10 @@ class IndexNode(ExprNode):
# on a subsequent PyObject coercion. # on a subsequent PyObject coercion.
return PyrexTypes.c_py_unicode_type return PyrexTypes.c_py_unicode_type
elif base_type in (str_type, 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 return base_type
else: else:
# TODO: Handle buffers (hopefully without too much redundancy). # TODO: Handle buffers (hopefully without too much redundancy).
......
...@@ -68,10 +68,14 @@ def slicing(): ...@@ -68,10 +68,14 @@ def slicing():
assert typeof(L) == "list object", typeof(L) assert typeof(L) == "list object", typeof(L)
L1 = L[1:2] L1 = L[1:2]
assert typeof(L1) == "list object", typeof(L1) assert typeof(L1) == "list object", typeof(L1)
L2 = L[1:2:2]
assert typeof(L2) == "list object", typeof(L2)
t = (4,5,6) t = (4,5,6)
assert typeof(t) == "tuple object", typeof(t) assert typeof(t) == "tuple object", typeof(t)
t1 = t[1:2] t1 = t[1:2]
assert typeof(t1) == "tuple object", typeof(t1) assert typeof(t1) == "tuple object", typeof(t1)
t2 = t[1:2:2]
assert typeof(t2) == "tuple object", typeof(t2)
def indexing(): 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