[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