[pypy-svn] r23174 - pypy/branch/genc-gc-refactoring

mwh at codespeak.net mwh at codespeak.net
Thu Feb 9 14:31:55 CET 2006


Author: mwh
Date: Thu Feb  9 14:31:51 2006
New Revision: 23174

Modified:
   pypy/branch/genc-gc-refactoring/gc.py
   pypy/branch/genc-gc-refactoring/node.py
Log:
make BoehmGcPolicy work again.
some further cleanups to the GcPolicy API.


Modified: pypy/branch/genc-gc-refactoring/gc.py
==============================================================================
--- pypy/branch/genc-gc-refactoring/gc.py	(original)
+++ pypy/branch/genc-gc-refactoring/gc.py	Thu Feb  9 14:31:51 2006
@@ -15,28 +15,23 @@
         self.db = db
         self.thread_enabled = thread_enabled
 
-    def gcheader_field_name(self, defnode):
-        return None
-
     def common_gcheader_definition(self, defnode):
-        return ''
+        return []
 
-    def common_after_definition(self, defnode):
+    def common_gcheader_initdata(self, defnode):
         return []
 
-    def common_gcheader_initializationexpr(self, defnode):
-        return ''
+    def struct_gcheader_definition(self, defnode):
+        return self.common_gcheader_definition(defnode)
 
-    struct_gcheader_definition = common_gcheader_definition
-    struct_after_definition = common_after_definition
-    struct_gcheader_initializationexpr = common_gcheader_initializationexpr
+    def struct_gcheader_initdata(self, defnode):
+        return self.common_gcheader_initdata(defnode)
 
-    def prepare_nested_gcstruct(self, structdefnode, INNER):
-        pass
+    def array_gcheader_definition(self, defnode):
+        return self.common_gcheader_definition(defnode)
 
-    array_gcheader_definition = common_gcheader_definition
-    array_after_definition = common_after_definition
-    array_gcheader_initializationexpr = common_gcheader_initializationexpr
+    def array_gcheader_initdata(self, defnode):
+        return self.common_gcheader_initdata(defnode)
 
     def gc_libraries(self):
         return []
@@ -50,6 +45,17 @@
     def gc_startup_code(self):
         return []
 
+    def OP_GC_PUSH_ALIVE_PYOBJ(self, funcgen, op, err):
+        expr = funcgen.expr(op.args[0])
+        if expr == 'NULL':
+            return ''
+        return 'Py_XINCREF(%s);' % expr
+
+    def OP_GC_POP_ALIVE_PYOBJ(self, funcgen, op, err):
+        expr = funcgen.expr(op.args[0])
+        return 'Py_XDECREF(%s);' % expr
+
+
 class RefcountingInfo:
     static_deallocator = None
 
@@ -67,9 +73,6 @@
     def common_gcheader_definition(self, defnode):
         return [('refcount', lltype.Signed)]
 
-    def common_after_definition(self, defnode):
-        return ''
-
     def common_gcheader_initdata(self, defnode):
         return [REFCOUNT_IMMORTAL()]
 
@@ -86,29 +89,11 @@
             structdefnode.gcinfo = RefcountingInfo()
             structdefnode.gcinfo.static_deallocator = structdefnode.db.get(fptr)
 
-    struct_gcheader_definition = common_gcheader_definition
-
-    struct_after_definition = common_after_definition
-
-    def struct_implementationcode(self, structdefnode):
-        yield ""
-
-    struct_gcheader_initdata = common_gcheader_initdata
-
     # for arrays
 
     def array_setup(self, arraydefnode):
         pass
 
-    array_gcheader_definition = common_gcheader_definition
-
-    array_after_definition = common_after_definition
-
-    def array_implementationcode(self, arraydefnode):
-        yield ""
-
-    array_gcheader_initdata = common_gcheader_initdata
-
     # for rtti node
 
     def rtti_type(self):
@@ -125,16 +110,6 @@
                                                 eresult,
                                                 err)
 
-    def OP_GC_PUSH_ALIVE_PYOBJ(self, funcgen, op, err):
-        expr = funcgen.expr(op.args[0])
-        if expr == 'NULL':
-            return ''
-        return 'Py_XINCREF(%s);' % expr
-
-    def OP_GC_POP_ALIVE_PYOBJ(self, funcgen, op, err):
-        expr = funcgen.expr(op.args[0])
-        return 'Py_XDECREF(%s);' % expr
-
     def OP_GC_CALL_RTTI_DESTRUCTOR(self, funcgen, op, err):
         args = [funcgen.expr(v) for v in op.args]
         line = '%s(%s);' % (args[0], ', '.join(args[1:]))
@@ -144,6 +119,7 @@
         args = [funcgen.expr(v) for v in op.args]
         return 'OP_FREE(%s);' % (args[0], )    
 
+
 class RefcountingRuntimeTypeInfo_OpaqueNode(ContainerNode):
     nodekind = 'refcnt rtti'
     globalcontainer = True
@@ -172,70 +148,24 @@
 class BoehmInfo:
     finalizer = None
 
