summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorFacundo Batista <facundobatista@gmail.com>2008-02-24 03:17:21 (GMT)
committerFacundo Batista <facundobatista@gmail.com>2008-02-24 03:17:21 (GMT)
commitc11cecf3d0f816893f5765a7b5e25d5f4e3fe531 (patch)
tree681e7a9b0d25d0e246b30dbab2de465e2e212997 /Objects
parentb93e7d16d50a6055309d9ff4e105ade453079c41 (diff)
downloadcpython-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.c62
-rw-r--r--Objects/unicodeobject.c55
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';