From df3d8756b77979279784d2a5545574e2eda85eea Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 4 Aug 1998 15:02:01 +0000 Subject: Better error messages when raising ValueError for int and long literals. (The previous version of this code would not show the offending input, even though there was code that attempted this.) --- Objects/abstract.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Objects/abstract.c b/Objects/abstract.c index cfa4cc8..7458b94 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -69,13 +69,12 @@ int_from_string(v) s++; errno = 0; x = PyOS_strtol(s, &end, 10); - if (end == s || !isdigit(end[-1])) { - PyErr_SetString(PyExc_ValueError, "no digits in int constant"); - return NULL; - } + if (end == s || !isdigit(end[-1])) + goto bad; while (*end && isspace(Py_CHARMASK(*end))) end++; if (*end != '\0') { + bad: sprintf(buffer, "invalid literal for int(): %.200s", s); PyErr_SetString(PyExc_ValueError, buffer); return NULL; @@ -105,14 +104,18 @@ long_from_string(v) while (*s && isspace(Py_CHARMASK(*s))) s++; x = PyLong_FromString(s, &end, 10); - if (x == NULL) + if (x == NULL) { + if (PyErr_ExceptionMatches(PyExc_ValueError)) + goto bad; return NULL; + } while (*end && isspace(Py_CHARMASK(*end))) end++; if (*end != '\0') { + bad: sprintf(buffer, "invalid literal for long(): %.200s", s); PyErr_SetString(PyExc_ValueError, buffer); - Py_DECREF(x); + Py_XDECREF(x); return NULL; } else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) { -- cgit v0.12