[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