From badc086543e13be82958b8162d3fc5e5b65f283a Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Thu, 23 Mar 2006 06:03:08 +0000 Subject: Stop duplicating code and handle slice indices consistently and correctly wrt to ssize_t. --- Include/sliceobject.h | 1 + Objects/abstract.c | 22 ++-------------------- Objects/classobject.c | 27 +++------------------------ Objects/sliceobject.c | 19 +++++++++++++++++++ 4 files changed, 25 insertions(+), 44 deletions(-) diff --git a/Include/sliceobject.h b/Include/sliceobject.h index 17f36dc..dbc34b2 100644 --- a/Include/sliceobject.h +++ b/Include/sliceobject.h @@ -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, diff --git a/Objects/abstract.c b/Objects/abstract.c index 9d1aaf0..bee71d8 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -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); diff --git a/Objects/classobject.c b/Objects/classobject.c index f3e636a..ea95ec0 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -1128,27 +1128,6 @@ instance_item(PyInstanceObject *inst, Py_ssize_t i) } 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) { PyObject *func, *arg, *res; @@ -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); } diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 3b37dbb..ed00ce4 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -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) -- cgit v0.12