diff options
author | Walter Dörwald <walter@livinglogic.de> | 2002-11-19 20:49:15 (GMT) |
---|---|---|
committer | Walter Dörwald <walter@livinglogic.de> | 2002-11-19 20:49:15 (GMT) |
commit | f171540ab8d816a996c34db3f6aa4bf9cf147fba (patch) | |
tree | 001d1ff0bdea449058218d2debf6d6f8dbbcb220 /Objects | |
parent | 7a3bae410df3dd0032509b97077d0c4d98276fdd (diff) | |
download | cpython-f171540ab8d816a996c34db3f6aa4bf9cf147fba.zip cpython-f171540ab8d816a996c34db3f6aa4bf9cf147fba.tar.gz cpython-f171540ab8d816a996c34db3f6aa4bf9cf147fba.tar.bz2 |
Change int() so that passing a string, unicode, float or long argument
that is outside the integer range no longer raises OverflowError, but
returns a long object instead.
This fixes SF bug http://www.python.org/sf/635115
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/floatobject.c | 20 | ||||
-rw-r--r-- | Objects/intobject.c | 20 | ||||
-rw-r--r-- | Objects/longobject.c | 29 |
3 files changed, 45 insertions, 24 deletions
diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 924b312..129f5bd 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -642,6 +642,13 @@ float_coerce(PyObject **pv, PyObject **pw) } static PyObject * +float_long(PyObject *v) +{ + double x = PyFloat_AsDouble(v); + return PyLong_FromDouble(x); +} + +static PyObject * float_int(PyObject *v) { double x = PyFloat_AsDouble(v); @@ -652,8 +659,7 @@ float_int(PyObject *v) #ifdef RISCOS /* conversion from floating to integral type would raise exception */ if (wholepart>LONG_MAX || wholepart<LONG_MIN) { - PyErr_SetString(PyExc_OverflowError, "float too large to convert"); - return NULL; + return float_long(v); } #endif /* doubles may have more bits than longs, or vice versa; and casting @@ -663,15 +669,7 @@ float_int(PyObject *v) aslong = (long)wholepart; if ((double)aslong == wholepart) return PyInt_FromLong(aslong); - PyErr_SetString(PyExc_OverflowError, "float too large to convert"); - return NULL; -} - -static PyObject * -float_long(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - return PyLong_FromDouble(x); + return float_long(v); } static PyObject * diff --git a/Objects/intobject.c b/Objects/intobject.c index e339085..7242dd0 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -166,9 +166,20 @@ PyInt_AsLong(register PyObject *op) if (io == NULL) return -1; if (!PyInt_Check(io)) { - PyErr_SetString(PyExc_TypeError, - "nb_int should return int object"); - return -1; + if (PyLong_Check(io)) { + /* got a long? => retry int conversion */ + val = PyLong_AsLong((PyObject *)io); + if (PyErr_Occurred()) { + Py_DECREF(io); + return -1; + } + } + else + { + PyErr_SetString(PyExc_TypeError, + "nb_int should return int object"); + return -1; + } } val = PyInt_AS_LONG(io); @@ -892,7 +903,8 @@ Convert a string or number to an integer, if possible. A floating point\n\ argument will be truncated towards zero (this does not include a string\n\ representation of a floating point number!) When converting a string, use\n\ the optional base. It is an error to supply a base when converting a\n\ -non-string."); +non-string. If the argument is outside the integer range a long object\n\ +will be returned instead."); static PyNumberMethods int_as_number = { (binaryfunc)int_add, /*nb_add*/ diff --git a/Objects/longobject.c b/Objects/longobject.c index 7374fce..5038823 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -2517,20 +2517,31 @@ long_coerce(PyObject **pv, PyObject **pw) } static PyObject * -long_int(PyObject *v) +long_long(PyObject *v) { - long x; - x = PyLong_AsLong(v); - if (PyErr_Occurred()) - return NULL; - return PyInt_FromLong(x); + Py_INCREF(v); + return v; } static PyObject * -long_long(PyObject *v) +long_int(PyObject *v) { - Py_INCREF(v); - return v; + long x; + x = PyLong_AsLong(v); + if (PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) { + PyErr_Clear(); + if (PyLong_CheckExact(v)) { + Py_INCREF(v); + return v; + } + else + return _PyLong_Copy((PyLongObject *)v); + } + else + return NULL; + } + return PyInt_FromLong(x); } static PyObject * |