From a69c030c15a49418b9735cf971a31a511459281b Mon Sep 17 00:00:00 2001 From: "Michael W. Hudson" Date: Thu, 5 Dec 2002 21:32:32 +0000 Subject: [PATCH] The final tweaks before closing [ 633152 ] list slice ass ignores subtypes of list Allow arbitrary sequences on the RHS of extended slices. --- Lib/test/test_types.py | 4 ++++ Objects/listobject.c | 43 ++++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 1e982d14f9..106d0a5b3b 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -430,6 +430,10 @@ b[slice(2,3)] = ["two", "elements"] c[2:3:] = ["two", "elements"] vereq(a, b) vereq(a, c) +a = range(10) +a[::2] = tuple(range(5)) +vereq(a, [0, 1, 1, 3, 2, 5, 3, 7, 4, 9]) + print '6.6 Mappings == Dictionaries' d = {} diff --git a/Objects/listobject.c b/Objects/listobject.c index 3e3b4d7c7b..25372d3484 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2238,33 +2238,36 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) } else { /* assign slice */ - PyObject **garbage, *ins; + PyObject **garbage, *ins, *seq; int cur, i; - if (!PyList_Check(value)) { - PyErr_Format(PyExc_TypeError, - "must assign list (not \"%.200s\") to slice", - value->ob_type->tp_name); - return -1; + /* protect against a[::-1] = a */ + if (self == (PyListObject*)value) { + seq = list_slice((PyListObject*)value, 0, + PyList_GET_SIZE(value)); + } + else { + char msg[256]; + PyOS_snprintf(msg, sizeof(msg), + "must assign sequence (not \"%.200s\") to extended slice", + value->ob_type->tp_name); + seq = PySequence_Fast(value, msg); + if (!seq) + return -1; } - if (PyList_GET_SIZE(value) != slicelength) { + if (PySequence_Fast_GET_SIZE(seq) != slicelength) { PyErr_Format(PyExc_ValueError, - "attempt to assign list of size %d to extended slice of size %d", - PyList_Size(value), slicelength); + "attempt to assign sequence of size %d to extended slice of size %d", + PySequence_Fast_GET_SIZE(seq), + slicelength); + Py_DECREF(seq); return -1; } - if (!slicelength) + if (!slicelength) { + Py_DECREF(seq); return 0; - - /* protect against a[::-1] = a */ - if (self == (PyListObject*)value) { - value = list_slice((PyListObject*)value, 0, - PyList_GET_SIZE(value)); - } - else { - Py_INCREF(value); } garbage = (PyObject**) @@ -2274,7 +2277,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) cur += step, i++) { garbage[i] = PyList_GET_ITEM(self, cur); - ins = PyList_GET_ITEM(value, i); + ins = PySequence_Fast_GET_ITEM(seq, i); Py_INCREF(ins); PyList_SET_ITEM(self, cur, ins); } @@ -2284,7 +2287,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) } PyMem_FREE(garbage); - Py_DECREF(value); + Py_DECREF(seq); return 0; } -- 2.49.0