[pypy-svn] r27245 - in pypy/dist/pypy: rpython/memory translator/c
pedronis at codespeak.net
pedronis at codespeak.net
Mon May 15 18:30:02 CEST 2006
Author: pedronis
Date: Mon May 15 18:30:00 2006
New Revision: 27245
Modified:
pypy/dist/pypy/rpython/memory/gctransform.py
pypy/dist/pypy/translator/c/gc.py
Log:
generalize they way genc obtains gc header type info and values for constants for the framework case.
Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py (original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py Mon May 15 18:30:00 2006
@@ -884,6 +884,13 @@
r_gc = self.translator.rtyper.getrepr(s_gc)
self.c_const_gc = rmodel.inputconst(r_gc, self.gcdata.gc)
+ gc_header_offset = self.gcdata.gc.size_gc_header()
+ HDR = self._gc_HDR = gc_header_offset.minimal_layout
+ self._gc_fields = fields = []
+ for fldname in HDR._names:
+ FLDTYPE = getattr(HDR, fldname)
+ fields.append((fldname, FLDTYPE))
+
def build_stack_root_iterator(self):
gcdata = self.gcdata
sizeofaddr = llmemory.sizeof(llmemory.Address)
@@ -987,6 +994,17 @@
for a in gc_pointers_inside(value, llmemory.fakeaddress(value)):
self.addresses_of_static_ptrs_in_nongc.append(a)
+ def gc_fields(self):
+ return self._gc_fields
+
+ def gc_field_values_for(self, obj):
+ HDR = self._gc_HDR
+ p_hdr = lltype.malloc(HDR, immortal=True)
+ hdr_adr = llmemory.cast_ptr_to_adr(p_hdr)
+ vals = []
+ self.gcdata.gc.init_gc_object(hdr_adr, self.get_type_id(lltype.typeOf(obj)))
+ return [getattr(p_hdr, fldname) for fldname in HDR._names]
+
def offsets2table(self, offsets, TYPE):
try:
return self.offsettable_cache[TYPE]
Modified: pypy/dist/pypy/translator/c/gc.py
==============================================================================
--- pypy/dist/pypy/translator/c/gc.py (original)
+++ pypy/dist/pypy/translator/c/gc.py Mon May 15 18:30:00 2006
@@ -374,18 +374,16 @@
# %s = %s; /* for moving GCs */' % (args[1], args[0])
def common_gcheader_definition(self, defnode):
- # XXX assumes mark and sweep
- return [('typeid', lltype.Signed)]
+ return defnode.db.gctransformer.gc_fields()
def common_gcheader_initdata(self, defnode):
- # XXX this more or less assumes mark-and-sweep gc
o = defnode.obj
while True:
n = o._parentstructure()
if n is None:
break
o = n
- return [defnode.db.gctransformer.id_of_type[typeOf(o)] << 1]
+ return defnode.db.gctransformer.gc_field_values_for(o)
def zero_malloc(self, TYPE, esize, eresult):
assert TYPE._gcstatus() # we don't really support this
More information about the Pypy-commit
mailing list