mirror of
https://github.com/python/cpython.git
synced 2025-11-02 19:12:55 +00:00
gh-105927: Remove _PyWeakref_GetWeakrefCount() (#106007)
Remove _PyWeakref_GetWeakrefCount() and _PyWeakref_ClearRef() from the public C API: move them to the internal C API. Refactor also _weakref_getweakrefs() code to make it more readable.
This commit is contained in:
parent
7b3ed5b29f
commit
6a80664ef1
4 changed files with 20 additions and 22 deletions
|
|
@ -32,10 +32,6 @@ struct _PyWeakReference {
|
|||
vectorcallfunc vectorcall;
|
||||
};
|
||||
|
||||
PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head);
|
||||
|
||||
PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self);
|
||||
|
||||
static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) {
|
||||
PyWeakReference *ref;
|
||||
PyObject *obj;
|
||||
|
|
|
|||
|
|
@ -46,6 +46,10 @@ static inline int _PyWeakref_IS_DEAD(PyObject *ref_obj) {
|
|||
return (Py_REFCNT(obj) == 0);
|
||||
}
|
||||
|
||||
extern Py_ssize_t _PyWeakref_GetWeakrefCount(PyWeakReference *head);
|
||||
|
||||
extern void _PyWeakref_ClearRef(PyWeakReference *self);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -89,26 +89,23 @@ static PyObject *
|
|||
_weakref_getweakrefs(PyObject *module, PyObject *object)
|
||||
/*[clinic end generated code: output=25c7731d8e011824 input=00c6d0e5d3206693]*/
|
||||
{
|
||||
PyObject *result = NULL;
|
||||
if (!_PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {
|
||||
return PyList_New(0);
|
||||
}
|
||||
|
||||
if (_PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {
|
||||
PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);
|
||||
Py_ssize_t count = _PyWeakref_GetWeakrefCount(*list);
|
||||
|
||||
result = PyList_New(count);
|
||||
if (result != NULL) {
|
||||
PyObject *result = PyList_New(count);
|
||||
if (result == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyWeakReference *current = *list;
|
||||
Py_ssize_t i;
|
||||
for (i = 0; i < count; ++i) {
|
||||
PyList_SET_ITEM(result, i, (PyObject *) current);
|
||||
Py_INCREF(current);
|
||||
for (Py_ssize_t i = 0; i < count; ++i) {
|
||||
PyList_SET_ITEM(result, i, Py_NewRef(current));
|
||||
current = current->wr_next;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
result = PyList_New(0);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "pycore_object.h"
|
||||
#include "pycore_pyerrors.h"
|
||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||
#include "pycore_weakref.h" // _PyWeakref_ClearRef()
|
||||
#include "pydtrace.h"
|
||||
|
||||
typedef struct _gc_runtime_state GCState;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue