Issue #26719: More efficient formatting of ints and floats in json.

This commit is contained in:
Serhiy Storchaka 2016-04-10 14:43:04 +03:00
commit 96cdbe7bc8
2 changed files with 14 additions and 62 deletions

View file

@ -116,8 +116,6 @@ raise_errmsg(const char *msg, PyObject *s, Py_ssize_t end);
static PyObject *
encoder_encode_string(PyEncoderObject *s, PyObject *obj);
static PyObject *
encoder_encode_long(PyEncoderObject* s UNUSED, PyObject *obj);
static PyObject *
encoder_encode_float(PyEncoderObject *s, PyObject *obj);
#define S_CHAR(c) (c >= ' ' && c <= '~' && c != '\\' && c != '"')
@ -1444,39 +1442,10 @@ _encoded_const(PyObject *obj)
}
}
static PyObject *
encoder_encode_long(PyEncoderObject* s UNUSED, PyObject *obj)
{
/* Return the JSON representation of a PyLong and PyLong subclasses.
Calls int() on PyLong subclasses in case the str() was changed.
Added specifically to deal with IntEnum. See Issue18264. */
PyObject *encoded, *longobj;
if (PyLong_CheckExact(obj)) {
encoded = PyObject_Str(obj);
}
else {
longobj = PyNumber_Long(obj);
if (longobj == NULL) {
PyErr_SetString(
PyExc_ValueError,
"Unable to coerce int subclass to int"
);
return NULL;
}
encoded = PyObject_Str(longobj);
Py_DECREF(longobj);
}
return encoded;
}
static PyObject *
encoder_encode_float(PyEncoderObject *s, PyObject *obj)
{
/* Return the JSON representation of a PyFloat.
Modified to call float() on float subclasses in case the subclass
changes the repr. See Issue18264. */
PyObject *encoded, *floatobj;
/* Return the JSON representation of a PyFloat. */
double i = PyFloat_AS_DOUBLE(obj);
if (!Py_IS_FINITE(i)) {
if (!s->allow_nan) {
@ -1496,24 +1465,7 @@ encoder_encode_float(PyEncoderObject *s, PyObject *obj)
return PyUnicode_FromString("NaN");
}
}
/* coerce float subclasses to float (primarily for Enum) */
if (PyFloat_CheckExact(obj)) {
/* Use a better float format here? */
encoded = PyObject_Repr(obj);
}
else {
floatobj = PyNumber_Float(obj);
if (floatobj == NULL) {
PyErr_SetString(
PyExc_ValueError,
"Unable to coerce float subclass to float"
);
return NULL;
}
encoded = PyObject_Repr(floatobj);
Py_DECREF(floatobj);
}
return encoded;
return PyFloat_Type.tp_repr(obj);
}
static PyObject *
@ -1557,7 +1509,7 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc,
return _steal_accumulate(acc, encoded);
}
else if (PyLong_Check(obj)) {
PyObject *encoded = encoder_encode_long(s, obj);
PyObject *encoded = PyLong_Type.tp_str(obj);
if (encoded == NULL)
return -1;
return _steal_accumulate(acc, encoded);
@ -1722,7 +1674,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc,
goto bail;
}
else if (PyLong_Check(key)) {
kstr = encoder_encode_long(s, key);
kstr = PyLong_Type.tp_str(key);
if (kstr == NULL) {
goto bail;
}