From 66796ca36ab496bf7b03eb9a34459ca17e67802c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 30 Jun 2023 09:31:14 +0200 Subject: [PATCH] gh-106023: Remove _PyObject_FastCall() function --- Doc/whatsnew/3.13.rst | 5 +++++ Include/cpython/abstract.h | 6 ------ Lib/test/test_call.py | 17 ++--------------- Lib/test/test_gdb.py | 8 ++++---- ...3-06-30-09-33-25.gh-issue-106023.YvYiE4.rst | 2 ++ Modules/_testcapi/vectorcall.c | 18 ------------------ Objects/call.c | 8 -------- 7 files changed, 13 insertions(+), 51 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-06-30-09-33-25.gh-issue-106023.YvYiE4.rst diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index c0e9e924c8e82f..9696dd4ff0b700 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 d563d1b29ac3b3..dd924dfd3d8fcc 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 5410131a7dfd89..09a531f8cc627b 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 311a864a52387d..85009089f21d2f 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 , line 12, in baz \(args=\(1, 2, 3\)\) -#[0-9]+ +#[0-9]+ $''') @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 , line 12, in baz \(args=\(1, 2, 3\)\) -#[0-9]+ +#[0-9]+ #[0-9]+ Frame 0x-?[0-9a-f]+, for file , 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 00000000000000..3130febf61120b --- /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 dcbc973c9fb991..4935fd1b6a7ba3 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 e745fc41feaac8..16c41ffe1d09b5 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) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy