.. 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)
Test if the weak reference *ref* is dead. Returns 1 if the reference is
PyWeakref_CheckRef:int:::
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:PyObject*:ref:0:
PyWeakref_GetRef:PyObject**:pobj:+1:
func,PyVectorcall_Call,3.12,,
func,PyVectorcall_NARGS,3.12,,
type,PyWeakReference,3.2,,opaque
-func,PyWeakref_GetObject,3.2,,
func,PyWeakref_GetRef,3.13,,
func,PyWeakref_NewProxy,3.2,,
func,PyWeakref_NewRef,3.2,,
* The :c:func:`!PyImport_ImportModuleNoBlock`:
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
<https://github.com/python/pythoncapi-compat/>`__ can be used to get
:c:func:`PyWeakref_GetRef` on Python 3.12 and older.
+-----------------------------------+-----------------------------------+
| :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` |
+-----------------------------------+-----------------------------------+
(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
limited C API.
(Contributed by Victor Stinner in :issue:`35134`.)
(Contributed by Serhiy Storchaka in :gh:`110289`.)
* 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`
or ``NULL`` if the referent is no longer live.
(Contributed by Victor Stinner in :gh:`105927`.)
are just aliases to :c:type:`!wchar_t`.
(Contributed by Victor Stinner in :gh:`105156`.)
-* Deprecate the :c:func:`PyWeakref_GetObject` and
- :c:func:`PyWeakref_GET_OBJECT` functions,
+* Deprecate the :c:func:`!PyWeakref_GetObject` and
+ :c:func:`!PyWeakref_GET_OBJECT` functions,
which return a :term:`borrowed reference`.
Replace them with the new :c:func:`PyWeakref_GetRef` function,
which returns a :term:`strong reference`.
of :c:func:`PyImport_ImportModule`.
(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`.
Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead.
// Test if a weak reference is dead.
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))
PyObject *callback);
PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob,
PyObject *callback);
-Py_DEPRECATED(3.13) PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref);
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000
PyAPI_FUNC(int) PyWeakref_GetRef(PyObject *ref, PyObject **pobj);
.. nonce: Z0Zk_m
.. 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
limited C API.
.. nonce: GRxZtI
.. section: C API
-Deprecate the :c:func:`PyWeakref_GetObject` and
-:c:func:`PyWeakref_GET_OBJECT` functions: use the new
+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.
..
.. section: C API
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.
..
--- /dev/null
+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.
added = '3.2'
[function.PyWeakref_GetObject]
added = '3.2'
+ abi_only = true
[function.PyWeakref_NewProxy]
added = '3.2'
[function.PyWeakref_NewRef]
static PyObject *
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
+ // Get the function (removed in 3.15) from the stable ABI.
+ PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *);
// Create a new heap type, create an instance of this type, and delete the
// type. This object supports weak references.
ref = PyWeakref_GetObject(weakref); // borrowed ref
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
assert(Py_REFCNT(obj) == 1);
Py_DECREF(obj);
assert(PyWeakref_IsDead(weakref));
- // test PyWeakref_GET_OBJECT(), reference is dead
- assert(PyWeakref_GET_OBJECT(weakref) == Py_None);
-
// test PyWeakref_GetRef(), reference is dead
ref = UNINITIALIZED_PTR;
assert(PyWeakref_GetRef(weakref, &ref) == 0);
Py_DECREF(weakref);
Py_RETURN_NONE;
-
- _Py_COMP_DIAG_POP
}
struct simpletracer_data {
}
-PyObject *
+/* removed in 3.15, but kept for stable ABI compatibility */
+PyAPI_FUNC(PyObject *)
PyWeakref_GetObject(PyObject *ref)
{
if (ref == NULL || !PyWeakref_Check(ref)) {