Commit 680bd22d authored by Stefan Behnel's avatar Stefan Behnel

enable .pop() optimisation also for typed lists

parent 485c6f90
...@@ -1693,6 +1693,8 @@ class OptimizeBuiltinCalls(Visitor.EnvTransform): ...@@ -1693,6 +1693,8 @@ class OptimizeBuiltinCalls(Visitor.EnvTransform):
return node return node
_handle_simple_method_list_pop = _handle_simple_method_object_pop
PyList_Append_func_type = PyrexTypes.CFuncType( PyList_Append_func_type = PyrexTypes.CFuncType(
PyrexTypes.c_int_type, [ PyrexTypes.c_int_type, [
PyrexTypes.CFuncTypeArg("list", PyrexTypes.py_object_type, None), PyrexTypes.CFuncTypeArg("list", PyrexTypes.py_object_type, None),
......
...@@ -32,6 +32,30 @@ def simple_pop(L): ...@@ -32,6 +32,30 @@ def simple_pop(L):
""" """
return L.pop() return L.pop()
@cython.test_assert_path_exists('//PythonCapiCallNode')
@cython.test_fail_if_path_exists('//SimpleCallNode/AttributeNode')
def simple_pop_typed(list L):
"""
>>> L = list(range(10))
>>> simple_pop_typed(L)
9
>>> simple_pop_typed(L)
8
>>> L
[0, 1, 2, 3, 4, 5, 6, 7]
>>> while L:
... _ = simple_pop_typed(L)
>>> L
[]
>>> simple_pop_typed(L)
Traceback (most recent call last):
...
IndexError: pop from empty list
"""
return L.pop()
@cython.test_assert_path_exists('//PythonCapiCallNode') @cython.test_assert_path_exists('//PythonCapiCallNode')
@cython.test_fail_if_path_exists('//SimpleCallNode/AttributeNode') @cython.test_fail_if_path_exists('//SimpleCallNode/AttributeNode')
def index_pop(L, int i): def index_pop(L, int i):
...@@ -68,6 +92,40 @@ def index_pop(L, int i): ...@@ -68,6 +92,40 @@ def index_pop(L, int i):
""" """
return L.pop(i) return L.pop(i)
@cython.test_assert_path_exists('//PythonCapiCallNode')
@cython.test_fail_if_path_exists('//SimpleCallNode/AttributeNode')
def index_pop_typed(list L, int i):
"""
>>> L = list(range(10))
>>> index_pop_typed(L, 2)
2
>>> index_pop_typed(L, -2)
8
>>> L
[0, 1, 3, 4, 5, 6, 7, 9]
>>> index_pop_typed(L, 100)
Traceback (most recent call last):
...
IndexError: pop index out of range
>>> index_pop_typed(L, -100)
Traceback (most recent call last):
...
IndexError: pop index out of range
>>> while L:
... _ = index_pop_typed(L, 0)
>>> L
[]
>>> index_pop_typed(L, 0)
Traceback (most recent call last):
...
IndexError: pop from empty list
"""
return L.pop(i)
@cython.test_fail_if_path_exists('//PythonCapiCallNode') @cython.test_fail_if_path_exists('//PythonCapiCallNode')
def crazy_pop(L): def crazy_pop(L):
""" """
......
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