8000 Simplify weakref/proxy creation · python/cpython@4944b5f · GitHub
[go: up one dir, main page]

Skip to content

Commit 4944b5f

Browse files
committed
Simplify weakref/proxy creation
As of 3.12, Allocation no longer triggers GC. This allows us to stop having to recompute the "canonical" callback-less ref/proxy post allocation.
1 parent b54d7c8 commit 4944b5f

File tree

1 file changed

+6
-29
lines changed

1 file changed

+6
-29
lines changed

Objects/weakrefobject.c

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -801,24 +801,14 @@ PyWeakref_NewRef(PyObject *ob, PyObject *callback)
801801
if (result != NULL)
802802
Py_INCREF(result);
803803
else {
804-
/* Note: new_weakref() can trigger cyclic GC, so the weakref
805-
list on ob can be mutated. This means that the ref and
806-
proxy pointers we got back earlier may have been collected,
807-
so we need to compute these values again before we use
808-
them. */
804+
/* We do not need to recompute ref/proxy here; new_weakref() cannot
805+
trigger cyclic GC.
806+
*/
809807
result = new_weakref(ob, callback);
810808
if (result != NULL) {
811-
get_basic_refs(*list, &ref, &proxy);
812809
if (callback == NULL) {
813810
if (ref == NULL)
814811
insert_head(result, list);
815-
else {
816-
/* Someone else added a ref without a callback
817-
during GC. Return that one instead of this one
818-
to avoid violating the invariants of the list
819-
of weakrefs for ob. */
820-
Py_SETREF(result, (PyWeakReference*)Py_NewRef(ref));
821-
}
822812
}
823813
else {
824814
PyWeakReference *prev;
@@ -858,11 +848,9 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
858848
if (result != NULL)
859849
Py_INCREF(result);
860850
else {
861-
/* Note: new_weakref() can trigger cyclic GC, so the weakref
862-
list on ob can be mutated. This means that the ref and
863-
proxy pointers we got back earlier may have been collected,
864-
so we need to compute these values again before we use
865-
them. */
851+
/* We do not need to recompute ref/proxy here; new_weakref() cannot
852+
trigger cyclic GC.
853+
*/
866854
result = new_weakref(ob, callback);
867855
if (result != NULL) {
868856
PyWeakReference *prev;
@@ -873,16 +861,7 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
873861
else {
874862
Py_SET_TYPE(result, &_PyWeakref_ProxyType);
875863
}
876-
get_basic_refs(*list, &ref, &proxy);
877864
if (callback == NULL) {
878-
if (proxy != NULL) {
879-
/* Someone else added a proxy without a callback
880-
during GC. Return that one instead of this one
881-
to avoid violating the invariants of the list
882-
of weakrefs for ob. */
883-
Py_SETREF(result, (PyWeakReference*)Py_NewRef(proxy));
884-
goto skip_insert;
885-
}
886865
prev = ref;
887866
}
888867
else
@@ -892,8 +871,6 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
892871
insert_head(result, list);
893872
else
894873
insert_after(result, prev);
895-
skip_insert:
896-
;
897874
}
898875
}
899876
return (PyObject *) result;

0 commit comments

Comments
 (0)
0