gh-133644: remove PyWeakref_GetObject and PyWeakref_GET_OBJECT (GH-133657)
This commit is contained in:
@@ -64,30 +64,6 @@ as much as it can.
|
|||||||
.. versionadded:: 3.13
|
.. versionadded:: 3.13
|
||||||
|
|
||||||
|
|
||||||
.. c:function:: PyObject* PyWeakref_GetObject(PyObject *ref)
|
|
||||||
|
|
||||||
Return a :term:`borrowed reference` to the referenced object from a weak
|
|
||||||
reference, *ref*. If the referent is no longer live, returns ``Py_None``.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
This function returns a :term:`borrowed reference` to the referenced object.
|
|
||||||
This means that you should always call :c:func:`Py_INCREF` on the object
|
|
||||||
except when it cannot be destroyed before the last usage of the borrowed
|
|
||||||
reference.
|
|
||||||
|
|
||||||
.. deprecated-removed:: 3.13 3.15
|
|
||||||
Use :c:func:`PyWeakref_GetRef` instead.
|
|
||||||
|
|
||||||
|
|
||||||
.. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref)
|
|
||||||
|
|
||||||
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:: int PyWeakref_IsDead(PyObject *ref)
|
.. c:function:: int PyWeakref_IsDead(PyObject *ref)
|
||||||
|
|
||||||
Test if the weak reference *ref* is dead. Returns 1 if the reference is
|
Test if the weak reference *ref* is dead. Returns 1 if the reference is
|
||||||
|
|||||||
@@ -2947,12 +2947,6 @@ PyWeakref_CheckProxy:PyObject*:ob:0:
|
|||||||
PyWeakref_CheckRef:int:::
|
PyWeakref_CheckRef:int:::
|
||||||
PyWeakref_CheckRef:PyObject*:ob:0:
|
PyWeakref_CheckRef:PyObject*:ob:0:
|
||||||
|
|
||||||
PyWeakref_GET_OBJECT:PyObject*::0:
|
|
||||||
PyWeakref_GET_OBJECT:PyObject*:ref:0:
|
|
||||||
|
|
||||||
PyWeakref_GetObject:PyObject*::0:
|
|
||||||
PyWeakref_GetObject:PyObject*:ref:0:
|
|
||||||
|
|
||||||
PyWeakref_GetRef:int:::
|
PyWeakref_GetRef:int:::
|
||||||
PyWeakref_GetRef:PyObject*:ref:0:
|
PyWeakref_GetRef:PyObject*:ref:0:
|
||||||
PyWeakref_GetRef:PyObject**:pobj:+1:
|
PyWeakref_GetRef:PyObject**:pobj:+1:
|
||||||
|
|||||||
1
Doc/data/stable_abi.dat
generated
1
Doc/data/stable_abi.dat
generated
@@ -830,7 +830,6 @@ member,PyVarObject.ob_size,3.2,,
|
|||||||
func,PyVectorcall_Call,3.12,,
|
func,PyVectorcall_Call,3.12,,
|
||||||
func,PyVectorcall_NARGS,3.12,,
|
func,PyVectorcall_NARGS,3.12,,
|
||||||
type,PyWeakReference,3.2,,opaque
|
type,PyWeakReference,3.2,,opaque
|
||||||
func,PyWeakref_GetObject,3.2,,
|
|
||||||
func,PyWeakref_GetRef,3.13,,
|
func,PyWeakref_GetRef,3.13,,
|
||||||
func,PyWeakref_NewProxy,3.2,,
|
func,PyWeakref_NewProxy,3.2,,
|
||||||
func,PyWeakref_NewRef,3.2,,
|
func,PyWeakref_NewRef,3.2,,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Pending removal in Python 3.15
|
|||||||
|
|
||||||
* The :c:func:`!PyImport_ImportModuleNoBlock`:
|
* The :c:func:`!PyImport_ImportModuleNoBlock`:
|
||||||
Use :c:func:`PyImport_ImportModule` instead.
|
Use :c:func:`PyImport_ImportModule` instead.
|
||||||
* :c:func:`PyWeakref_GetObject` and :c:func:`PyWeakref_GET_OBJECT`:
|
* :c:func:`!PyWeakref_GetObject` and :c:func:`!PyWeakref_GET_OBJECT`:
|
||||||
Use :c:func:`PyWeakref_GetRef` instead. The `pythoncapi-compat project
|
Use :c:func:`PyWeakref_GetRef` instead. The `pythoncapi-compat project
|
||||||
<https://github.com/python/pythoncapi-compat/>`__ can be used to get
|
<https://github.com/python/pythoncapi-compat/>`__ can be used to get
|
||||||
:c:func:`PyWeakref_GetRef` on Python 3.12 and older.
|
:c:func:`PyWeakref_GetRef` on Python 3.12 and older.
|
||||||
|
|||||||
@@ -173,9 +173,9 @@ that return :term:`strong references <strong reference>`.
|
|||||||
+-----------------------------------+-----------------------------------+
|
+-----------------------------------+-----------------------------------+
|
||||||
| :c:func:`PyDict_Next` | none (see :ref:`PyDict_Next`) |
|
| :c:func:`PyDict_Next` | none (see :ref:`PyDict_Next`) |
|
||||||
+-----------------------------------+-----------------------------------+
|
+-----------------------------------+-----------------------------------+
|
||||||
| :c:func:`PyWeakref_GetObject` | :c:func:`PyWeakref_GetRef` |
|
| :c:func:`!PyWeakref_GetObject` | :c:func:`PyWeakref_GetRef` |
|
||||||
+-----------------------------------+-----------------------------------+
|
+-----------------------------------+-----------------------------------+
|
||||||
| :c:func:`PyWeakref_GET_OBJECT` | :c:func:`PyWeakref_GetRef` |
|
| :c:func:`!PyWeakref_GET_OBJECT` | :c:func:`PyWeakref_GetRef` |
|
||||||
+-----------------------------------+-----------------------------------+
|
+-----------------------------------+-----------------------------------+
|
||||||
| :c:func:`PyImport_AddModule` | :c:func:`PyImport_AddModuleRef` |
|
| :c:func:`PyImport_AddModule` | :c:func:`PyImport_AddModuleRef` |
|
||||||
+-----------------------------------+-----------------------------------+
|
+-----------------------------------+-----------------------------------+
|
||||||
|
|||||||
@@ -2673,7 +2673,7 @@ Removed
|
|||||||
|
|
||||||
(Contributed by Victor Stinner in :issue:`45474`.)
|
(Contributed by Victor Stinner in :issue:`45474`.)
|
||||||
|
|
||||||
* Exclude :c:func:`PyWeakref_GET_OBJECT` from the limited C API. It never
|
* Exclude :c:func:`!PyWeakref_GET_OBJECT` from the limited C API. It never
|
||||||
worked since the :c:type:`!PyWeakReference` structure is opaque in the
|
worked since the :c:type:`!PyWeakReference` structure is opaque in the
|
||||||
limited C API.
|
limited C API.
|
||||||
(Contributed by Victor Stinner in :issue:`35134`.)
|
(Contributed by Victor Stinner in :issue:`35134`.)
|
||||||
|
|||||||
@@ -2246,7 +2246,7 @@ New Features
|
|||||||
(Contributed by Serhiy Storchaka in :gh:`110289`.)
|
(Contributed by Serhiy Storchaka in :gh:`110289`.)
|
||||||
|
|
||||||
* Add the :c:func:`PyWeakref_GetRef` function
|
* Add the :c:func:`PyWeakref_GetRef` function
|
||||||
as an alternative to :c:func:`PyWeakref_GetObject`
|
as an alternative to :c:func:`!PyWeakref_GetObject`
|
||||||
that returns a :term:`strong reference`
|
that returns a :term:`strong reference`
|
||||||
or ``NULL`` if the referent is no longer live.
|
or ``NULL`` if the referent is no longer live.
|
||||||
(Contributed by Victor Stinner in :gh:`105927`.)
|
(Contributed by Victor Stinner in :gh:`105927`.)
|
||||||
@@ -2531,8 +2531,8 @@ Deprecated C APIs
|
|||||||
are just aliases to :c:type:`!wchar_t`.
|
are just aliases to :c:type:`!wchar_t`.
|
||||||
(Contributed by Victor Stinner in :gh:`105156`.)
|
(Contributed by Victor Stinner in :gh:`105156`.)
|
||||||
|
|
||||||
* Deprecate the :c:func:`PyWeakref_GetObject` and
|
* Deprecate the :c:func:`!PyWeakref_GetObject` and
|
||||||
:c:func:`PyWeakref_GET_OBJECT` functions,
|
:c:func:`!PyWeakref_GET_OBJECT` functions,
|
||||||
which return a :term:`borrowed reference`.
|
which return a :term:`borrowed reference`.
|
||||||
Replace them with the new :c:func:`PyWeakref_GetRef` function,
|
Replace them with the new :c:func:`PyWeakref_GetRef` function,
|
||||||
which returns a :term:`strong reference`.
|
which returns a :term:`strong reference`.
|
||||||
|
|||||||
@@ -869,6 +869,11 @@ Removed C APIs
|
|||||||
of :c:func:`PyImport_ImportModule`.
|
of :c:func:`PyImport_ImportModule`.
|
||||||
(Contributed by Bénédikt Tran in :gh:`133644`.)
|
(Contributed by Bénédikt Tran in :gh:`133644`.)
|
||||||
|
|
||||||
|
* :c:func:`!PyWeakref_GetObject` and :c:macro:`!PyWeakref_GET_OBJECT`:
|
||||||
|
use :c:func:`PyWeakref_GetRef` instead. The |pythoncapi_compat_project|
|
||||||
|
can be used to get :c:func:`!PyWeakref_GetRef` on Python 3.12 and older.
|
||||||
|
(Contributed by Bénédikt Tran in :gh:`133644`.)
|
||||||
|
|
||||||
* Remove deprecated :c:func:`!PySys_ResetWarnOptions`.
|
* Remove deprecated :c:func:`!PySys_ResetWarnOptions`.
|
||||||
Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead.
|
Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead.
|
||||||
|
|
||||||
|
|||||||
@@ -47,20 +47,3 @@ PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self);
|
|||||||
|
|
||||||
// Test if a weak reference is dead.
|
// Test if a weak reference is dead.
|
||||||
PyAPI_FUNC(int) PyWeakref_IsDead(PyObject *ref);
|
PyAPI_FUNC(int) PyWeakref_IsDead(PyObject *ref);
|
||||||
|
|
||||||
Py_DEPRECATED(3.13) static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj)
|
|
||||||
{
|
|
||||||
PyWeakReference *ref = _PyWeakref_CAST(ref_obj);
|
|
||||||
PyObject *obj = ref->wr_object;
|
|
||||||
// Explanation for the Py_REFCNT() check: when a weakref's target is part
|
|
||||||
// of a long chain of deallocations which triggers the trashcan mechanism,
|
|
||||||
// clearing the weakrefs can be delayed long after the target's refcount
|
|
||||||
// has dropped to zero. In the meantime, code accessing the weakref will
|
|
||||||
// be able to "see" the target object even though it is supposed to be
|
|
||||||
// unreachable. See issue gh-60806.
|
|
||||||
if (Py_REFCNT(obj) > 0) {
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
return Py_None;
|
|
||||||
}
|
|
||||||
#define PyWeakref_GET_OBJECT(ref) PyWeakref_GET_OBJECT(_PyObject_CAST(ref))
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ 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);
|
||||||
Py_DEPRECATED(3.13) PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref);
|
|
||||||
|
|
||||||
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000
|
||||||
PyAPI_FUNC(int) PyWeakref_GetRef(PyObject *ref, PyObject **pobj);
|
PyAPI_FUNC(int) PyWeakref_GetRef(PyObject *ref, PyObject **pobj);
|
||||||
|
|||||||
@@ -1188,7 +1188,7 @@ context objects can now be disabled.
|
|||||||
.. nonce: Z0Zk_m
|
.. nonce: Z0Zk_m
|
||||||
.. section: C API
|
.. section: C API
|
||||||
|
|
||||||
Exclude :c:func:`PyWeakref_GET_OBJECT` from the limited C API. It never
|
Exclude :c:func:`!PyWeakref_GET_OBJECT` from the limited C API. It never
|
||||||
worked since the :c:type:`!PyWeakReference` structure is opaque in the
|
worked since the :c:type:`!PyWeakReference` structure is opaque in the
|
||||||
limited C API.
|
limited C API.
|
||||||
|
|
||||||
|
|||||||
@@ -6458,8 +6458,8 @@ Victor Stinner.
|
|||||||
.. nonce: GRxZtI
|
.. nonce: GRxZtI
|
||||||
.. section: C API
|
.. section: C API
|
||||||
|
|
||||||
Deprecate the :c:func:`PyWeakref_GetObject` and
|
Deprecate the :c:func:`!PyWeakref_GetObject` and
|
||||||
:c:func:`PyWeakref_GET_OBJECT` functions: use the new
|
:c:func:`!PyWeakref_GET_OBJECT` functions: use the new
|
||||||
:c:func:`PyWeakref_GetRef` function instead. Patch by Victor Stinner.
|
:c:func:`PyWeakref_GetRef` function instead. Patch by Victor Stinner.
|
||||||
|
|
||||||
..
|
..
|
||||||
@@ -6470,7 +6470,7 @@ Deprecate the :c:func:`PyWeakref_GetObject` and
|
|||||||
.. section: C API
|
.. section: C API
|
||||||
|
|
||||||
Add :c:func:`PyWeakref_GetRef` function: similar to
|
Add :c:func:`PyWeakref_GetRef` function: similar to
|
||||||
:c:func:`PyWeakref_GetObject` but returns a :term:`strong reference`, or
|
:c:func:`!PyWeakref_GetObject` but returns a :term:`strong reference`, or
|
||||||
``NULL`` if the referent is no longer live. Patch by Victor Stinner.
|
``NULL`` if the referent is no longer live. Patch by Victor Stinner.
|
||||||
|
|
||||||
..
|
..
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Remove deprecated function :c:func:`!PyWeakref_GetObject` and macro
|
||||||
|
:c:macro:`!PyWeakref_GET_OBJECT`. Use :c:func:`PyWeakref_GetRef` instead.
|
||||||
|
Patch by Bénédikt Tran.
|
||||||
@@ -1600,6 +1600,7 @@
|
|||||||
added = '3.2'
|
added = '3.2'
|
||||||
[function.PyWeakref_GetObject]
|
[function.PyWeakref_GetObject]
|
||||||
added = '3.2'
|
added = '3.2'
|
||||||
|
abi_only = true
|
||||||
[function.PyWeakref_NewProxy]
|
[function.PyWeakref_NewProxy]
|
||||||
added = '3.2'
|
added = '3.2'
|
||||||
[function.PyWeakref_NewRef]
|
[function.PyWeakref_NewRef]
|
||||||
|
|||||||
@@ -2206,9 +2206,8 @@ test_macros(PyObject *self, PyObject *Py_UNUSED(args))
|
|||||||
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
|
// Get the function (removed in 3.15) from the stable ABI.
|
||||||
_Py_COMP_DIAG_PUSH
|
PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *);
|
||||||
_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.
|
||||||
@@ -2249,19 +2248,12 @@ test_weakref_capi(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
|
|||||||
ref = PyWeakref_GetObject(weakref); // borrowed ref
|
ref = PyWeakref_GetObject(weakref); // borrowed ref
|
||||||
assert(ref == obj);
|
assert(ref == obj);
|
||||||
|
|
||||||
// test PyWeakref_GET_OBJECT(), reference is alive
|
|
||||||
ref = PyWeakref_GET_OBJECT(weakref); // borrowed ref
|
|
||||||
assert(ref == obj);
|
|
||||||
|
|
||||||
// delete the referenced object: clear the weakref
|
// delete the referenced object: clear the weakref
|
||||||
assert(Py_REFCNT(obj) == 1);
|
assert(Py_REFCNT(obj) == 1);
|
||||||
Py_DECREF(obj);
|
Py_DECREF(obj);
|
||||||
|
|
||||||
assert(PyWeakref_IsDead(weakref));
|
assert(PyWeakref_IsDead(weakref));
|
||||||
|
|
||||||
// test PyWeakref_GET_OBJECT(), reference is dead
|
|
||||||
assert(PyWeakref_GET_OBJECT(weakref) == Py_None);
|
|
||||||
|
|
||||||
// test PyWeakref_GetRef(), reference is dead
|
// test PyWeakref_GetRef(), reference is dead
|
||||||
ref = UNINITIALIZED_PTR;
|
ref = UNINITIALIZED_PTR;
|
||||||
assert(PyWeakref_GetRef(weakref, &ref) == 0);
|
assert(PyWeakref_GetRef(weakref, &ref) == 0);
|
||||||
@@ -2312,8 +2304,6 @@ 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct simpletracer_data {
|
struct simpletracer_data {
|
||||||
|
|||||||
@@ -964,7 +964,8 @@ PyWeakref_GetRef(PyObject *ref, PyObject **pobj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PyObject *
|
/* removed in 3.15, but kept for stable ABI compatibility */
|
||||||
|
PyAPI_FUNC(PyObject *)
|
||||||
PyWeakref_GetObject(PyObject *ref)
|
PyWeakref_GetObject(PyObject *ref)
|
||||||
{
|
{
|
||||||
if (ref == NULL || !PyWeakref_Check(ref)) {
|
if (ref == NULL || !PyWeakref_Check(ref)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user