-"""
 class BoehmGcPolicy(BasicGcPolicy):
+    transformerclass = gctransform.BoehmGCTransformer
 
-    generic_dealloc = RefcountingGcPolicy.generic_dealloc.im_func
-
-    deallocator_lines = RefcountingGcPolicy.deallocator_lines.im_func
-
-    def common_after_definition(self, defnode):
-        if defnode.gcinfo:
-            gcinfo = defnode.gcinfo
-            if gcinfo.finalizer:
-                yield 'void %s(GC_PTR obj, GC_PTR ignore);' % (gcinfo.finalizer,)
-
-    # for arrays
+    def setup_gcinfo(self, defnode):
+        transformer = defnode.db.gctransformer
+        graph = transformer.finalizer_graph_for_type(defnode.LLTYPE)
+        if graph:
+            defnode.db.translator.rtyper.specialize_more_blocks()
+            FUNCTYPE = lltype.FuncType([llmemory.Address], lltype.Void)
+            fptr = lltype.functionptr(FUNCTYPE, graph.name, graph=graph)
+            defnode.gcinfo = BoehmInfo()
+            defnode.gcinfo.finalizer = defnode.db.get(fptr)
 
     def array_setup(self, arraydefnode):
-        if isinstance(arraydefnode.LLTYPE, GcArray) and list(self.deallocator_lines(arraydefnode, '')):
-            gcinfo = arraydefnode.gcinfo = BoehmInfo()
-            gcinfo.finalizer = self.db.namespace.uniquename('finalize_'+arraydefnode.barename)
-
-    def array_implementationcode(self, arraydefnode):
-        if arraydefnode.gcinfo:
-            gcinfo = arraydefnode.gcinfo
-            if gcinfo.finalizer:
-                yield 'void %s(GC_PTR obj, GC_PTR ignore) {' % (gcinfo.finalizer)
-                yield '\tstruct %s *a = (struct %s *)obj;' % (arraydefnode.name, arraydefnode.name)
-                for line in self.deallocator_lines(arraydefnode, '(*a)'):
-                    yield '\t' + line
-                yield '}'
-
-    array_after_definition = common_after_definition
+        self.setup_gcinfo(arraydefnode)
 
-    # for structs
     def struct_setup(self, structdefnode, rtti):
-        if isinstance(structdefnode.LLTYPE, GcStruct):
-	    has_del = rtti is not None and hasattr(rtti._obj, 'destructor_funcptr')
-            needs_deallocator = bool(list(self.deallocator_lines(structdefnode, '')))
-            gcinfo = structdefnode.gcinfo = BoehmInfo()
-            if needs_deallocator and has_del:
-                raise Exception("you cannot use __del__ with PyObjects and Boehm")
-            if needs_deallocator or has_del:
-                name = 'finalize_'+structdefnode.barename 
-                gcinfo.finalizer = self.db.namespace.uniquename(name)
-                if has_del:	
-                    destrptr = rtti._obj.destructor_funcptr
-                    gcinfo.destructor = self.db.get(destrptr)
-                    T = typeOf(destrptr).TO.ARGS[0]
-                    gcinfo.destructor_argtype = self.db.gettype(T)
-    struct_after_definition = common_after_definition
-
-    def struct_implementationcode(self, structdefnode):
-        if structdefnode.gcinfo:
-            gcinfo = structdefnode.gcinfo
-            if gcinfo.finalizer:
-                yield 'void %s(GC_PTR obj, GC_PTR ignore) {' % gcinfo.finalizer
-                yield '\tstruct %s *p = (struct %s *)obj;' % (structdefnode.name, structdefnode.name)
-		if hasattr(gcinfo, 'destructor'):
-                    yield '\t%s((%s) p);' % (
-                        gcinfo.destructor, cdecl(gcinfo.destructor_argtype, ''))
-                for line in self.deallocator_lines(structdefnode, '(*p)'):
-                    yield '\t' + line
-                yield '}'
-
-    # for rtti node
+        self.setup_gcinfo(structdefnode)
 
     def rtti_type(self):
         return BoehmGcRuntimeTypeInfo_OpaqueNode.typename
@@ -243,8 +173,6 @@
     def rtti_node_factory(self):
         return BoehmGcRuntimeTypeInfo_OpaqueNode
 
-    # zero malloc impl
-
     def zero_malloc(self, TYPE, esize, eresult, err):
         gcinfo = self.db.gettypedefnode(TYPE).gcinfo
         assert TYPE._gcstatus()   # _is_atomic() depends on this!
@@ -319,7 +247,3 @@
     def pre_pre_gc_code(self):
         yield '#define USING_NO_GC'
 
-    def struct_implementationcode(self, structdefnode):
-        return []
-    array_implementationcode = struct_implementationcode
-"""

Modified: pypy/branch/genc-gc-refactoring/node.py
==============================================================================
--- pypy/branch/genc-gc-refactoring/node.py	(original)
+++ pypy/branch/genc-gc-refactoring/node.py	Thu Feb  9 14:31:51 2006
@@ -112,9 +112,6 @@
             yield '\t' + 'int _dummy; /* this struct is empty */'
         yield '};'
 
-        for line in self.db.gcpolicy.struct_after_definition(self):
-            yield line
-
     def visitor_lines(self, prefix, on_field):
         STRUCT = self.STRUCT
         for name in STRUCT._names:
@@ -192,9 +189,6 @@
         yield '\t' + line
         yield '};'
 
-        for line in gcpolicy.array_after_definition(self):
-            yield line
-
     def visitor_lines(self, prefix, on_item):
         ARRAY = self.ARRAY
         # we need a unique name for this C variable, or at least one that does



More information about the Pypy-commit mailing list