[pypy-svn] r49787 - in pypy/branch/lazy-write-barrier/pypy/rpython/memory: . gc gctransform

fijal at codespeak.net fijal at codespeak.net
Fri Dec 14 16:35:18 CET 2007


Author: fijal
Date: Fri Dec 14 16:35:17 2007
New Revision: 49787

Modified:
   pypy/branch/lazy-write-barrier/pypy/rpython/memory/gc/generation.py
   pypy/branch/lazy-write-barrier/pypy/rpython/memory/gctransform/framework.py
   pypy/branch/lazy-write-barrier/pypy/rpython/memory/gctypelayout.py
Log:
Another evil hack in the gctypelayout (C-c C-v programming)


Modified: pypy/branch/lazy-write-barrier/pypy/rpython/memory/gc/generation.py
==============================================================================
--- pypy/branch/lazy-write-barrier/pypy/rpython/memory/gc/generation.py	(original)
+++ pypy/branch/lazy-write-barrier/pypy/rpython/memory/gc/generation.py	Fri Dec 14 16:35:17 2007
@@ -1,4 +1,4 @@
-import sys
+import sys, os
 from pypy.rpython.memory.gc.semispace import SemiSpaceGC, GCFLAGSHIFT, \
     GCFLAG_IMMORTAL
 from pypy.rpython.lltypesystem.llmemory import NULL, raw_malloc_usage
@@ -38,6 +38,7 @@
                              max_space_size = max_space_size,
                              get_roots = get_roots)
         self.nursery_size = nursery_size
+        self.calls = 0
         assert nursery_size <= space_size // 2
 
     def setup(self):
@@ -295,10 +296,12 @@
             self.move_to_static_roots(addr_struct)
 
     def append_to_static_roots(self, pointer, arg):
+        os.write(2, "3\n")
         self.get_roots.append_static_root(pointer)
 
     def move_to_static_roots(self, addr_struct):
-        self.header(addr_struct).tid &= ~GCFLAG_NEVER_SET
+        objhdr = self.header(addr_struct)
+        objhdr.tid &= ~GCFLAG_NEVER_SET
         self.trace(addr_struct, self.append_to_static_roots, None)
 
     def remember_young_pointer(self, addr_struct, addr):

Modified: pypy/branch/lazy-write-barrier/pypy/rpython/memory/gctransform/framework.py
==============================================================================
--- pypy/branch/lazy-write-barrier/pypy/rpython/memory/gctransform/framework.py	(original)
+++ pypy/branch/lazy-write-barrier/pypy/rpython/memory/gctransform/framework.py	Fri Dec 14 16:35:17 2007
@@ -525,7 +525,7 @@
             ll_static_roots_inside[i] = addresses_of_static_ptrs[i]
         ll_instance.inst_static_root_start = llmemory.cast_ptr_to_adr(ll_static_roots_inside) + llmemory.ArrayItemsOffset(lltype.Array(llmemory.Address))
         ll_instance.inst_static_root_nongcstart = ll_instance.inst_static_root_start + llmemory.sizeof(llmemory.Address) * len(self.layoutbuilder.addresses_of_static_ptrs)
-        ll_instance.inst_static_root_end = ll_instance.inst_static_root_start + llmemory.sizeof(llmemory.Address) * len(ll_static_roots_inside)
+        ll_instance.inst_static_root_end = ll_instance.inst_static_root_start + llmemory.sizeof(llmemory.Address) * (len(ll_static_roots_inside) - additional_ptrs)
 
         newgcdependencies = []
         newgcdependencies.append(table)

Modified: pypy/branch/lazy-write-barrier/pypy/rpython/memory/gctypelayout.py
==============================================================================
--- pypy/branch/lazy-write-barrier/pypy/rpython/memory/gctypelayout.py	(original)
+++ pypy/branch/lazy-write-barrier/pypy/rpython/memory/gctypelayout.py	Fri Dec 14 16:35:17 2007
@@ -175,7 +175,9 @@
         adr = llmemory.cast_ptr_to_adr(value._as_ptr())
         if TYPE._gckind == "gc":
             if gen_gc:
-                for a in mutable_gc_pointers_inside(value, adr):
+                import py
+                py.test.pdb()
+                for a in gc_pointers_inside(value, adr):
                     self.additional_roots_sources += 1
                 return
             else:
@@ -221,6 +223,27 @@
         return llmemory.offsetof(WEAKREF, "weakptr")
     return -1
 
+def gc_pointers_inside(v, adr):
+    t = lltype.typeOf(v)
+    if isinstance(t, lltype.Struct):
+        for n, t2 in t._flds.iteritems():
+            if isinstance(t2, lltype.Ptr) and t2.TO._gckind == 'gc':
+                yield adr + llmemory.offsetof(t, n)
+            elif isinstance(t2, (lltype.Array, lltype.Struct)):
+                for a in gc_pointers_inside(getattr(v, n),
+                                            adr + llmemory.offsetof(t, n)):
+                    yield a
+    elif isinstance(t, lltype.Array):
+        if isinstance(t.OF, lltype.Ptr) and t.OF.TO._gckind == 'gc':
+            for i in range(len(v.items)):
+                yield adr + llmemory.itemoffsetof(t, i)
+        elif isinstance(t.OF, lltype.Struct):
+            for i in range(len(v.items)):
+                for a in gc_pointers_inside(v.items[i],
+                                            adr + llmemory.itemoffsetof(t, i)):
+                    yield a
+    
+
 def mutable_gc_pointers_inside(v, adr):
     t = lltype.typeOf(v)
     if isinstance(t, lltype.Struct):



More information about the Pypy-commit mailing list