From: Robert Bradshaw Date: Sat, 2 Feb 2013 07:53:10 +0000 (-0800) Subject: Faster list setting when bounds check and wrapparound are disabled. X-Git-Tag: 0.19b1~190^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8d3a92fe502a6eb5d880e77caf6515e52707196e;p=platform%2Fupstream%2Fpython-cython.git Faster list setting when bounds check and wrapparound are disabled. --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 73bbd84..3ad7414 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -3172,7 +3172,13 @@ class IndexNode(ExprNode): def generate_setitem_code(self, value_code, code): if self.index.type.is_int: - function = "__Pyx_SetItemInt" + if (self.base.type.is_builtin_type + and self.base.type.name == "list" + and not code.globalstate.directives['wraparound'] + and not code.globalstate.directives['boundscheck']): + function = "__Pyx_SetItemListInt_NoCheck" + else: + function = "__Pyx_SetItemInt" index_code = self.index.result() code.globalstate.use_utility_code( UtilityCode.load_cached("SetItemInt", "ObjectHandling.c")) diff --git a/Cython/Utility/ObjectHandling.c b/Cython/Utility/ObjectHandling.c index 2da2148..b18be23 100644 --- a/Cython/Utility/ObjectHandling.c +++ b/Cython/Utility/ObjectHandling.c @@ -354,6 +354,19 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObje return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); } + +#define __Pyx_SetItemListInt_NoCheck(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ + __Pyx_SetItemIntList_NoCheck(o, i, v) : \ + __Pyx_SetItemInt_Generic(o, to_py_func(i), v)) + +static CYTHON_INLINE int __Pyx_SetItemIntList_NoCheck(PyObject *o, Py_ssize_t n, PyObject *v) { + PyObject* old = PyList_GET_ITEM(o, n); + Py_INCREF(v); + PyList_SET_ITEM(o, n, v); + Py_DECREF(old); + return 1; +} + /////////////// DelItemInt.proto /////////////// #define __Pyx_DelItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \