mirror of
https://github.com/python/cpython.git
synced 2024-11-23 18:04:37 +08:00
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:
parent
001b21d1c5
commit
ce2c996b2f
@ -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;
|
||||
@ -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
|
||||
@ -882,8 +871,6 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
|
||||
insert_head(result, list);
|
||||
else
|
||||
insert_after(result, prev);
|
||||
skip_insert:
|
||||
;
|
||||
}
|
||||
}
|
||||
return (PyObject *) result;
|
||||
|
Loading…
Reference in New Issue
Block a user