mirror of https://github.com/python/cpython
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)
|
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;
|
||||||
|
|
Loading…
Reference in New Issue