From 8445104d7d8ed460061317cd39232e56f9217c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Thu, 20 Dec 2007 22:57:23 +0000 Subject: Drop _PyLong_FitsInLong. Fixes #1666. --- Include/longobject.h | 1 - Objects/longobject.c | 13 ------------ Objects/rangeobject.c | 57 ++++++++++++++++++++++++++++++++------------------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/Include/longobject.h b/Include/longobject.h index 18d0c55..237e2e6 100644 --- a/Include/longobject.h +++ b/Include/longobject.h @@ -50,7 +50,6 @@ PyAPI_DATA(int) _PyLong_DigitValue[256]; be multiplied by SHIFT! There may not be enough room in an int to store e*SHIFT directly. */ PyAPI_FUNC(double) _PyLong_AsScaledDouble(PyObject *vv, int *e); - PyAPI_FUNC(int) _PyLong_FitsInLong(PyObject* vv); PyAPI_FUNC(double) PyLong_AsDouble(PyObject *); PyAPI_FUNC(PyObject *) PyLong_FromVoidPtr(void *); diff --git a/Objects/longobject.c b/Objects/longobject.c index 15f56d6..dc459fd 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -392,19 +392,6 @@ PyLong_AsLong(PyObject *obj) return result; } -int -_PyLong_FitsInLong(PyObject *vv) -{ - int size; - if (!PyLong_CheckExact(vv)) { - PyErr_BadInternalCall(); - return 0; - } - /* conservative estimate */ - size = Py_SIZE(vv); - return -2 <= size && size <= 2; -} - /* Get a Py_ssize_t from a long int object. Returns -1 and sets an error condition if overflow occurs. */ diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index fa9e09b..dfd3cac 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -558,14 +558,23 @@ range_iter(PyObject *seq) rangeobject *r = (rangeobject *)seq; longrangeiterobject *it; PyObject *tmp, *len; + long lstart, lstop, lstep; assert(PyRange_Check(seq)); - if (_PyLong_FitsInLong(r->start) && - _PyLong_FitsInLong(r->stop) && - _PyLong_FitsInLong(r->step)) - return int_range_iter(PyLong_AsLong(r->start), - PyLong_AsLong(r->stop), - PyLong_AsLong(r->step)); + + /* If all three fields convert to long, use the int version */ + lstart = PyLong_AsLong(r->start); + if (lstart != -1 || !PyErr_Occurred()) { + lstop = PyLong_AsLong(r->stop); + if (lstop != -1 || !PyErr_Occurred()) { + lstep = PyLong_AsLong(r->step); + if (lstep != -1 || !PyErr_Occurred()) + return int_range_iter(lstart, lstop, lstep); + } + } + /* Some conversion failed, so there is an error set. Clear it, + and try again with a long range. */ + PyErr_Clear(); it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type); if (it == NULL) @@ -605,27 +614,33 @@ range_reverse(PyObject *seq) rangeobject *range = (rangeobject*) seq; longrangeiterobject *it; PyObject *one, *sum, *diff, *len = NULL, *product; + long lstart, lstop, lstep; /* XXX(nnorwitz): do the calc for the new start/stop first, then if they fit, call the proper iter()? */ assert(PyRange_Check(seq)); - if (_PyLong_FitsInLong(range->start) && - _PyLong_FitsInLong(range->stop) && - _PyLong_FitsInLong(range->step)) { - long start = PyLong_AsLong(range->start); - long step = PyLong_AsLong(range->step); - long stop = PyLong_AsLong(range->stop); - /* XXX(nnorwitz): need to check for overflow and simplify. */ - long len = get_len_of_range(start, stop, step); - long new_start = start + (len - 1) * step; - long new_stop = start; - if (step > 0) - new_stop -= 1; - else - new_stop += 1; - return int_range_iter(new_start, new_stop, -step); + + /* If all three fields convert to long, use the int version */ + lstart = PyLong_AsLong(range->start); + if (lstart != -1 || !PyErr_Occurred()) { + lstop = PyLong_AsLong(range->stop); + if (lstop != -1 || !PyErr_Occurred()) { + lstep = PyLong_AsLong(range->step); + if (lstep != -1 || !PyErr_Occurred()) { + /* XXX(nnorwitz): need to check for overflow and simplify. */ + long len = get_len_of_range(lstart, lstop, lstep); + long new_start = lstart + (len - 1) * lstep; + long new_stop = lstart; + if (lstep > 0) + new_stop -= 1; + else + new_stop += 1; + return int_range_iter(new_start, new_stop, -lstep); + } + } } + PyErr_Clear(); it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type); if (it == NULL) -- cgit v0.12