[pypy-svn] r23502 - pypy/dist/pypy/rpython/memory
cfbolz at codespeak.net
cfbolz at codespeak.net
Mon Feb 20 01:07:04 CET 2006
Author: cfbolz
Date: Mon Feb 20 01:07:02 2006
New Revision: 23502
Modified:
pypy/dist/pypy/rpython/memory/gctransform.py
Log:
prepare the usage of a _real_ gc. Use annotate_mixlevel_helper to annotate it
Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py (original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py Mon Feb 20 01:07:02 2006
@@ -5,8 +5,9 @@
from pypy.translator.unsimplify import insert_empty_block
from pypy.translator.translator import graphof
from pypy.annotation import model as annmodel
-from pypy.rpython import rmodel, objectmodel, rptr
+from pypy.rpython import rmodel, objectmodel, rptr, annlowlevel
from pypy.rpython.memory import gc, lladdress
+from pypy.rpython.normalizecalls import perform_normalizations
import sets, os
"""
@@ -624,37 +625,61 @@
return None
class FrameworkGCTransformer(BoehmGCTransformer):
- rootstacksize = 640*1024 # XXX adjust
- ROOTSTACK = lltype.Struct("root_stack", ("top", llmemory.Address),
- ("base", llmemory.Address))
def __init__(self, translator):
super(FrameworkGCTransformer, self).__init__(translator)
- rootstack = lltype.malloc(self.ROOTSTACK, immortal=True)
- rootstacksize = self.rootstacksize
+ class GCData(object):
+ startheapsize = 640*1024 # XXX adjust
+ rootstacksize = 640*1024 # XXX adjust
+ gcdata = GCData()
sizeofaddr = llmemory.sizeof(llmemory.Address)
+ from pypy.rpython.memory.lladdress import NULL
- def ll_frameworkgc_setup():
- stackbase = lladdress.raw_malloc(rootstacksize)
- rootstack.top = stackbase
- rootstack.base = stackbase
+ class StackRootIterator:
+ _alloc_flavor_ = 'raw'
+ def __init__(self):
+ self.current = gcdata.root_stack_top
+
+ def pop(self):
+ while self.current != gcdata.root_stack_base:
+ self.current -= sizeofaddr
+ result = self.current.address[0]
+ if result != NULL:
+ return result
+ return NULL
+
+ def frameworkgc_setup():
+ stackbase = lladdress.raw_malloc(GCData.rootstacksize)
+ gcdata.root_stack_top = stackbase
+ gcdata.root_stack_base = stackbase
+# from pypy.rpython.memory.gc import MarkSweepGC
+# gcdata.gc = MarkSweepGC(GCData.startheapsize, StackRootIterator)
- def ll_push_root(addr):
- top = rootstack.top
+ def push_root(addr):
+ top = gcdata.root_stack_top
top.address[0] = addr
- rootstack.top = top + sizeofaddr
+ gcdata.root_stack_top = top + sizeofaddr
- def ll_pop_root():
- top = rootstack.top - sizeofaddr
+ def pop_root():
+ top = gcdata.root_stack_top - sizeofaddr
result = top.address[0]
- rootstack.top = top
+ gcdata.root_stack_top = top
return result
- self.frameworkgc_setup_ptr = self.inittime_helper(
- ll_frameworkgc_setup, [], attach_empty_cleanup=True)
- self.push_root_ptr = self.inittime_helper(ll_push_root,
+ self.frameworkgc_setup_ptr = self.mixlevel_helper(
+ frameworkgc_setup, [], attach_empty_cleanup=True)
+ self.push_root_ptr = self.mixlevel_helper(push_root,
[annmodel.SomeAddress()])
- self.pop_root_ptr = self.inittime_helper(ll_pop_root, [])
+ self.pop_root_ptr = self.mixlevel_helper(pop_root, [])
+
+ def mixlevel_helper(self, helper, args_s, attach_empty_cleanup=False):
+ graph = annlowlevel.annotate_mixlevel_helper(self.translator.rtyper, helper, args_s)
+ self.seen_graphs[graph] = True
+ perform_normalizations(self.translator.rtyper)
+ self.specialize_more_blocks()
+ if attach_empty_cleanup:
+ MinimalGCTransformer(self.translator).transform_graph(graph)
+ return const_funcptr_fromgraph(graph)
def protect_roots(self, op, livevars):
livevars = [var for var in livevars if not var_ispyobj(var)]
More information about the Pypy-commit
mailing list