gh-111926: Simplify proxy creation logic (#116844)

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.
This commit is contained in:
mpage 2024-03-15 06:58:40 -07:00 committed by GitHub
parent 001b21d1c5
commit ce2c996b2f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 3 additions and 16 deletions

View File

@ -848,11 +848,9 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
if (result != NULL) if (result != NULL)
Py_INCREF(result); Py_INCREF(result);
else { else {
/* Note: new_weakref() can trigger cyclic GC, so the weakref /* We do not need to recompute ref/proxy; new_weakref cannot
list on ob can be mutated. This means that the ref and trigger GC.
proxy pointers we got back earlier may have been collected, */
so we need to compute these values again before we use
them. */
result = new_weakref(ob, callback); result = new_weakref(ob, callback);
if (result != NULL) { if (result != NULL) {
PyWeakReference *prev; PyWeakReference *prev;
@ -863,16 +861,7 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
else { else {
Py_SET_TYPE(result, &_PyWeakref_ProxyType); Py_SET_TYPE(result, &_PyWeakref_ProxyType);
} }
get_basic_refs(*list, &ref, &proxy);
if (callback == NULL) { 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; prev = ref;
} }
else else
@ -882,8 +871,6 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
insert_head(result, list); insert_head(result, list);
else else
insert_after(result, prev); insert_after(result, prev);
skip_insert:
;
} }
} }
return (PyObject *) result; return (PyObject *) result;