gh-105927: Deprecate PyWeakref_GetObject() function (#106006)

Deprecate PyWeakref_GetObject() and PyWeakref_GET_OBJECT() functions.
This commit is contained in:
Victor Stinner 2023-06-26 12:10:53 +02:00 committed by GitHub
parent dac3d389e7
commit c075a1974b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 33 additions and 4 deletions

View file

@ -74,11 +74,17 @@ as much as it can.
except when it cannot be destroyed before the last usage of the borrowed except when it cannot be destroyed before the last usage of the borrowed
reference. reference.
.. deprecated-removed:: 3.13 3.15
Use :c:func:`PyWeakref_GetRef` instead.
.. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref) .. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref)
Similar to :c:func:`PyWeakref_GetObject`, but does no error checking. Similar to :c:func:`PyWeakref_GetObject`, but does no error checking.
.. deprecated-removed:: 3.13 3.15
Use :c:func:`PyWeakref_GetRef` instead.
.. c:function:: void PyObject_ClearWeakRefs(PyObject *object) .. c:function:: void PyObject_ClearWeakRefs(PyObject *object)

View file

@ -470,6 +470,14 @@ Deprecated
Scheduled for removal in Python 3.15. Scheduled for removal in Python 3.15.
(Contributed by Victor Stinner in :gh:`105396`.) (Contributed by Victor Stinner in :gh:`105396`.)
* Deprecate the :c:func:`PyWeakref_GetObject` and
:c:func:`PyWeakref_GET_OBJECT` functions, which return a :term:`borrowed
reference`: use the new :c:func:`PyWeakref_GetRef` function instead, it
returns a :term:`strong reference`. The `pythoncapi-compat project
<https://github.com/python/pythoncapi-compat/>`__ can be used to get
:c:func:`PyWeakref_GetRef` on Python 3.12 and older.
(Contributed by Victor Stinner in :gh:`105927`.)
Removed Removed
------- -------
@ -565,7 +573,7 @@ Removed
* Remove the old private, undocumented and untested ``_PyGC_FINALIZED()`` macro * Remove the old private, undocumented and untested ``_PyGC_FINALIZED()`` macro
which was kept for backward compatibility with Python 3.8 and older: use which was kept for backward compatibility with Python 3.8 and older: use
:c:func:`PyObject_GC_IsFinalized()` instead. The `pythoncapi-compat project :c:func:`PyObject_GC_IsFinalized()` instead. The `pythoncapi-compat project
<https://github.com/python/pythoncapi-compat/>`_ can be used to get this <https://github.com/python/pythoncapi-compat/>`__ can be used to get this
function on Python 3.8 and older. function on Python 3.8 and older.
(Contributed by Victor Stinner in :gh:`105268`.) (Contributed by Victor Stinner in :gh:`105268`.)

View file

@ -32,7 +32,8 @@ struct _PyWeakReference {
vectorcallfunc vectorcall; vectorcallfunc vectorcall;
}; };
static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) { Py_DEPRECATED(3.13) static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj)
{
PyWeakReference *ref; PyWeakReference *ref;
PyObject *obj; PyObject *obj;
assert(PyWeakref_Check(ref_obj)); assert(PyWeakref_Check(ref_obj));

View file

@ -27,7 +27,7 @@ PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob,
PyObject *callback); PyObject *callback);
PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob, PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob,
PyObject *callback); PyObject *callback);
PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); Py_DEPRECATED(3.13) PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref);
PyAPI_FUNC(int) PyWeakref_GetRef(PyObject *ref, PyObject **pobj); PyAPI_FUNC(int) PyWeakref_GetRef(PyObject *ref, PyObject **pobj);

View file

@ -0,0 +1,3 @@
Deprecate the :c:func:`PyWeakref_GetObject` and
:c:func:`PyWeakref_GET_OBJECT` functions: use the new
:c:func:`PyWeakref_GetRef` function instead. Patch by Victor Stinner.

View file

@ -3375,6 +3375,10 @@ error:
static PyObject * static PyObject *
test_weakref_capi(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) test_weakref_capi(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
{ {
// Ignore PyWeakref_GetObject() deprecation, we test it on purpose
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
// Create a new heap type, create an instance of this type, and delete the // Create a new heap type, create an instance of this type, and delete the
// type. This object supports weak references. // type. This object supports weak references.
PyObject *new_type = PyObject_CallFunction((PyObject*)&PyType_Type, PyObject *new_type = PyObject_CallFunction((PyObject*)&PyType_Type,
@ -3463,6 +3467,8 @@ test_weakref_capi(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
Py_DECREF(weakref); Py_DECREF(weakref);
Py_RETURN_NONE; Py_RETURN_NONE;
_Py_COMP_DIAG_POP
} }

View file

@ -923,7 +923,12 @@ PyWeakref_GetObject(PyObject *ref)
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return NULL; return NULL;
} }
return PyWeakref_GET_OBJECT(ref); PyObject *obj = _PyWeakref_GET_REF(ref);
if (obj == NULL) {
return Py_None;
}
Py_DECREF(obj);
return obj; // borrowed reference
} }
/* Note that there's an inlined copy-paste of handle_callback() in gcmodule.c's /* Note that there's an inlined copy-paste of handle_callback() in gcmodule.c's