Skip to content

Commit a5e0562

Browse files
authored
gh-133644: remove PyWeakref_GetObject and PyWeakref_GET_OBJECT (GH-133657)
1 parent 30f8492 commit a5e0562

16 files changed

+24
-73
lines changed

Doc/c-api/weakref.rst

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -64,30 +64,6 @@ as much as it can.
6464
.. versionadded:: 3.13
6565
6666
67-
.. c:function:: PyObject* PyWeakref_GetObject(PyObject *ref)
68-
69-
Return a :term:`borrowed reference` to the referenced object from a weak
70-
reference, *ref*. If the referent is no longer live, returns ``Py_None``.
71-
72-
.. note::
73-
74-
This function returns a :term:`borrowed reference` to the referenced object.
75-
This means that you should always call :c:func:`Py_INCREF` on the object
76-
except when it cannot be destroyed before the last usage of the borrowed
77-
reference.
78-
79-
.. deprecated-removed:: 3.13 3.15
80-
Use :c:func:`PyWeakref_GetRef` instead.
81-
82-
83-
.. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref)
84-
85-
Similar to :c:func:`PyWeakref_GetObject`, but does no error checking.
86-
87-
.. deprecated-removed:: 3.13 3.15
88-
Use :c:func:`PyWeakref_GetRef` instead.
89-
90-
9167
.. c:function:: int PyWeakref_IsDead(PyObject *ref)
9268
9369
Test if the weak reference *ref* is dead. Returns 1 if the reference is

Doc/data/refcounts.dat

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2947,12 +2947,6 @@ PyWeakref_CheckProxy:PyObject*:ob:0:
29472947
PyWeakref_CheckRef:int:::
29482948
PyWeakref_CheckRef:PyObject*:ob:0:
29492949

2950-
PyWeakref_GET_OBJECT:PyObject*::0:
2951-
PyWeakref_GET_OBJECT:PyObject*:ref:0:
2952-
2953-
PyWeakref_GetObject:PyObject*::0:
2954-
PyWeakref_GetObject:PyObject*:ref:0:
2955-
29562950
PyWeakref_GetRef:int:::
29572951
PyWeakref_GetRef:PyObject*:ref:0:
29582952
PyWeakref_GetRef:PyObject**:pobj:+1:

Doc/data/stable_abi.dat

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Doc/deprecations/c-api-pending-removal-in-3.15.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Pending removal in Python 3.15
33

44
* The :c:func:`!PyImport_ImportModuleNoBlock`:
55
Use :c:func:`PyImport_ImportModule` instead.
6-
* :c:func:`PyWeakref_GetObject` and :c:func:`PyWeakref_GET_OBJECT`:
6+
* :c:func:`!PyWeakref_GetObject` and :c:func:`!PyWeakref_GET_OBJECT`:
77
Use :c:func:`PyWeakref_GetRef` instead. The `pythoncapi-compat project
88
<https://github.com/python/pythoncapi-compat/>`__ can be used to get
99
:c:func:`PyWeakref_GetRef` on Python 3.12 and older.

Doc/howto/free-threading-extensions.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,9 @@ that return :term:`strong references <strong reference>`.
173173
+-----------------------------------+-----------------------------------+
174174
| :c:func:`PyDict_Next` | none (see :ref:`PyDict_Next`) |
175175
+-----------------------------------+-----------------------------------+
176-
| :c:func:`PyWeakref_GetObject` | :c:func:`PyWeakref_GetRef` |
176+
| :c:func:`!PyWeakref_GetObject` | :c:func:`PyWeakref_GetRef` |
177177
+-----------------------------------+-----------------------------------+
178-
| :c:func:`PyWeakref_GET_OBJECT` | :c:func:`PyWeakref_GetRef` |
178+
| :c:func:`!PyWeakref_GET_OBJECT` | :c:func:`PyWeakref_GetRef` |
179179
+-----------------------------------+-----------------------------------+
180180
| :c:func:`PyImport_AddModule` | :c:func:`PyImport_AddModuleRef` |
181181
+-----------------------------------+-----------------------------------+

