[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