From 07e147667cf02cbcb05c84fe03fee31ef61a21c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20D=C3=B6rwald?= Date: Wed, 6 Nov 2002 16:15:14 +0000 Subject: Make int("...") return a long if an int would overflow. Also remove the 512 character limitation for int(u"...") and long(u"..."). This closes SF bug #629989. --- Lib/test/test_b1.py | 15 ++++++++------- Objects/intobject.c | 24 +++++++++++++----------- Objects/longobject.c | 18 ++++++++++-------- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/Lib/test/test_b1.py b/Lib/test/test_b1.py index 65285ee..9e6c8d5 100644 --- a/Lib/test/test_b1.py +++ b/Lib/test/test_b1.py @@ -435,10 +435,8 @@ if int(s)+1 != -sys.maxint: raise TestFailed, "int(%s)" % `s` try: int(s[1:]) -except ValueError: - pass -else: - raise TestFailed, "int(%s)" % `s[1:]` + " should raise ValueError" +except: + raise TestFailed, "int(%s)" % `s[1:]` + " should return long" try: int(1e100) except OverflowError: @@ -468,9 +466,12 @@ try: int('53', 40) except ValueError: pass else: raise TestFailed("int('53', 40) didn't raise ValueError") -try: int('1' * 512) -except ValueError: pass -else: raise TestFailed("int('1' * 512) didn't raise ValueError") +try: int('1' * 600) +except: raise TestFailed("int('1' * 600) didn't return long") + +if have_unicode: + try: int(unichr(0x661) * 600) + except: raise TestFailed("int('\\u0661' * 600) didn't return long") try: int(1, 12) except TypeError: pass diff --git a/Objects/intobject.c b/Objects/intobject.c index 7404e98..e339085 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -208,10 +208,9 @@ PyInt_FromString(char *s, char **pend, int base) return NULL; } else if (errno != 0) { - PyOS_snprintf(buffer, sizeof(buffer), - "int() literal too large: %.200s", s); - PyErr_SetString(PyExc_ValueError, buffer); - return NULL; + if (err_ovf("string/unicode conversion")) + return NULL; + return PyLong_FromString(s, pend, base); } if (pend) *pend = end; @@ -222,16 +221,19 @@ PyInt_FromString(char *s, char **pend, int base) PyObject * PyInt_FromUnicode(Py_UNICODE *s, int length, int base) { - char buffer[256]; + PyObject *result; + char *buffer = PyMem_MALLOC(length+1); - if (length >= sizeof(buffer)) { - PyErr_SetString(PyExc_ValueError, - "int() literal too large to convert"); + if (buffer == NULL) return NULL; - } - if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) + + if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) { + PyMem_FREE(buffer); return NULL; - return PyInt_FromString(buffer, NULL, base); + } + result = PyInt_FromString(buffer, NULL, base); + PyMem_FREE(buffer); + return result; } #endif diff --git a/Objects/longobject.c b/Objects/longobject.c index 35d1211..7374fce 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1123,17 +1123,19 @@ PyLong_FromString(char *str, char **pend, int base) PyObject * PyLong_FromUnicode(Py_UNICODE *u, int length, int base) { - char buffer[256]; + PyObject *result; + char *buffer = PyMem_MALLOC(length+1); - if (length >= sizeof(buffer)) { - PyErr_SetString(PyExc_ValueError, - "long() literal too large to convert"); - return NULL; - } - if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) + if (buffer == NULL) return NULL; - return PyLong_FromString(buffer, NULL, base); + if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) { + PyMem_FREE(buffer); + return NULL; + } + result = PyLong_FromString(buffer, NULL, base); + PyMem_FREE(buffer); + return result; } #endif -- cgit v0.12