]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-111926: Simplify proxy creation logic (#116844)
authormpage <mpage@meta.com>
Fri, 15 Mar 2024 13:58:40 +0000 (06:58 -0700)
committerGitHub <noreply@github.com>
Fri, 15 Mar 2024 13:58:40 +0000 (09:58 -0400)
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.

Objects/weakrefobject.c

index 6264b1825eda73141f4f830bb4589e53273ccc51..b7b29064151609f4c1536db783771046c2e4a1ac 100644 (file)
@@ -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;