]> granicus.if.org Git - python/commitdiff
Stop duplicating code and handle slice indices consistently and correctly
authorNeal Norwitz <nnorwitz@gmail.com>
Thu, 23 Mar 2006 06:03:08 +0000 (06:03 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Thu, 23 Mar 2006 06:03:08 +0000 (06:03 +0000)
wrt to ssize_t.

Include/sliceobject.h
Objects/abstract.c
Objects/classobject.c
Objects/sliceobject.c

index 17f36dc1ffe12f9aaefd4b8cda52b1e77fc74000..dbc34b2aeaac175741394df2fbc645f71ea09910 100644 (file)
@@ -30,6 +30,7 @@ PyAPI_DATA(PyTypeObject) PySlice_Type;
 
 PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop,
                                   PyObject* step);
+PyAPI_FUNC(PyObject *) _PySlice_FromIndices(Py_ssize_t start, Py_ssize_t stop);
 PyAPI_FUNC(int) PySlice_GetIndices(PySliceObject *r, Py_ssize_t length,
                                   Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step);
 PyAPI_FUNC(int) PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length,
index 9d1aaf0cdbbd2d22065e626c2253c96c98086a5e..bee71d8e715fdc7bab22296217d25c94d89e0220 100644 (file)
@@ -1247,24 +1247,6 @@ PySequence_GetItem(PyObject *s, Py_ssize_t i)
        return type_error("unindexable object");
 }
 
-static PyObject *
-sliceobj_from_ssizet_ssizet(Py_ssize_t i, Py_ssize_t j)
-{
-       PyObject *start, *end, *slice;
-       start = PyInt_FromSsize_t(i);
-       if (!start)
-               return NULL;
-       end = PyInt_FromSsize_t(j);
-       if (!end) {
-               Py_DECREF(start);
-               return NULL;
-       }
-       slice = PySlice_New(start, end, NULL);
-       Py_DECREF(start);
-       Py_DECREF(end);
-       return slice;
-}
-
 PyObject *
 PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
 {
@@ -1289,7 +1271,7 @@ PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
                return m->sq_slice(s, i1, i2);
        } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
                PyObject *res;
-               PyObject *slice = sliceobj_from_ssizet_ssizet(i1, i2);
+               PyObject *slice = _PySlice_FromIndices(i1, i2);
                if (!slice)
                        return NULL;
                res = mp->mp_subscript(s, slice);
@@ -1381,7 +1363,7 @@ PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
                return m->sq_ass_slice(s, i1, i2, o);
        } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
                int res;
-               PyObject *slice = sliceobj_from_ssizet_ssizet(i1, i2);
+               PyObject *slice = _PySlice_FromIndices(i1, i2);
                if (!slice)
                        return -1;
                res = mp->mp_ass_subscript(s, slice, o);
index f3e636a1b36e01dfdb81693d2d8bcc378958e858..ea95ec06d9c44d9e2d74e1324c508e3c612638d9 100644 (file)
@@ -1127,27 +1127,6 @@ instance_item(PyInstanceObject *inst, Py_ssize_t i)
        return res;
 }
 
-static PyObject *
-sliceobj_from_intint(Py_ssize_t i, Py_ssize_t j)
-{
-       PyObject *start, *end, *res;
-
-       start = PyInt_FromLong((long)i);
-       if (!start)
-               return NULL;
-
-       end = PyInt_FromLong((long)j);
-       if (!end) {
-               Py_DECREF(start);
-               return NULL;
-       }
-       res = PySlice_New(start, end, NULL);
-       Py_DECREF(start);
-       Py_DECREF(end);
-       return res;
-}
-
-
 static PyObject *
 instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
 {
@@ -1168,7 +1147,7 @@ instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
                func = instance_getattr(inst, getitemstr);
                if (func == NULL)
                        return NULL;
-               arg = Py_BuildValue("(N)", sliceobj_from_intint(i, j));
+               arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
        } else
                arg = Py_BuildValue("(nn)", i, j);
 
@@ -1239,7 +1218,7 @@ instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject
                                return -1;
 
                        arg = Py_BuildValue("(N)",
-                                           sliceobj_from_intint(i, j));
+                                           _PySlice_FromIndices(i, j));
                } else
                        arg = Py_BuildValue("(nn)", i, j);
        }
@@ -1260,7 +1239,7 @@ instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject
                                return -1;
 
                        arg = Py_BuildValue("(NO)",
-                                           sliceobj_from_intint(i, j), value);
+                                           _PySlice_FromIndices(i, j), value);
                } else
                        arg = Py_BuildValue("(nnO)", i, j, value);
        }
index 3b37dbb40bb4cdf663e6f171c019a1dfba8d89d9..ed00ce402e9786139a69a1bc4379d89814ed77b2 100644 (file)
@@ -79,6 +79,25 @@ PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
        return (PyObject *) obj;
 }
 
+PyObject *
+_PySlice_FromIndices(Py_ssize_t istart, Py_ssize_t istop)
+{
+       PyObject *start, *end, *slice;
+       start = PyInt_FromSsize_t(istart);
+       if (!start)
+               return NULL;
+       end = PyInt_FromSsize_t(istop);
+       if (!end) {
+               Py_DECREF(start);
+               return NULL;
+       }
+
+       slice = PySlice_New(start, end, NULL);
+       Py_DECREF(start);
+       Py_DECREF(end);
+       return slice;
+}
+
 int
 PySlice_GetIndices(PySliceObject *r, Py_ssize_t length,
                    Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)