From 25885d1dc588ce82f4b05899705fb54cb8704a35 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 12 May 2016 10:21:14 +0300 Subject: [PATCH] Issue #27005: Optimized the float.fromhex() class method for exact float. --- Misc/NEWS | 3 +++ Objects/floatobject.c | 11 +++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 87fa371705..c5ad0f7d89 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: tba Core and Builtins ----------------- +- Issue #27005: Optimized the float.fromhex() class method for exact float. + It is now 2 times faster. + - Issue #18531: Single var-keyword argument of dict subtype was passed unscathed to the C-defined function. Now it is converted to exact dict. diff --git a/Objects/floatobject.c b/Objects/floatobject.c index eb60659615..f640dd3e1f 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1195,7 +1195,7 @@ Return a hexadecimal representation of a floating-point number.\n\ static PyObject * float_fromhex(PyObject *cls, PyObject *arg) { - PyObject *result_as_float, *result; + PyObject *result; double x; long exp, top_exp, lsb, key_digit; char *s, *coeff_start, *s_store, *coeff_end, *exp_start, *s_end; @@ -1410,11 +1410,10 @@ float_fromhex(PyObject *cls, PyObject *arg) s++; if (s != s_end) goto parse_error; - result_as_float = Py_BuildValue("(d)", negate ? -x : x); - if (result_as_float == NULL) - return NULL; - result = PyObject_CallObject(cls, result_as_float); - Py_DECREF(result_as_float); + result = PyFloat_FromDouble(negate ? -x : x); + if (cls != (PyObject *)&PyFloat_Type && result != NULL) { + Py_SETREF(result, PyObject_CallFunctionObjArgs(cls, result)); + } return result; overflow_error: -- 2.40.0