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`.)
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 *
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()
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)
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)
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")
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\)\)
$''')
--- /dev/null
+Remove private ``_PyObject_FastCall()`` function: use ``PyObject_Vectorcall()``
+which is available since Python 3.8 (:pep:`590`). Patch by Victor Stinner.
}
-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)
{
}
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},
}
-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)