summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDennis Sweeney <36520290+sweeneyde@users.noreply.github.com>2020-09-29 00:55:52 (GMT)
committerGitHub <noreply@github.com>2020-09-29 00:55:52 (GMT)
commite8acc355d430b45f1c3ff83312e72272262a854f (patch)
treef0e7e832cbe141535675e5b05c581ceb1a4a0452
parentcb6db8b6ae47dccc1aa97830d0f05d29f31e0cbc (diff)
downloadcpython-e8acc355d430b45f1c3ff83312e72272262a854f.zip
cpython-e8acc355d430b45f1c3ff83312e72272262a854f.tar.gz
cpython-e8acc355d430b45f1c3ff83312e72272262a854f.tar.bz2
bpo-41873: Add vectorcall for float() (GH-22432)
-rw-r--r--Lib/test/test_float.py3
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst1
-rw-r--r--Objects/floatobject.c19
3 files changed, 23 insertions, 0 deletions
diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
index 9651281..99c81f0 100644
--- a/Lib/test/test_float.py
+++ b/Lib/test/test_float.py
@@ -64,6 +64,9 @@ class GeneralFloatCases(unittest.TestCase):
# See bpo-34087
self.assertRaises(ValueError, float, '\u3053\u3093\u306b\u3061\u306f')
+ def test_noargs(self):
+ self.assertEqual(float(), 0.0)
+
def test_underscores(self):
for lit in VALID_UNDERSCORE_LITERALS:
if not any(ch in lit for ch in 'jJxXoObB'):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst b/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst
new file mode 100644
index 0000000..ee26367
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-09-28-08-58-28.bpo-41873.VzEDhA.rst
@@ -0,0 +1 @@
+Calls to ``float()`` are now faster due to the ``vectorcall`` calling convention. Patch by Dennis Sweeney. \ No newline at end of file
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 0606f29..d0af0ea 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -1649,6 +1649,24 @@ float_subtype_new(PyTypeObject *type, PyObject *x)
return newobj;
}
+static PyObject *
+float_vectorcall(PyObject *type, PyObject * const*args,
+ size_t nargsf, PyObject *kwnames)
+{
+ if (!_PyArg_NoKwnames("float", kwnames)) {
+ return NULL;
+ }
+
+ Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+ if (!_PyArg_CheckPositional("float", nargs, 0, 1)) {
+ return NULL;
+ }
+
+ PyObject *x = nargs >= 1 ? args[0] : _PyLong_Zero;
+ return float_new_impl((PyTypeObject *)type, x);
+}
+
+
/*[clinic input]
float.__getnewargs__
[clinic start generated code]*/
@@ -1937,6 +1955,7 @@ PyTypeObject PyFloat_Type = {
0, /* tp_init */
0, /* tp_alloc */
float_new, /* tp_new */
+ .tp_vectorcall = (vectorcallfunc)float_vectorcall,
};
int