The final tweaks before closing

[ 633152 ] list slice ass ignores subtypes of list

Allow arbitrary sequences on the RHS of extended slices.
This commit is contained in:
Michael W. Hudson 2002-12-05 21:32:32 +00:00
parent 7bc2e1dad7
commit a69c030c15
2 changed files with 29 additions and 22 deletions

View File

@ -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 = {}

View File

@ -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;
}
if (PyList_GET_SIZE(value) != slicelength) {
PyErr_Format(PyExc_ValueError,
"attempt to assign list of size %d to extended slice of size %d",
PyList_Size(value), slicelength);
return -1;
}
if (!slicelength)
return 0;
/* protect against a[::-1] = a */
if (self == (PyListObject*)value) {
value = list_slice((PyListObject*)value, 0,
seq = list_slice((PyListObject*)value, 0,
PyList_GET_SIZE(value));
}
else {
Py_INCREF(value);
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 (PySequence_Fast_GET_SIZE(seq) != slicelength) {
PyErr_Format(PyExc_ValueError,
"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) {
Py_DECREF(seq);
return 0;
}
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;
}