Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60133:0f2e3e9d6d9e
Date: 2013-01-17 15:40 +0200
http://bitbucket.org/pypy/pypy/changeset/0f2e3e9d6d9e/
Log: gcmap
diff --git a/pypy/jit/backend/llsupport/regalloc.py
b/pypy/jit/backend/llsupport/regalloc.py
--- a/pypy/jit/backend/llsupport/regalloc.py
+++ b/pypy/jit/backend/llsupport/regalloc.py
@@ -1,6 +1,6 @@
import os
from pypy.jit.metainterp.history import Const, Box, REF
-from pypy.rlib.objectmodel import we_are_translated
+from pypy.rlib.objectmodel import we_are_translated, specialize
from pypy.jit.metainterp.resoperation import rop
class TempBox(Box):
@@ -50,6 +50,13 @@
node = node.next
prev_node.next = Node(key, node)
+ @specialize.arg(1)
+ def foreach(self, function, arg):
+ node = self.master_node
+ while node is not None:
+ function(arg, node.val)
+ node = node.next
+
def pop(self, size, tp):
if size == 2:
return self._pop_two(tp)
@@ -81,9 +88,7 @@
return self.fm.frame_pos(node.val, tp)
node = node.next
- def __len__(self):
- """ For tests only
- """
+ def len(self):
node = self.master_node
c = 0
while node:
@@ -91,6 +96,11 @@
c += 1
return c
+ def __len__(self):
+ """ For tests only
+ """
+ return self.len()
+
def __repr__(self):
if not self.master_node:
return 'LinkedList(<empty>)'
@@ -211,6 +221,20 @@
self.bindings[box] = loc
return True
+ @staticmethod
+ def _gather_gcroots(lst, var):
+ lst.append(var)
+
+ def get_gc_map(self):
+ """ returns a list of locations where GC pointers are
+ """
+ assert not self.bindings
+ # XXX unsure, maybe what we want is to
+ # free everything instead
+ lst = []
+ self.freelist_gcrefs.foreach(self._gather_gcroots, lst)
+ return lst
+
# abstract methods that need to be overwritten for specific assemblers
@staticmethod
def frame_pos(loc, type):
diff --git a/pypy/jit/backend/llsupport/test/test_regalloc.py
b/pypy/jit/backend/llsupport/test/test_regalloc.py
--- a/pypy/jit/backend/llsupport/test/test_regalloc.py
+++ b/pypy/jit/backend/llsupport/test/test_regalloc.py
@@ -532,6 +532,9 @@
assert p2loc == ploc
assert not fm.freelist_gcrefs
assert len(fm.freelist_others) == 1
+ for box in fm.bindings.keys():
+ fm.mark_as_free(box)
+ assert fm.get_gc_map() == [5, 6]
def test_frame_manager_basic(self):
b0, b1 = newboxes(0, 1)
@@ -585,3 +588,6 @@
f3 = BoxFloat()
floc = fm.loc(f3)
assert fm.get_loc_index(floc) == 0
+ for box in fm.bindings.keys():
+ fm.mark_as_free(box)
+ assert fm.get_gc_map() == [7, 8]
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit