[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