summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-02-22-03-01-02.bpo-43287.aTs6fO.rst2
-rw-r--r--Python/bltinmodule.c37
2 files changed, 37 insertions, 2 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-22-03-01-02.bpo-43287.aTs6fO.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-22-03-01-02.bpo-43287.aTs6fO.rst
new file mode 100644
index 0000000..d8d5b2f
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-22-03-01-02.bpo-43287.aTs6fO.rst
@@ -0,0 +1,2 @@
+Speed up calls to ``filter()`` by using the :pep:`590` ``vectorcall``
+calling convention. Patch by Dong-hee Na.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index dec2984..52591c4 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -533,8 +533,40 @@ filter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Py_DECREF(it);
return NULL;
}
- Py_INCREF(func);
- lz->func = func;
+
+ lz->func = Py_NewRef(func);
+ lz->it = it;
+
+ return (PyObject *)lz;
+}
+
+static PyObject *
+filter_vectorcall(PyObject *type, PyObject * const*args,
+ size_t nargsf, PyObject *kwnames)
+{
+ PyTypeObject *tp = (PyTypeObject *)type;
+ if (tp == &PyFilter_Type && !_PyArg_NoKwnames("filter", kwnames)) {
+ return NULL;
+ }
+
+ Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+ if (!_PyArg_CheckPositional("filter", nargs, 2, 2)) {
+ return NULL;
+ }
+
+ PyObject *it = PyObject_GetIter(args[1]);
+ if (it == NULL) {
+ return NULL;
+ }
+
+ filterobject *lz = (filterobject *)tp->tp_alloc(tp, 0);
+
+ if (lz == NULL) {
+ Py_DECREF(it);
+ return NULL;
+ }
+
+ lz->func = Py_NewRef(args[0]);
lz->it = it;
return (PyObject *)lz;
@@ -653,6 +685,7 @@ PyTypeObject PyFilter_Type = {
PyType_GenericAlloc, /* tp_alloc */
filter_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
+ .tp_vectorcall = (vectorcallfunc)filter_vectorcall
};