diff options
author | Facundo Batista <facundobatista@gmail.com> | 2008-02-24 03:17:21 (GMT) |
---|---|---|
committer | Facundo Batista <facundobatista@gmail.com> | 2008-02-24 03:17:21 (GMT) |
commit | c11cecf3d0f816893f5765a7b5e25d5f4e3fe531 (patch) | |
tree | 681e7a9b0d25d0e246b30dbab2de465e2e212997 /Objects | |
parent | b93e7d16d50a6055309d9ff4e105ade453079c41 (diff) | |
download | cpython-c11cecf3d0f816893f5765a7b5e25d5f4e3fe531.zip cpython-c11cecf3d0f816893f5765a7b5e25d5f4e3fe531.tar.gz cpython-c11cecf3d0f816893f5765a7b5e25d5f4e3fe531.tar.bz2 |
Issue 1742669. Now %d accepts very big float numbers.
Thanks Gabriel Genellina.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/stringobject.c | 62 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 55 |
2 files changed, 88 insertions, 29 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 392da93..314ec42 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -4585,6 +4585,7 @@ PyString_Format(PyObject *format, PyObject *args) int prec = -1; int c = '\0'; int fill; + int isnumok; PyObject *v = NULL; PyObject *temp = NULL; char *pbuf; @@ -4786,23 +4787,52 @@ PyString_Format(PyObject *format, PyObject *args) case 'X': if (c == 'i') c = 'd'; - if (PyLong_Check(v)) { - int ilen; - temp = _PyString_FormatLong(v, flags, - prec, c, &pbuf, &ilen); - len = ilen; - if (!temp) - goto error; - sign = 1; + isnumok = 0; + if (PyNumber_Check(v)) { + PyObject *iobj=NULL; + + if (PyInt_Check(v) || (PyLong_Check(v))) { + iobj = v; + Py_INCREF(iobj); + } + else { + iobj = PyNumber_Int(v); + if (iobj==NULL) iobj = PyNumber_Long(v); + } + if (iobj!=NULL) { + if (PyInt_Check(iobj)) { + isnumok = 1; + pbuf = formatbuf; + len = formatint(pbuf, + sizeof(formatbuf), + flags, prec, c, iobj); + Py_DECREF(iobj); + if (len < 0) + goto error; + sign = 1; + } + else if (PyLong_Check(iobj)) { + int ilen; + + isnumok = 1; + temp = _PyString_FormatLong(iobj, flags, + prec, c, &pbuf, &ilen); + Py_DECREF(iobj); + len = ilen; + if (!temp) + goto error; + sign = 1; + } + else { + Py_DECREF(iobj); + } + } } - else { - pbuf = formatbuf; - len = formatint(pbuf, - sizeof(formatbuf), - flags, prec, c, v); - if (len < 0) - goto error; - sign = 1; + if (!isnumok) { + PyErr_Format(PyExc_TypeError, + "%%%c format: a number is required, " + "not %.200s", c, Py_TYPE(v)->tp_name); + goto error; } if (flags & F_ZERO) fill = '0'; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 0dca976..0470ef4 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8334,6 +8334,7 @@ PyObject *PyUnicode_Format(PyObject *format, int prec = -1; Py_UNICODE c = '\0'; Py_UNICODE fill; + int isnumok; PyObject *v = NULL; PyObject *temp = NULL; Py_UNICODE *pbuf; @@ -8546,21 +8547,49 @@ PyObject *PyUnicode_Format(PyObject *format, case 'X': if (c == 'i') c = 'd'; - if (PyLong_Check(v)) { - temp = formatlong(v, flags, prec, c); - if (!temp) - goto onError; - pbuf = PyUnicode_AS_UNICODE(temp); - len = PyUnicode_GET_SIZE(temp); - sign = 1; + isnumok = 0; + if (PyNumber_Check(v)) { + PyObject *iobj=NULL; + + if (PyInt_Check(v) || (PyLong_Check(v))) { + iobj = v; + Py_INCREF(iobj); + } + else { + iobj = PyNumber_Int(v); + if (iobj==NULL) iobj = PyNumber_Long(v); + } + if (iobj!=NULL) { + if (PyInt_Check(iobj)) { + isnumok = 1; + pbuf = formatbuf; + len = formatint(pbuf, sizeof(formatbuf)/sizeof(Py_UNICODE), + flags, prec, c, iobj); + Py_DECREF(iobj); + if (len < 0) + goto onError; + sign = 1; + } + else if (PyLong_Check(iobj)) { + isnumok = 1; + temp = formatlong(iobj, flags, prec, c); + Py_DECREF(iobj); + if (!temp) + goto onError; + pbuf = PyUnicode_AS_UNICODE(temp); + len = PyUnicode_GET_SIZE(temp); + sign = 1; + } + else { + Py_DECREF(iobj); + } + } } - else { - pbuf = formatbuf; - len = formatint(pbuf, sizeof(formatbuf)/sizeof(Py_UNICODE), - flags, prec, c, v); - if (len < 0) + if (!isnumok) { + PyErr_Format(PyExc_TypeError, + "%%%c format: a number is required, " + "not %.200s", c, Py_TYPE(v)->tp_name); goto onError; - sign = 1; } if (flags & F_ZERO) fill = '0'; |