[pypy-commit] pypy op_malloc_gc: Refactor more. Test_rewrite passes.
arigo
noreply at buildbot.pypy.org
Tue Nov 29 14:34:42 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: op_malloc_gc
Changeset: r49959:911d0419ed7f
Date: 2011-11-29 09:50 +0100
http://bitbucket.org/pypy/pypy/changeset/911d0419ed7f/
Log: Refactor more. Test_rewrite passes.
diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -127,7 +127,6 @@
gcrootmap = None
write_barrier_descr = None
fielddescr_tid = None
- TIDFLAG_HAS_FINALIZER = 0
str_type_id = 0
unicode_type_id = 0
@@ -606,24 +605,40 @@
class GcLLDescr_framework(GcLLDescription):
DEBUG = False # forced to True by x86/test/test_zrpy_gc.py
- TIDFLAG_HAS_FINALIZER = 1 << llgroup.HALFSHIFT
- TIDFLAG_HAS_LIGHT_FINALIZER = 1 << (llgroup.HALFSHIFT+1)
-
- def __init__(self, gcdescr, translator, rtyper, llop1=llop):
+ def __init__(self, gcdescr, translator, rtyper, llop1=llop,
+ really_not_translated=False):
from pypy.rpython.memory.gctypelayout import check_typeid
from pypy.rpython.memory.gcheader import GCHeaderBuilder
from pypy.rpython.memory.gctransform import framework
GcLLDescription.__init__(self, gcdescr, translator, rtyper)
- assert self.translate_support_code, "required with the framework GC"
self.translator = translator
self.llop1 = llop1
+ if really_not_translated:
+ assert not self.translate_support_code # but half does not work
+ self._initialize_for_tests()
+ else:
+ assert self.translate_support_code,"required with the framework GC"
+ self._check_valid_gc()
+ self._make_gcrootmap()
+ self._make_layoutbuilder()
+ self._setup_gcclass()
+ def _initialize_for_tests(self):
+ self.layoutbuilder = None
+ self.str_type_id = 10083 # random, for tests only
+ self.unicode_type_id = 10085
+ self.fielddescr_tid = AbstractDescr()
+ self.max_size_of_young_obj = 1000
+ self.write_barrier_descr = None
+
+ def _check_valid_gc(self):
# we need the hybrid or minimark GC for rgc._make_sure_does_not_move()
# to work
- if gcdescr.config.translation.gc not in ('hybrid', 'minimark'):
+ if self.gcdescr.config.translation.gc not in ('hybrid', 'minimark'):
raise NotImplementedError("--gc=%s not implemented with the JIT" %
(gcdescr.config.translation.gc,))
+ def _make_gcrootmap(self):
# to find roots in the assembler, make a GcRootMap
name = gcdescr.config.translation.gcrootfinder
try:
@@ -634,6 +649,7 @@
gcrootmap = cls(gcdescr)
self.gcrootmap = gcrootmap
+ def _make_layoutbuilder(self):
# make a TransformerLayoutBuilder and save it on the translator
# where it can be fished and reused by the FrameworkGCTransformer
self.layoutbuilder = framework.TransformerLayoutBuilder(translator)
@@ -641,6 +657,7 @@
self.translator._jit2gc = {'layoutbuilder': self.layoutbuilder}
gcrootmap.add_jit2gc_hooks(self.translator._jit2gc)
+ def _setup_gcclass(self):
self.GCClass = self.layoutbuilder.GCClass
self.moving_gc = self.GCClass.moving_gc
self.HDRPTR = lltype.Ptr(self.GCClass.HDR)
@@ -657,14 +674,10 @@
# make a malloc function, with two arguments
def malloc_basic(size, tid):
type_id = llop.extract_ushort(llgroup.HALFWORD, tid)
- has_finalizer = bool(tid & self.TIDFLAG_HAS_FINALIZER)
- has_light_finalizer = bool(tid & self.TIDFLAG_HAS_LIGHT_FINALIZER)
check_typeid(type_id)
res = llop1.do_malloc_fixedsize_clear(llmemory.GCREF,
type_id, size,
- has_finalizer,
- has_light_finalizer,
- False)
+ False, False, False)
# In case the operation above failed, we are returning NULL
# from this function to assembler. There is also an RPython
# exception set, typically MemoryError; but it's easier and
@@ -757,18 +770,15 @@
self.gcrootmap.initialize()
def init_size_descr(self, S, descr):
- type_id = self.layoutbuilder.get_type_id(S)
- assert not self.layoutbuilder.is_weakref_type(S)
- flags = 0
- if self.layoutbuilder.has_finalizer(S):
- flags |= self.TIDFLAG_HAS_FINALIZER
- if self.layoutbuilder.has_light_finalizer(S):
- flags |= self.TIDFLAG_HAS_LIGHT_FINALIZER
- descr.tid = llop.combine_ushort(lltype.Signed, type_id, flags)
+ if self.layoutbuilder is not None:
+ type_id = self.layoutbuilder.get_type_id(S)
+ assert not self.layoutbuilder.is_weakref_type(S)
+ descr.tid = llop.combine_ushort(lltype.Signed, type_id, 0)
def init_array_descr(self, A, descr):
- type_id = self.layoutbuilder.get_type_id(A)
- descr.tid = llop.combine_ushort(lltype.Signed, type_id, 0)
+ if self.layoutbuilder is not None:
+ type_id = self.layoutbuilder.get_type_id(A)
+ descr.tid = llop.combine_ushort(lltype.Signed, type_id, 0)
def gc_malloc(self, sizedescr):
assert isinstance(sizedescr, BaseSizeDescr)
diff --git a/pypy/jit/backend/llsupport/rewrite.py b/pypy/jit/backend/llsupport/rewrite.py
--- a/pypy/jit/backend/llsupport/rewrite.py
+++ b/pypy/jit/backend/llsupport/rewrite.py
@@ -100,10 +100,7 @@
def handle_new_fixedsize(self, descr, op):
assert isinstance(descr, BaseSizeDescr)
size = descr.size
- if not (descr.tid & self.gc_ll_descr.TIDFLAG_HAS_FINALIZER):
- self.gen_malloc_nursery(size, op.result)
- else:
- self.gen_malloc_gc(size, op.result)
+ self.gen_malloc_nursery(size, op.result)
self.gen_initialize_tid(op.result, descr.tid)
def handle_new_array(self, tid, base_size, item_size, arraylen_descr, op):
diff --git a/pypy/jit/backend/llsupport/test/test_rewrite.py b/pypy/jit/backend/llsupport/test/test_rewrite.py
--- a/pypy/jit/backend/llsupport/test/test_rewrite.py
+++ b/pypy/jit/backend/llsupport/test/test_rewrite.py
@@ -15,64 +15,57 @@
class RewriteTests(object):
def check_rewrite(self, frm_operations, to_operations):
- self.gc_ll_descr.translate_support_code = False
- try:
- S = lltype.GcStruct('S', ('x', lltype.Signed),
- ('y', lltype.Signed))
- sdescr = get_size_descr(self.gc_ll_descr, S)
- sdescr.tid = 1234
- #
- T = lltype.GcStruct('T', ('y', lltype.Signed),
- ('z', lltype.Signed),
- ('t', lltype.Signed))
- tdescr = get_size_descr(self.gc_ll_descr, T)
- tdescr.tid = 5678
- #
- A = lltype.GcArray(lltype.Signed)
- adescr = get_array_descr(self.gc_ll_descr, A)
- adescr.tid = 4321
- alendescr = get_field_arraylen_descr(self.gc_ll_descr, A)
- #
- B = lltype.GcArray(lltype.Char)
- bdescr = get_array_descr(self.gc_ll_descr, B)
- bdescr.tid = 8765
- blendescr = get_field_arraylen_descr(self.gc_ll_descr, B)
- #
- E = lltype.GcStruct('Empty')
- edescr = get_size_descr(self.gc_ll_descr, E)
- edescr.tid = 9000
- #
- vtable_descr = self.gc_ll_descr.fielddescr_vtable
- O = lltype.GcStruct('O', ('parent', rclass.OBJECT),
- ('x', lltype.Signed))
- o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
- register_known_gctype(self.cpu, o_vtable, O)
- #
- try:
- tiddescr = self.gc_ll_descr.fielddescr_tid
- except AttributeError: # Boehm
- pass
- WORD = globals()['WORD']
- #
- str_type_id = self.gc_ll_descr.str_type_id
- str_basesize = self.gc_ll_descr.str_basesize
- str_itemsize = self.gc_ll_descr.str_itemsize
- strlendescr = get_field_arraylen_descr(self.gc_ll_descr, rstr.STR)
- #
- unicode_type_id = self.gc_ll_descr.unicode_type_id
- unicode_basesize = self.gc_ll_descr.unicode_basesize
- unicode_itemsize = self.gc_ll_descr.unicode_itemsize
- unicodelendescr = get_field_arraylen_descr(self.gc_ll_descr,
- rstr.UNICODE)
- #
- ops = parse(frm_operations, namespace=locals())
- expected = parse(to_operations % Evaluator(locals()),
- namespace=locals())
- operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
- ops.operations,
- [])
- finally:
- self.gc_ll_descr.translate_support_code = True
+ S = lltype.GcStruct('S', ('x', lltype.Signed),
+ ('y', lltype.Signed))
+ sdescr = get_size_descr(self.gc_ll_descr, S)
+ sdescr.tid = 1234
+ #
+ T = lltype.GcStruct('T', ('y', lltype.Signed),
+ ('z', lltype.Signed),
+ ('t', lltype.Signed))
+ tdescr = get_size_descr(self.gc_ll_descr, T)
+ tdescr.tid = 5678
+ #
+ A = lltype.GcArray(lltype.Signed)
+ adescr = get_array_descr(self.gc_ll_descr, A)
+ adescr.tid = 4321
+ alendescr = get_field_arraylen_descr(self.gc_ll_descr, A)
+ #
+ B = lltype.GcArray(lltype.Char)
+ bdescr = get_array_descr(self.gc_ll_descr, B)
+ bdescr.tid = 8765
+ blendescr = get_field_arraylen_descr(self.gc_ll_descr, B)
+ #
+ E = lltype.GcStruct('Empty')
+ edescr = get_size_descr(self.gc_ll_descr, E)
+ edescr.tid = 9000
+ #
+ vtable_descr = self.gc_ll_descr.fielddescr_vtable
+ O = lltype.GcStruct('O', ('parent', rclass.OBJECT),
+ ('x', lltype.Signed))
+ o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
+ register_known_gctype(self.cpu, o_vtable, O)
+ #
+ tiddescr = self.gc_ll_descr.fielddescr_tid
+ WORD = globals()['WORD']
+ #
+ str_type_id = self.gc_ll_descr.str_type_id
+ str_basesize = self.gc_ll_descr.str_basesize
+ str_itemsize = self.gc_ll_descr.str_itemsize
+ strlendescr = get_field_arraylen_descr(self.gc_ll_descr, rstr.STR)
+ #
+ unicode_type_id = self.gc_ll_descr.unicode_type_id
+ unicode_basesize = self.gc_ll_descr.unicode_basesize
+ unicode_itemsize = self.gc_ll_descr.unicode_itemsize
+ unicodelendescr = get_field_arraylen_descr(self.gc_ll_descr,
+ rstr.UNICODE)
+ #
+ ops = parse(frm_operations, namespace=locals())
+ expected = parse(to_operations % Evaluator(locals()),
+ namespace=locals())
+ operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
+ ops.operations,
+ [])
equaloplists(operations, expected.operations)
@@ -179,11 +172,9 @@
gcrootfinder = 'asmgcc'
gctransformer = 'framework'
gcremovetypeptr = False
- class FakeTranslator(object):
- config = config_
gcdescr = get_description(config_)
- self.gc_ll_descr = GcLLDescr_framework(gcdescr, FakeTranslator(),
- None, None)
+ self.gc_ll_descr = GcLLDescr_framework(gcdescr, None, None, None,
+ really_not_translated=True)
#
class FakeCPU(object):
def sizeof(self, STRUCT):
@@ -386,13 +377,21 @@
def test_rewrite_assembler_newstr_newunicode(self):
self.check_rewrite("""
[i2]
- p0 = newstr(10)
+ p0 = newstr(14)
p1 = newunicode(10)
p2 = newunicode(i2)
jump()
""", """
[i2]
- p0 = malloc_nursery(%(str_basesize + 10 * str_itemsize)d)
+ p0 = malloc_nursery(%(str_basesize + 16 * str_itemsize + \
+ unicode_basesize + 10 * unicode_itemsize)d)
setfield_gc(p0, %(str_type_id)d, descr=tiddescr)
+ setfield_gc(p0, 14, descr=strlendescr)
+ p1 = int_add(p0, %(str_basesize + 16 * str_itemsize)d)
+ setfield_gc(p1, %(unicode_type_id)d, descr=tiddescr)
+ setfield_gc(p1, 10, descr=unicodelendescr)
+ p2 = malloc_gc(%(unicode_basesize)d, i2, %(unicode_itemsize)d)
+ setfield_gc(p2, %(unicode_type_id)d, descr=tiddescr)
+ setfield_gc(p2, i2, descr=unicodelendescr)
jump()
""")
More information about the pypy-commit
mailing list