A few days ago, Guido said (in the thread "[Python-Dev] Python
version of PySlice_GetIndicesEx"):

> OK.  Michael, if you want to check in indices(), go ahead.

Then I did what was needed, but didn't check it in.  Here it is.
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index a43644d..f2d84da 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -221,6 +221,39 @@
 	{0}
 };
 
+static PyObject*
+slice_indices(PySliceObject* self, PyObject* len)
+{
+	int ilen, start, stop, step, slicelength;
+
+	ilen = PyInt_AsLong(len);
+
+	if (ilen == -1 && PyErr_Occurred()) {
+		return NULL;
+	}
+
+	if (PySlice_GetIndicesEx(self, ilen, &start, &stop, 
+				 &step, &slicelength) < 0) {
+		return NULL;
+	}
+
+	return Py_BuildValue("(lll)", start, stop, step);
+}
+
+PyDoc_STRVAR(slice_indices_doc,
+"S.indices(len) -> (start, stop, stride)\n\
+\n\
+Assuming a sequence of length len, calculate the start and stop\n\
+indices, and the stride length of the extended slice described by\n\
+S. Out of bounds indices are clipped in a manner consistent with the\n\
+handling of normal slices.");
+
+static PyMethodDef slice_methods[] = {
+	{"indices",	(PyCFuntion)slice_indices,
+	 METH_O,	slice_indices_doc},
+	{NULL, NULL}
+};
+
 static int
 slice_compare(PySliceObject *v, PySliceObject *w)
 {
@@ -271,7 +304,7 @@
 	0,					/* tp_weaklistoffset */
 	0,					/* tp_iter */
 	0,					/* tp_iternext */
-	0,					/* tp_methods */
+	slice_methods,				/* tp_methods */
 	slice_members,				/* tp_members */
 	0,					/* tp_getset */
 	0,					/* tp_base */