cython-devel

changeset 1270:f24f2963a581

Re: [Cython] PATCH: fix delitem for index nodes
author "Lisandro Dalcin" <dalcinl@gmail.com>
date Mon Oct 27 09:22:00 2008 -0700 (4 years ago)
parents 3e3ed261f988
children a71073d1250c
files Cython/Compiler/ExprNodes.py tests/run/dictintindex.pyx
line diff
1.1 --- a/Cython/Compiler/ExprNodes.py Mon Oct 27 09:21:52 2008 -0700 1.2 +++ b/Cython/Compiler/ExprNodes.py Mon Oct 27 09:22:00 2008 -0700 1.3 @@ -1557,10 +1557,6 @@ 1.4 if self.index.type.is_int and not self.index.type.is_longlong: 1.5 self.original_index_type = self.index.type 1.6 self.index = self.index.coerce_to(PyrexTypes.c_py_ssize_t_type, env).coerce_to_simple(env) 1.7 - if getting: 1.8 - env.use_utility_code(getitem_int_utility_code) 1.9 - if setting: 1.10 - env.use_utility_code(setitem_int_utility_code) 1.11 else: 1.12 self.index = self.index.coerce_to_pyobject(env) 1.13 self.type = py_object_type 1.14 @@ -1636,6 +1632,7 @@ 1.15 if self.index.type.is_int: 1.16 function = "__Pyx_GetItemInt" 1.17 index_code = self.index.result() 1.18 + code.globalstate.use_utility_code(getitem_int_utility_code) 1.19 else: 1.20 function = "PyObject_GetItem" 1.21 index_code = self.index.py_result() 1.22 @@ -1654,6 +1651,7 @@ 1.23 if self.index.type.is_int: 1.24 function = "__Pyx_SetItemInt" 1.25 index_code = self.index.result() 1.26 + code.globalstate.use_utility_code(setitem_int_utility_code) 1.27 else: 1.28 function = "PyObject_SetItem" 1.29 index_code = self.index.py_result() 1.30 @@ -1708,16 +1706,18 @@ 1.31 self.generate_subexpr_evaluation_code(code) 1.32 #if self.type.is_pyobject: 1.33 if self.index.type.is_int: 1.34 - function = "PySequence_DelItem" 1.35 + function = "__Pyx_DelItemInt" 1.36 index_code = self.index.result() 1.37 + code.globalstate.use_utility_code(delitem_int_utility_code) 1.38 else: 1.39 function = "PyObject_DelItem" 1.40 index_code = self.index.py_result() 1.41 code.putln( 1.42 - "if (%s(%s, %s) < 0) %s" % ( 1.43 + "if (%s(%s, %s%s) < 0) %s" % ( 1.44 function, 1.45 self.base.py_result(), 1.46 index_code, 1.47 + self.index_unsigned_parameter(), 1.48 code.error_goto(self.pos))) 1.49 self.generate_subexpr_disposal_code(code) 1.50 1.51 @@ -4930,6 +4930,27 @@ 1.52 1.53 #------------------------------------------------------------------------------------ 1.54 1.55 +delitem_int_utility_code = UtilityCode( 1.56 +proto = """ 1.57 +static INLINE int __Pyx_DelItemInt(PyObject *o, Py_ssize_t i, int is_unsigned) { 1.58 + int r; 1.59 + if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0) || !is_unsigned)) 1.60 + r = PySequence_DelItem(o, i); 1.61 + else { 1.62 + PyObject *j = (likely(i >= 0) || !is_unsigned) ? PyInt_FromLong(i) : PyLong_FromUnsignedLongLong((sizeof(unsigned long long) > sizeof(Py_ssize_t) ? (1ULL << (sizeof(Py_ssize_t)*8)) : 0) + i); 1.63 + if (!j) 1.64 + return -1; 1.65 + r = PyObject_DelItem(o, j); 1.66 + Py_DECREF(j); 1.67 + } 1.68 + return r; 1.69 +} 1.70 +""", 1.71 +impl = """ 1.72 +""") 1.73 + 1.74 +#------------------------------------------------------------------------------------ 1.75 + 1.76 raise_noneattr_error_utility_code = UtilityCode( 1.77 proto = """ 1.78 static INLINE void __Pyx_RaiseNoneAttributeError(char* attrname);
2.1 --- a/tests/run/dictintindex.pyx Mon Oct 27 09:21:52 2008 -0700 2.2 +++ b/tests/run/dictintindex.pyx Mon Oct 27 09:22:00 2008 -0700 2.3 @@ -1,18 +1,157 @@ 2.4 __doc__ = u""" 2.5 ->>> test_index() 2.6 +>>> test_get_char_neg() 2.7 +0 2.8 +>>> test_get_char_zero() 2.9 1 2.10 ->>> test_del() 2.11 +>>> test_get_char_pos() 2.12 +2 2.13 +>>> test_get_uchar_zero() 2.14 +1 2.15 +>>> test_get_uchar_pos() 2.16 +2 2.17 +>>> test_get_int_neg() 2.18 +0 2.19 +>>> test_get_int_zero() 2.20 +1 2.21 +>>> test_get_int_pos() 2.22 +2 2.23 +>>> test_get_uint_zero() 2.24 +1 2.25 +>>> test_get_uint_pos() 2.26 +2 2.27 +>>> test_get_longlong_neg() 2.28 +0 2.29 +>>> test_get_longlong_zero() 2.30 +1 2.31 +>>> test_get_longlong_pos() 2.32 +2 2.33 +>>> test_get_ulonglong_zero() 2.34 +1 2.35 +>>> test_get_ulonglong_pos() 2.36 +2 2.37 +>>> test_del_char() 2.38 Traceback (most recent call last): 2.39 KeyError: 0 2.40 +>>> test_del_uchar() 2.41 +Traceback (most recent call last): 2.42 +KeyError: 0 2.43 +>>> test_del_int() 2.44 +Traceback (most recent call last): 2.45 +KeyError: 0 2.46 +>>> test_del_uint() 2.47 +Traceback (most recent call last): 2.48 +KeyError: 0 2.49 +>>> test_del_longlong() #doctest: +ELLIPSIS 2.50 +Traceback (most recent call last): 2.51 +KeyError: 0... 2.52 +>>> test_del_ulonglong() #doctest: +ELLIPSIS 2.53 +Traceback (most recent call last): 2.54 +KeyError: 0... 2.55 """ 2.56 2.57 -def test_index(): 2.58 +def test_get_char_neg(): 2.59 + cdef char key = -1 2.60 + d = {-1:0} 2.61 + return d[key] 2.62 +def test_get_char_zero(): 2.63 + cdef char key = 0 2.64 + d = {0:1} 2.65 + return d[key] 2.66 +def test_get_char_pos(): 2.67 + cdef char key = 1 2.68 + d = {1:2} 2.69 + return d[key] 2.70 + 2.71 + 2.72 +def test_get_uchar_zero(): 2.73 + cdef unsigned char key = 0 2.74 + d = {0:1} 2.75 + return d[key] 2.76 +def test_get_uchar_pos(): 2.77 + cdef unsigned char key = 1 2.78 + d = {1:2} 2.79 + return d[key] 2.80 + 2.81 + 2.82 +def test_get_int_neg(): 2.83 + cdef int key = -1 2.84 + d = {-1:0} 2.85 + return d[key] 2.86 +def test_get_int_zero(): 2.87 cdef int key = 0 2.88 d = {0:1} 2.89 return d[key] 2.90 +def test_get_int_pos(): 2.91 + cdef int key = 1 2.92 + d = {1:2} 2.93 + return d[key] 2.94 2.95 -def test_del(): 2.96 + 2.97 +def test_get_uint_zero(): 2.98 + cdef unsigned int key = 0 2.99 + d = {0:1} 2.100 + return d[key] 2.101 +def test_get_uint_pos(): 2.102 + cdef unsigned int key = 1 2.103 + d = {1:2} 2.104 + return d[key] 2.105 + 2.106 + 2.107 +def test_get_longlong_neg(): 2.108 + cdef long long key = -1 2.109 + d = {-1:0} 2.110 + return d[key] 2.111 +def test_get_longlong_zero(): 2.112 + cdef long long key = 0 2.113 + d = {0:1} 2.114 + return d[key] 2.115 +def test_get_longlong_pos(): 2.116 + cdef long long key = 1 2.117 + d = {1:2} 2.118 + return d[key] 2.119 + 2.120 +def test_get_ulonglong_zero(): 2.121 + cdef unsigned long long key = 0 2.122 + d = {0:1} 2.123 + return d[key] 2.124 +def test_get_ulonglong_pos(): 2.125 + cdef unsigned long long key = 1 2.126 + d = {1:2} 2.127 + return d[key] 2.128 + 2.129 + 2.130 +def test_del_char(): 2.131 + cdef char key = 0 2.132 + d = {0:1} 2.133 + del d[key] 2.134 + return d[key] 2.135 + 2.136 +def test_del_uchar(): 2.137 + cdef unsigned char key = 0 2.138 + d = {0:1} 2.139 + del d[key] 2.140 + return d[key] 2.141 + 2.142 +def test_del_int(): 2.143 cdef int key = 0 2.144 d = {0:1} 2.145 del d[key] 2.146 return d[key] 2.147 + 2.148 +def test_del_uint(): 2.149 + cdef unsigned int key = 0 2.150 + d = {0:1} 2.151 + del d[key] 2.152 + return d[key] 2.153 + 2.154 +def test_del_longlong(): 2.155 + cdef long long key = 0 2.156 + d = {0:1} 2.157 + del d[key] 2.158 + return d[key] 2.159 + 2.160 +def test_del_ulonglong(): 2.161 + cdef unsigned long long key = 0 2.162 + d = {0:1} 2.163 + del d[key] 2.164 + return d[key]