]> granicus.if.org Git - python/commitdiff
Issue #27005: Optimized the float.fromhex() class method for exact float.
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 12 May 2016 07:21:14 +0000 (10:21 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Thu, 12 May 2016 07:21:14 +0000 (10:21 +0300)
Misc/NEWS
Objects/floatobject.c

index 87fa371705bd41b685bf7233a9d2acf0d666704c..c5ad0f7d899090067b32526ada7f72ceb7a007fb 100644 (file)
--- 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.
 
index eb60659615fbec5f08436e61388bfa5342580151..f640dd3e1f25201e180a623ab8736864285855f4 100644 (file)
@@ -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: