[pypy-svn] r24194 - in pypy/dist/pypy: rpython/memory translator/c translator/c/src

mwh at codespeak.net mwh at codespeak.net
Thu Mar 9 20:54:57 CET 2006


Author: mwh
Date: Thu Mar  9 20:54:55 2006
New Revision: 24194

Modified:
   pypy/dist/pypy/rpython/memory/gctransform.py
   pypy/dist/pypy/translator/c/database.py
   pypy/dist/pypy/translator/c/gc.py
   pypy/dist/pypy/translator/c/primitive.py
   pypy/dist/pypy/translator/c/src/g_prerequisite.h
Log:
so.  rip out about half the code i wrote yesterday :) and replace it with a
hook into the LowLevelDatabase to ensure the gctransformer gets to see all the
roots and their types.  we can build standalone stuff now, at last.



Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py	Thu Mar  9 20:54:55 2006
@@ -696,6 +696,9 @@
         self.gcdata = gcdata
         self.type_info_list = []
         self.id_of_type = {}      # {LLTYPE: type_id}
+        self.seen_roots = {}
+        self.static_gc_roots = []
+        self.addresses_of_static_ptrs_in_nongc = []
         self.offsettable_cache = {}
         self.malloc_fnptr_cache = {}
 
@@ -830,6 +833,18 @@
                 info["varitemsize"] = llmemory.sizeof(ARRAY.OF)
             return type_id
 
+    def consider_constant(self, TYPE, value):
+        if id(value) not in self.seen_roots:
+            self.seen_roots[id(value)] = True
+        if isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)):
+            self.get_type_id(TYPE)
+        if TYPE != lltype.PyObject and find_gc_ptrs_in_type(TYPE):
+            if isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)):
+                self.static_gc_roots.append(value)
+            else: 
+                for a in gc_pointers_inside(value, llmemory.fakeaddress(value)):
+                    self.addresses_of_static_ptrs_in_nongc.append(a)
+
     def offsets2table(self, offsets):
         key = tuple(offsets)
         try:
@@ -845,53 +860,6 @@
     def finish(self):
         newgcdependencies = super(FrameworkGCTransformer, self).finish()
         if self.type_info_list is not None:
-            # XXX this is a kind of sledgehammer-wallnut approach to make sure
-            # all types get an ID.
-            # and to find static roots
-            # XXX this replicates too much of pypy.rpython.memory.convertlltype :(
-            seen_types = {}
-
-            def recursive_get_types(t):
-                if t in seen_types:
-                    return
-                seen_types[t] = True
-                if isinstance(t, lltype.Ptr):
-                    recursive_get_types(t.TO)
-                elif isinstance(t, lltype.Struct):
-                    if isinstance(t, lltype.GcStruct):
-                        self.get_type_id(t)
-                    for n in t._flds:
-                        recursive_get_types(t._flds[n])
-                elif isinstance(t, lltype.Array):
-                    if isinstance(t, lltype.GcArray):
-                        self.get_type_id(t)
-                    recursive_get_types(t.OF)
-
-            ll_instance_memo = {}
-            static_gc_roots = {}
-            static_roots_inside_nongc = []
-            
-            for graph in self.translator.graphs:
-                for block in graph.iterblocks():
-                    for v in block.getvariables():
-                        t = getattr(v, 'concretetype', None)
-                        if t is None:
-                            continue
-                        recursive_get_types(v.concretetype)
-                    for v in block.getconstants():
-                        t = getattr(v, 'concretetype', None)
-                        if t is None:
-                            continue
-                        if isinstance(t, lltype.Ptr) and t.TO != lltype.PyObject and \
-                               find_gc_ptrs_in_type(t.TO):
-                            if t._needsgc():
-                                static_gc_roots[id(v.value)] = v
-                            else:
-                                for a in gc_pointers_inside(v.value._obj, llmemory.cast_ptr_to_adr(v.value)):
-                                    static_roots_inside_nongc.append(a)
-                        for T, inst in lltype.dissect_ll_instance(v.value, t, ll_instance_memo):
-                            if isinstance(T, (lltype.GcArray, lltype.GcStruct)):
-                                self.get_type_id(T)
 
             table = lltype.malloc(self.gcdata.TYPE_INFO_TABLE,
                                   len(self.type_info_list), immortal=True)
@@ -919,22 +887,20 @@
             #self.gcdata.type_info_table = table
 
             ll_static_roots = lltype.malloc(lltype.Array(llmemory.Address),
-                                            len(static_gc_roots),
+                                            len(self.static_gc_roots),
                                             immortal=True)
