From: Robert Bradshaw Date: Sat, 18 Apr 2009 08:02:12 +0000 (-0700) Subject: Fix T284, cdef list setitem X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=bc2975126b1d040a7bac54009e9209c35266d5ec;p=cython.git Fix T284, cdef list setitem --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 3bca440a..2abce3f3 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -1856,14 +1856,13 @@ class IndexNode(ExprNode): index_code = self.index.py_result() if self.base.type is dict_type: function = "PyDict_SetItem" - elif self.base.type is list_type: - function = "PyList_SetItem" - # don't use PyTuple_SetItem(), as we'd normally get a - # TypeError when changing a tuple, while PyTuple_SetItem() - # would allow updates - # - #elif self.base.type is tuple_type: - # function = "PyTuple_SetItem" + # It would seem that we could specalized lists/tuples, but that + # shouldn't happen here. + # Both PyList_SetItem PyTuple_SetItem and a Py_ssize_t as input, + # not a PyObject*, and bad conversion here would give the wrong + # exception. Also, tuples are supposed to be immutable, and raise + # TypeErrors when trying to set their entries (PyTuple_SetItem + # is for creating new tuples from). else: function = "PyObject_SetItem" code.putln( diff --git a/tests/bugs.txt b/tests/bugs.txt index 1d8ba7e1..ce41eb17 100644 --- a/tests/bugs.txt +++ b/tests/bugs.txt @@ -14,4 +14,3 @@ large_consts_T237 bad_c_struct_T252 missing_baseclass_in_predecl_T262 ifelseexpr_T267 -cdef_setitem_T284 diff --git a/tests/run/cdef_setitem_T284.pyx b/tests/run/cdef_setitem_T284.pyx index 3fd4c6d9..81edbba4 100644 --- a/tests/run/cdef_setitem_T284.pyx +++ b/tests/run/cdef_setitem_T284.pyx @@ -1,6 +1,12 @@ __doc__ = u''' >>> no_cdef() >>> with_cdef() +>>> test_list(range(11), -2, None) +[0, 1, 2, 3, 4, 5, 6, 7, 8, None, 10] +>>> test_list(range(11), "invalid index", None) +Traceback (most recent call last): +... +TypeError: list indices must be integers ''' def no_cdef(): lst = range(11) @@ -15,3 +21,7 @@ def with_cdef(): lst[ob] = -10 cdef dict dd = {} dd[ob] = -10 + +def test_list(list L, object i, object a): + L[i] = a + return L