mirror of
https://github.com/python/cpython.git
synced 2025-09-19 15:10:58 +00:00
gh-105927: Deprecate PyWeakref_GetObject() function (#106006)
Deprecate PyWeakref_GetObject() and PyWeakref_GET_OBJECT() functions.
This commit is contained in:
parent
dac3d389e7
commit
c075a1974b
7 changed files with 33 additions and 4 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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`.)
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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.
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue