From 680bd22d582f5e8641ffbbab676b632e5bb264f1 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Tue, 4 May 2010 07:55:20 +0200 Subject: [PATCH] enable .pop() optimisation also for typed lists --- Cython/Compiler/Optimize.py | 2 ++ tests/run/list_pop.pyx | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) 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): """ -- 2.26.2