From: Stefan Behnel Date: Tue, 4 May 2010 05:55:20 +0000 (+0200) Subject: enable .pop() optimisation also for typed lists X-Git-Tag: 0.13.beta0~111 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=680bd22d582f5e8641ffbbab676b632e5bb264f1;p=cython.git enable .pop() optimisation also for typed lists --- diff --git a/Cython/Compiler/Optimize.py b/Cython/Compiler/Optimize.py index 42fb3ecd..3a36989d 100644 --- a/Cython/Compiler/Optimize.py +++ b/Cython/Compiler/Optimize.py @@ -1693,6 +1693,8 @@ class OptimizeBuiltinCalls(Visitor.EnvTransform): return node + _handle_simple_method_list_pop = _handle_simple_method_object_pop + PyList_Append_func_type = PyrexTypes.CFuncType( PyrexTypes.c_int_type, [ PyrexTypes.CFuncTypeArg("list", PyrexTypes.py_object_type, None), diff --git a/tests/run/list_pop.pyx b/tests/run/list_pop.pyx index f1f5f71f..15161867 100644 --- a/tests/run/list_pop.pyx +++ b/tests/run/list_pop.pyx @@ -32,6 +32,30 @@ def simple_pop(L): """ 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_fail_if_path_exists('//SimpleCallNode/AttributeNode') def index_pop(L, int i): @@ -68,6 +92,40 @@ def index_pop(L, int 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') def crazy_pop(L): """