Doc/whatsnew/3.11.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2673,7 +2673,7 @@ Removed
26732673

26742674
(Contributed by Victor Stinner in :issue:`45474`.)
26752675

2676-
* Exclude :c:func:`PyWeakref_GET_OBJECT` from the limited C API. It never
2676+
* Exclude :c:func:`!PyWeakref_GET_OBJECT` from the limited C API. It never
26772677
worked since the :c:type:`!PyWeakReference` structure is opaque in the
26782678
limited C API.
26792679
(Contributed by Victor Stinner in :issue:`35134`.)

Doc/whatsnew/3.13.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2246,7 +2246,7 @@ New Features
22462246
(Contributed by Serhiy Storchaka in :gh:`110289`.)
22472247

22482248
* Add the :c:func:`PyWeakref_GetRef` function
2249-
as an alternative to :c:func:`PyWeakref_GetObject`
2249+
as an alternative to :c:func:`!PyWeakref_GetObject`
22502250
that returns a :term:`strong reference`
22512251
or ``NULL`` if the referent is no longer live.
22522252
(Contributed by Victor Stinner in :gh:`105927`.)
@@ -2531,8 +2531,8 @@ Deprecated C APIs
25312531
are just aliases to :c:type:`!wchar_t`.
25322532
(Contributed by Victor Stinner in :gh:`105156`.)
25332533

2534-
* Deprecate the :c:func:`PyWeakref_GetObject` and
2535-
:c:func:`PyWeakref_GET_OBJECT` functions,
2534+
* Deprecate the :c:func:`!PyWeakref_GetObject` and
2535+
:c:func:`!PyWeakref_GET_OBJECT` functions,
25362536
which return a :term:`borrowed reference`.
25372537
Replace them with the new :c:func:`PyWeakref_GetRef` function,
25382538
which returns a :term:`strong reference`.

Doc/whatsnew/3.15.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,11 @@ Removed C APIs
869869
of :c:func:`PyImport_ImportModule`.
870870
(Contributed by Bénédikt Tran in :gh:`133644`.)
871871

872+
* :c:func:`!PyWeakref_GetObject` and :c:macro:`!PyWeakref_GET_OBJECT`:
873+
use :c:func:`PyWeakref_GetRef` instead. The |pythoncapi_compat_project|
874+
can be used to get :c:func:`!PyWeakref_GetRef` on Python 3.12 and older.
875+
(Contributed by Bénédikt Tran in :gh:`133644`.)
876+
872877
* Remove deprecated :c:func:`!PySys_ResetWarnOptions`.
873878
Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead.
874879

Include/cpython/weakrefobject.h

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,3 @@ PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self);
4747

4848
// Test if a weak reference is dead.
4949
PyAPI_FUNC(int) PyWeakref_IsDead(PyObject *ref);
50-
51-
Py_DEPRECATED(3.13) static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj)
52-
{
53-
PyWeakReference *ref = _PyWeakref_CAST(ref_obj);
54-
PyObject *obj = ref->wr_object;
55-
// Explanation for the Py_REFCNT() check: when a weakref's target is part
56-
// of a long chain of deallocations which triggers the trashcan mechanism,
57-
// clearing the weakrefs can be delayed long after the target's refcount
58-
// has dropped to zero. In the meantime, code accessing the weakref will
59-
// be able to "see" the target object even though it is supposed to be
60-
// unreachable. See issue gh-60806.
61-
if (Py_REFCNT(obj) > 0) {
62-
return obj;
63-
}
64-
return Py_None;
65-
}
66-
#define PyWeakref_GET_OBJECT(ref) PyWeakref_GET_OBJECT(_PyObject_CAST(ref))

Include/weakrefobject.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob,
2727
PyObject *callback);
2828
PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob,
2929
PyObject *callback);
30-
Py_DEPRECATED(3.13) PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref);
3130

3231
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000
3332
PyAPI_FUNC(int) PyWeakref_GetRef(PyObject *ref, PyObject **pobj);

0 commit comments

Comments
 (0)