]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-105107: Remove PyEval_CallFunction() function (#105108)
authorVictor Stinner <vstinner@python.org>
Wed, 31 May 2023 11:17:06 +0000 (13:17 +0200)
committerGitHub <noreply@github.com>
Wed, 31 May 2023 11:17:06 +0000 (11:17 +0000)
Remove 4 functions from the C API, deprecated in Python 3.9:

* PyEval_CallObjectWithKeywords()
* PyEval_CallObject()
* PyEval_CallFunction()
* PyEval_CallMethod()

Keep 3 functions in the stable ABI:

* PyEval_CallObjectWithKeywords()
* PyEval_CallFunction()
* PyEval_CallMethod()

Doc/data/stable_abi.dat
Doc/whatsnew/3.13.rst
Include/ceval.h
Misc/NEWS.d/next/C API/2023-05-30-19-11-09.gh-issue-105107.YQwMnm.rst [new file with mode: 0644]
Misc/stable_abi.toml
Objects/call.c

index f112d268129fd144b461c5ce97c843b4f90f5ec3..f255d9586b9ba30c19d674fa1c5e915ab46532bb 100644 (file)
@@ -180,9 +180,6 @@ function,PyErr_WarnFormat,3.2,,
 function,PyErr_WriteUnraisable,3.2,,
 function,PyEval_AcquireLock,3.2,,
 function,PyEval_AcquireThread,3.2,,
-function,PyEval_CallFunction,3.2,,
-function,PyEval_CallMethod,3.2,,
-function,PyEval_CallObjectWithKeywords,3.2,,
 function,PyEval_EvalCode,3.2,,
 function,PyEval_EvalCodeEx,3.2,,
 function,PyEval_EvalFrame,3.2,,
index 13b9be1c8ee23f0ddd4e85bf054e17d8c9ccf720..7e29ed306c2d764d86adc29bca50e7ae0f54ee48 100644 (file)
@@ -308,3 +308,18 @@ Deprecated
 Removed
 -------
 
+* Remove functions deprecated in Python 3.9.
+
+  * ``PyEval_CallObject()``, ``PyEval_CallObjectWithKeywords()``: use
+    :c:func:`PyObject_CallNoArgs` or :c:func:`PyObject_Call` instead.
+    Warning: :c:func:`PyObject_Call` positional arguments must be a
+    :class:`tuple` and must not be *NULL*, keyword arguments must be a
+    :class:`dict` or *NULL*, whereas removed functions checked arguments type
+    and accepted *NULL* positional and keyword arguments.
+    To replace ``PyEval_CallObjectWithKeywords(func, NULL, kwargs)`` with
+    :c:func:`PyObject_Call`, pass an empty tuple as positional arguments using
+    :c:func:`PyTuple_New(0) <PyTuple_New>`.
+  * ``PyEval_CallFunction()``: use :c:func:`PyObject_CallFunction` instead.
+  * ``PyEval_CallMethod()``: use :c:func:`PyObject_CallMethod` instead.
+
+  (Contributed by Victor Stinner in :gh:`105107`.)
index ad4d909d6f2b14a5952b5992889dbdb9b85671ae..cf231b74f2bffa5936810d1e967b1f817ab2f519 100644 (file)
@@ -17,27 +17,6 @@ PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co,
                                          PyObject *const *defs, int defc,
                                          PyObject *kwdefs, PyObject *closure);
 
-/* PyEval_CallObjectWithKeywords(), PyEval_CallObject(), PyEval_CallFunction
- * and PyEval_CallMethod are deprecated. Since they are officially part of the
- * stable ABI (PEP 384), they must be kept for backward compatibility.
- * PyObject_Call(), PyObject_CallFunction() and PyObject_CallMethod() are
- * recommended to call a callable object.
- */
-
-Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords(
-    PyObject *callable,
-    PyObject *args,
-    PyObject *kwargs);
-
-/* Deprecated since PyEval_CallObjectWithKeywords is deprecated */
-#define PyEval_CallObject(callable, arg) \
-    PyEval_CallObjectWithKeywords((callable), (arg), _PyObject_CAST(_Py_NULL))
-
-Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallFunction(
-    PyObject *callable, const char *format, ...);
-Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallMethod(
-    PyObject *obj, const char *name, const char *format, ...);
-
 PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void);
 PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void);
 PyAPI_FUNC(PyObject *) PyEval_GetLocals(void);
diff --git a/Misc/NEWS.d/next/C API/2023-05-30-19-11-09.gh-issue-105107.YQwMnm.rst b/Misc/NEWS.d/next/C API/2023-05-30-19-11-09.gh-issue-105107.YQwMnm.rst
new file mode 100644 (file)
index 0000000..8423f47
--- /dev/null
@@ -0,0 +1,9 @@
+Remove functions deprecated in Python 3.9.
+
+* ``PyEval_CallObject()``, ``PyEval_CallObjectWithKeywords()``: use
+  :c:func:`PyObject_CallNoArgs` and :c:func:`PyObject_Call` (positional
+  arguments must not be *NULL*) instead.
+* ``PyEval_CallFunction()``: use :c:func:`PyObject_CallFunction` instead.
+* ``PyEval_CallMethod()``: use :c:func:`PyObject_CallMethod` instead.
+
+Patch by Victor Stinner.
index 1db98483f09f770a69cfd163b811ceaee843dd21..ff3b09ca74c39ea5fb169b47307f2a6ae6f6b43f 100644 (file)
     added = '3.2'
 [function.PyEval_CallFunction]
     added = '3.2'
+    abi_only = true
 [function.PyEval_CallMethod]
     added = '3.2'
+    abi_only = true
 [function.PyEval_CallObjectWithKeywords]
     added = '3.2'
+    abi_only = true
 [function.PyEval_EvalCode]
     added = '3.2'
 [function.PyEval_EvalCodeEx]
index e9002d350c9288d9661ffebfbb962586a546d229..4658cf1f56bb7dcde1e00f863bc563b46140ad0b 100644 (file)
@@ -426,8 +426,9 @@ _PyFunction_Vectorcall(PyObject *func, PyObject* const* stack,
 /* --- More complex call functions -------------------------------- */
 
 /* External interface to call any callable object.
-   The args must be a tuple or NULL.  The kwargs must be a dict or NULL. */
-PyObject *
+   The args must be a tuple or NULL.  The kwargs must be a dict or NULL.
+   Function removed in Python 3.13 API but kept in the stable ABI. */
+PyAPI_FUNC(PyObject*)
 PyEval_CallObjectWithKeywords(PyObject *callable,
                               PyObject *args, PyObject *kwargs)
 {
@@ -583,9 +584,8 @@ PyObject_CallFunction(PyObject *callable, const char *format, ...)
 
 
 /* PyEval_CallFunction is exact copy of PyObject_CallFunction.
- * This function is kept for backward compatibility.
- */
-PyObject *
+   Function removed in Python 3.13 API but kept in the stable ABI. */
+PyAPI_FUNC(PyObject*)
 PyEval_CallFunction(PyObject *callable, const char *format, ...)
 {
     va_list va;
@@ -656,9 +656,8 @@ PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
 
 
 /* PyEval_CallMethod is exact copy of PyObject_CallMethod.
- * This function is kept for backward compatibility.
- */
-PyObject *
+   Function removed in Python 3.13 API but kept in the stable ABI. */
+PyAPI_FUNC(PyObject*)
 PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
 {
     PyThreadState *tstate = _PyThreadState_GET();