Skip to content

Commit

Permalink
pythongh-111926: Simplify weakref creation logic (python#116843)
Browse files Browse the repository at this point in the history
Since 3.12, allocating a GC object cannot immediately trigger GC. This
allows us to simplify the logic for creating the canonical callback-less
weakref.
  • Loading branch information
mpage authored and diegorusso committed Apr 17, 2024
1 parent e7d58a0 commit a4a10d4
Showing 1 changed file with 5 additions and 15 deletions.
20 changes: 5 additions & 15 deletions Objects/weakrefobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -801,24 +801,14 @@ PyWeakref_NewRef(PyObject *ob, PyObject *callback)
if (result != NULL)
Py_INCREF(result);
else {
/* Note: new_weakref() can trigger cyclic GC, so the weakref
list on ob can be mutated. This means that the ref and
proxy pointers we got back earlier may have been collected,
so we need to compute these values again before we use
them. */
/* We do not need to recompute ref/proxy; new_weakref() cannot
trigger GC.
*/
result = new_weakref(ob, callback);
if (result != NULL) {
get_basic_refs(*list, &ref, &proxy);
if (callback == NULL) {
if (ref == NULL)
insert_head(result, list);
else {
/* Someone else added a ref without a callback
during GC. Return that one instead of this one
to avoid violating the invariants of the list
of weakrefs for ob. */
Py_SETREF(result, (PyWeakReference*)Py_NewRef(ref));
}
assert(ref == NULL);
insert_head(result, list);
}
else {
PyWeakReference *prev;
Expand Down

0 comments on commit a4a10d4

Please sign in to comment.