Skip to content

Commit

Permalink
pythongh-111926: Simplify proxy creation logic (python#116844)
Browse files Browse the repository at this point in the history
Since 3.12, allocating a GC-able object cannot trigger GC. This allows
us to simplify the logic for creating the canonical callback-less
proxy object.
  • Loading branch information
mpage authored and diegorusso committed Apr 17, 2024
1 parent a4a10d4 commit 552272b
Showing 1 changed file with 3 additions and 16 deletions.
19 changes: 3 additions & 16 deletions Objects/weakrefobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -848,11 +848,9 @@ PyWeakref_NewProxy(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) {
PyWeakReference *prev;
Expand All @@ -863,16 +861,7 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
else {
Py_SET_TYPE(result, &_PyWeakref_ProxyType);
}
get_basic_refs(*list, &ref, &proxy);
if (callback == NULL) {
if (proxy != NULL) {
/* Someone else added a proxy 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(proxy));
goto skip_insert;
}
prev = ref;
}
else
Expand All @@ -882,8 +871,6 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
insert_head(result, list);
else
insert_after(result, prev);
skip_insert:
;
}
}
return (PyObject *) result;
Expand Down

0 comments on commit 552272b

Please sign in to comment.