[Python-checkins] gh-106023: Remove _PyObject_FastCall() function (#106265)
vstinner
webhook-mailer at python.org
Fri Jun 30 05:46:47 EDT 2023
https://github.com/python/cpython/commit/2efdd2a14e5036ba88f95f68e1f006d2ef08249e
commit: 2efdd2a14e5036ba88f95f68e1f006d2ef08249e
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2023年06月30日T11:46:43+02:00
summary:
gh-106023: Remove _PyObject_FastCall() function (#106265)
files:
A Misc/NEWS.d/next/C API/2023-06-30-09-33-25.gh-issue-106023.YvYiE4.rst
M Doc/whatsnew/3.13.rst
M Include/cpython/abstract.h
M Lib/test/test_call.py
M Lib/test/test_gdb.py
M Modules/_testcapi/vectorcall.c
M Objects/call.c
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index c0e9e924c8e82..9696dd4ff0b70 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -597,3 +597,8 @@ Removed
Just remove the underscore prefix to update your code.
(Contributed by Victor Stinner in :gh:`106084`.)
+
+* Remove private ``_PyObject_FastCall()`` function:
+ use ``PyObject_Vectorcall()`` which is available since Python 3.8
+ (:pep:`590`).
+ (Contributed by Victor Stinner in :gh:`106023`.)
diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h
index d563d1b29ac3b..dd924dfd3d8fc 100644
--- a/Include/cpython/abstract.h
+++ b/Include/cpython/abstract.h
@@ -24,12 +24,6 @@ PyAPI_FUNC(PyObject *) PyObject_VectorcallDict(
size_t nargsf,
PyObject *kwargs);
-// Same as PyObject_Vectorcall(), except without keyword arguments
-PyAPI_FUNC(PyObject *) _PyObject_FastCall(
- PyObject *func,
- PyObject *const *args,
- Py_ssize_t nargs);
-
PyAPI_FUNC(PyObject *) PyObject_CallOneArg(PyObject *func, PyObject *arg);
static inline PyObject *
diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py
index 5410131a7dfd8..09a531f8cc627 100644
--- a/Lib/test/test_call.py
+++ b/Lib/test/test_call.py
@@ -519,19 +519,6 @@ def check_result(self, result, expected):
expected = (*expected[:-1], result[-1])
self.assertEqual(result, expected)
- def test_fastcall(self):
- # Test _PyObject_FastCall()
-
- for func, args, expected in self.CALLS_POSARGS:
- with self.subTest(func=func, args=args):
- result = _testcapi.pyobject_fastcall(func, args)
- self.check_result(result, expected)
-
- if not args:
- # args=NULL, nargs=0
- result = _testcapi.pyobject_fastcall(func, None)
- self.check_result(result, expected)
-
def test_vectorcall_dict(self):
# Test PyObject_VectorcallDict()
@@ -945,11 +932,11 @@ def py_recurse(n, m):
def c_recurse(n):
if n:
- _testcapi.pyobject_fastcall(c_recurse, (n-1,))
+ _testcapi.pyobject_vectorcall(c_recurse, (n-1,), ())
def c_py_recurse(m):
if m:
- _testcapi.pyobject_fastcall(py_recurse, (1000, m))
+ _testcapi.pyobject_vectorcall(py_recurse, (1000, m), ())
depth = sys.getrecursionlimit()
sys.setrecursionlimit(100_000)
diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py
index 311a864a52387..85009089f21d2 100644
--- a/Lib/test/test_gdb.py
+++ b/Lib/test/test_gdb.py
@@ -729,13 +729,13 @@ def test_two_abs_args(self):
SAMPLE_WITH_C_CALL = """
-from _testcapi import pyobject_fastcall
+from _testcapi import pyobject_vectorcall
def foo(a, b, c):
bar(a, b, c)
def bar(a, b, c):
- pyobject_fastcall(baz, (a, b, c))
+ pyobject_vectorcall(baz, (a, b, c), None)
def baz(*args):
id(42)
@@ -756,7 +756,7 @@ def test_pyup_command(self):
self.assertMultilineMatches(bt,
r'''^.*
#[0-9]+ Frame 0x-?[0-9a-f]+, for file <string>, line 12, in baz \(args=\(1, 2, 3\)\)
-#[0-9]+ <built-in method pyobject_fastcall of module object at remote 0x[0-9a-f]+>
+#[0-9]+ <built-in method pyobject_vectorcall of module object at remote 0x[0-9a-f]+>
$''')
@unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
@@ -785,7 +785,7 @@ def test_up_then_down(self):
self.assertMultilineMatches(bt,
r'''^.*
#[0-9]+ Frame 0x-?[0-9a-f]+, for file <string>, line 12, in baz \(args=\(1, 2, 3\)\)
-#[0-9]+ <built-in method pyobject_fastcall of module object at remote 0x[0-9a-f]+>
+#[0-9]+ <built-in method pyobject_vectorcall of module object at remote 0x[0-9a-f]+>
#[0-9]+ Frame 0x-?[0-9a-f]+, for file <string>, line 12, in baz \(args=\(1, 2, 3\)\)
$''')
diff --git a/Misc/NEWS.d/next/C API/2023-06-30-09-33-25.gh-issue-106023.YvYiE4.rst b/Misc/NEWS.d/next/C API/2023-06-30-09-33-25.gh-issue-106023.YvYiE4.rst
new file mode 100644
index 0000000000000..3130febf61120
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2023-06-30-09-33-25.gh-issue-106023.YvYiE4.rst
@@ -0,0 +1,2 @@
+Remove private ``_PyObject_FastCall()`` function: use ``PyObject_Vectorcall()``
+which is available since Python 3.8 (:pep:`590`). Patch by Victor Stinner.
diff --git a/Modules/_testcapi/vectorcall.c b/Modules/_testcapi/vectorcall.c
index dcbc973c9fb99..4935fd1b6a7ba 100644
--- a/Modules/_testcapi/vectorcall.c
+++ b/Modules/_testcapi/vectorcall.c
@@ -26,23 +26,6 @@ fastcall_args(PyObject *args, PyObject ***stack, Py_ssize_t *nargs)
}
-static PyObject *
-test_pyobject_fastcall(PyObject *self, PyObject *args)
-{
- PyObject *func, *func_args;
- PyObject **stack;
- Py_ssize_t nargs;
-
- if (!PyArg_ParseTuple(args, "OO", &func, &func_args)) {
- return NULL;
- }
-
- if (fastcall_args(func_args, &stack, &nargs) < 0) {
- return NULL;
- }
- return _PyObject_FastCall(func, stack, nargs);
-}
-
static PyObject *
test_pyobject_fastcalldict(PyObject *self, PyObject *args)
{
@@ -259,7 +242,6 @@ _testcapi_has_vectorcall_flag_impl(PyObject *module, PyTypeObject *type)
}
static PyMethodDef TestMethods[] = {
- {"pyobject_fastcall", test_pyobject_fastcall, METH_VARARGS},
{"pyobject_fastcalldict", test_pyobject_fastcalldict, METH_VARARGS},
{"pyobject_vectorcall", test_pyobject_vectorcall, METH_VARARGS},
{"function_setvectorcall", function_setvectorcall, METH_O},
diff --git a/Objects/call.c b/Objects/call.c
index e745fc41feaac..16c41ffe1d09b 100644
--- a/Objects/call.c
+++ b/Objects/call.c
@@ -327,14 +327,6 @@ PyObject_Vectorcall(PyObject *callable, PyObject *const *args,
}
-PyObject *
-_PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs)
-{
- PyThreadState *tstate = _PyThreadState_GET();
- return _PyObject_FastCallTstate(tstate, func, args, nargs);
-}
-
-
PyObject *
_PyObject_Call(PyThreadState *tstate, PyObject *callable,
PyObject *args, PyObject *kwargs)
More information about the Python-checkins
mailing list