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]
