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

Reply via email to