[pypy-commit] pypy vmprof: shuffle do_get_objects to rgc in a bit more general way
fijal
noreply at buildbot.pypy.org
Thu Mar 19 10:24:40 CET 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: vmprof
Changeset: r76462:b4cd3d16f845
Date: 2015-03-19 11:24 +0200
http://bitbucket.org/pypy/pypy/changeset/b4cd3d16f845/
Log: shuffle do_get_objects to rgc in a bit more general way
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
@@ -44,30 +44,6 @@
return OperationError(space.w_NotImplementedError,
space.wrap("operation not implemented by this GC"))
-# ____________________________________________________________
-
-def clear_gcflag_extra(fromlist):
- pending = fromlist[:]
- while pending:
- gcref = pending.pop()
- if rgc.get_gcflag_extra(gcref):
- rgc.toggle_gcflag_extra(gcref)
- pending.extend(rgc.get_rpy_referents(gcref))
-
-def do_get_objects():
- roots = [gcref for gcref in rgc.get_rpy_roots() if gcref]
- pending = roots[:]
- result_w = []
- while pending:
- gcref = pending.pop()
- if not rgc.get_gcflag_extra(gcref):
- rgc.toggle_gcflag_extra(gcref)
- w_obj = try_cast_gcref_to_w_root(gcref)
- if w_obj is not None:
- result_w.append(w_obj)
- pending.extend(rgc.get_rpy_referents(gcref))
- clear_gcflag_extra(roots)
- return result_w
# ____________________________________________________________
@@ -116,8 +92,8 @@
break
# done. Clear flags carefully
rgc.toggle_gcflag_extra(gcarg)
- clear_gcflag_extra(roots)
- clear_gcflag_extra([gcarg])
+ rgc.clear_gcflag_extra(roots)
+ rgc.clear_gcflag_extra([gcarg])
return result_w
# ____________________________________________________________
@@ -189,8 +165,7 @@
"""Return a list of all app-level objects."""
if not rgc.has_gcflag_extra():
raise missing_operation(space)
- result_w = do_get_objects()
- rgc.assert_no_more_gcflags()
+ result_w = rgc.do_get_objects(try_cast_gcref_to_w_root)
return space.newlist(result_w)
def get_referents(space, args_w):
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -692,3 +692,31 @@
lambda_func = hop.args_s[1].const
hop.exception_cannot_occur()
hop.rtyper.custom_trace_funcs.append((TP, lambda_func()))
+
+ at specialize.arg(0)
+def do_get_objects(callback):
+ """ Get all the objects that satisfy callback(gcref) -> True
+ """
+ roots = [gcref for gcref in get_rpy_roots() if gcref]
+ pending = roots[:]
+ result_w = []
+ while pending:
+ gcref = pending.pop()
+ if not get_gcflag_extra(gcref):
+ toggle_gcflag_extra(gcref)
+ w_obj = callback(gcref)
+ if w_obj is not None:
+ result_w.append(w_obj)
+ pending.extend(get_rpy_referents(gcref))
+ clear_gcflag_extra(roots)
+ assert_no_more_gcflags()
+ return result_w
+
+
+def clear_gcflag_extra(fromlist):
+ pending = fromlist[:]
+ while pending:
+ gcref = pending.pop()
+ if get_gcflag_extra(gcref):
+ toggle_gcflag_extra(gcref)
+ pending.extend(get_rpy_referents(gcref))
More information about the pypy-commit
mailing list