summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2007-12-20 22:57:23 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2007-12-20 22:57:23 (GMT)
commit8445104d7d8ed460061317cd39232e56f9217c29 (patch)
tree6a754e6759e1f2beaaa2671d442b6630f7737527
parent704b34d9e4481ef35cfe56daabb4a016da9e83aa (diff)
downloadcpython-8445104d7d8ed460061317cd39232e56f9217c29.zip
cpython-8445104d7d8ed460061317cd39232e56f9217c29.tar.gz
cpython-8445104d7d8ed460061317cd39232e56f9217c29.tar.bz2
Drop _PyLong_FitsInLong. Fixes #1666.
-rw-r--r--Include/longobject.h1
-rw-r--r--Objects/longobject.c13
-rw-r--r--Objects/rangeobject.c57
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)