-            static_roots = static_gc_roots.values()
-            for i in range(len(static_roots)):
-                c = static_roots[i]
-                c_ll_c = rmodel.inputconst(c.concretetype, c.value)
-                ll_static_roots[i] = llmemory.cast_ptr_to_adr(c_ll_c.value)
+            for i in range(len(self.static_gc_roots)):
+                c = self.static_gc_roots[i]
+                ll_static_roots[i] = llmemory.fakeaddress(c)
             ll_instance.inst_static_roots = ll_static_roots
 
             ll_static_roots_inside = lltype.malloc(lltype.Array(llmemory.Address),
-                                                   len(static_roots_inside_nongc),
+                                                   len(self.addresses_of_static_ptrs_in_nongc),
                                                    immortal=True)
-            for i in range(len(static_roots_inside_nongc)):
-                ll_static_roots_inside[i] = static_roots_inside_nongc[i]
+            for i in range(len(self.addresses_of_static_ptrs_in_nongc)):
+                ll_static_roots_inside[i] = self.addresses_of_static_ptrs_in_nongc[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_end = ll_instance.inst_static_root_start + llmemory.sizeof(llmemory.Address) * len(static_roots_inside_nongc)
+            ll_instance.inst_static_root_end = ll_instance.inst_static_root_start + llmemory.sizeof(llmemory.Address) * len(ll_static_roots_inside)
             
             newgcdependencies = newgcdependencies or []
             newgcdependencies.append(table)

Modified: pypy/dist/pypy/translator/c/database.py
==============================================================================
--- pypy/dist/pypy/translator/c/database.py	(original)
+++ pypy/dist/pypy/translator/c/database.py	Thu Mar  9 20:54:55 2006
@@ -2,6 +2,7 @@
      Primitive, Ptr, typeOf, RuntimeTypeInfo, \
      Struct, Array, FuncType, PyObject, Void, \
      ContainerType, OpaqueType
+from pypy.rpython.lltypesystem import lltype
 from pypy.rpython.lltypesystem.llmemory import Address
 from pypy.rpython.memory.lladdress import NULL
 from pypy.translator.c.primitive import PrimitiveName, PrimitiveType
@@ -107,6 +108,9 @@
             node = self.containernodes[container]
         except KeyError:
             T = typeOf(container)
+            if isinstance(T, (lltype.Array, lltype.Struct)):
+                if hasattr(self.gctransformer, 'consider_constant'):
+                    self.gctransformer.consider_constant(T, container)
             nodefactory = ContainerNodeFactory[T.__class__]
             node = nodefactory(self, T, container)
             self.containernodes[container] = node

Modified: pypy/dist/pypy/translator/c/gc.py
==============================================================================
--- pypy/dist/pypy/translator/c/gc.py	(original)
+++ pypy/dist/pypy/translator/c/gc.py	Thu Mar  9 20:54:55 2006
@@ -280,6 +280,9 @@
         fnptr = self.db.gctransformer.frameworkgc_setup_ptr.value
         yield '%s();' % (self.db.get(fnptr),)
 
+    def pre_gc_code(self):
+        return []
+
     def OP_GC_RELOAD_POSSIBLY_MOVED(self, funcgen, op, err):
         args = [funcgen.expr(v) for v in op.args]
         return '%s = %s; /* for moving GCs */' % (args[1], args[0])

Modified: pypy/dist/pypy/translator/c/primitive.py
==============================================================================
--- pypy/dist/pypy/translator/c/primitive.py	(original)
+++ pypy/dist/pypy/translator/c/primitive.py	Thu Mar  9 20:54:55 2006
@@ -90,10 +90,18 @@
         if value.ob is None:
             return 'NULL'
         else:
-            return db.get(value.ob)
+            if isinstance(typeOf(value.ob), ContainerType):
+                return db.getcontainernode(value.ob).ptrname
+            else:
+                return db.get(value.ob)
     else:
         assert value.offset is not None
-        return '(void*)(((char*)(%s)) + (%s))'%(db.get(value.ob), db.get(value.offset))
+        if isinstance(typeOf(value.ob), ContainerType):
+            base = db.getcontainernode(value.ob).ptrname
+        else:
+            base = db.get(value.ob)
+        
+        return '(void*)(((char*)(%s)) + (%s))'%(base, db.get(value.offset))
 
 PrimitiveName = {
     Signed:   name_signed,

Modified: pypy/dist/pypy/translator/c/src/g_prerequisite.h
==============================================================================
--- pypy/dist/pypy/translator/c/src/g_prerequisite.h	(original)
+++ pypy/dist/pypy/translator/c/src/g_prerequisite.h	Thu Mar  9 20:54:55 2006
@@ -11,3 +11,5 @@
 
 #include "thread.h"   /* needs to be included early to define the
                          struct RPyOpaque_ThreadLock */
+
+#include <stddef.h>



More information about the Pypy-commit mailing list