[pypy-commit] pypy default: A better fix

arigo noreply at buildbot.pypy.org
Wed Nov 7 14:06:07 CET 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r58783:fecb29911cb8
Date: 2012-11-07 13:13 +0100
http://bitbucket.org/pypy/pypy/changeset/fecb29911cb8/

Log:	A better fix

diff --git a/pypy/module/gc/referents.py b/pypy/module/gc/referents.py
--- a/pypy/module/gc/referents.py
+++ b/pypy/module/gc/referents.py
@@ -93,7 +93,7 @@
         return None
 
 def do_get_referrers(w_arg):
-    result_w = {}
+    result_w = []
     gcarg = rgc.cast_instance_to_gcref(w_arg)
     roots = [gcref for gcref in rgc.get_rpy_roots() if gcref]
     head = PathEntry(None, rgc.NULL_GCREF, roots)
@@ -106,17 +106,20 @@
                 if gcref == gcarg:
                     w_obj = head.get_most_recent_w_obj()
                     if w_obj is not None:
-                        result_w[w_obj] = None    # found!
-                else:
-                    rgc.toggle_gcflag_extra(gcref)
-                    head = PathEntry(head, gcref, rgc.get_rpy_referents(gcref))
+                        result_w.append(w_obj)   # found!
+                        rgc.toggle_gcflag_extra(gcref)  # toggle twice
+                rgc.toggle_gcflag_extra(gcref)
+                head = PathEntry(head, gcref, rgc.get_rpy_referents(gcref))
         else:
             # no more referents to visit
             head = head.prev
             if head is None:
                 break
+    # done.  Clear flags carefully
+    rgc.toggle_gcflag_extra(gcarg)
     clear_gcflag_extra(roots)
-    return result_w.keys()
+    clear_gcflag_extra([gcarg])
+    return result_w
 
 # ____________________________________________________________
 


More information about the pypy-commit mailing list