summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorWalter Dörwald <walter@livinglogic.de>2002-11-19 20:49:15 (GMT)
committerWalter Dörwald <walter@livinglogic.de>2002-11-19 20:49:15 (GMT)
commitf171540ab8d816a996c34db3f6aa4bf9cf147fba (patch)
tree001d1ff0bdea449058218d2debf6d6f8dbbcb220 /Objects
parent7a3bae410df3dd0032509b97077d0c4d98276fdd (diff)
downloadcpython-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.c20
-rw-r--r--Objects/intobject.c20
-rw-r--r--Objects/longobject.c29
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 *