The final tweaks before closing

[ 633152 ] list slice ass ignores subtypes of list

Allow arbitrary sequences on the RHS of extended slices.
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 1e982d1..106d0a5 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -430,6 +430,10 @@
 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 3e3b4d7..25372d3 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -2238,33 +2238,36 @@
 		}
 		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 @@
 			     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 @@
 			}
 
 			PyMem_FREE(garbage);
-			Py_DECREF(value);
+			Py_DECREF(seq);
 
 			return 0;
 		}