Author: Armin Rigo <ar...@tunes.org>
Branch: jit-constptr-2
Changeset: r83509:3b8c459d92f7
Date: 2016-04-02 10:27 +0200
http://bitbucket.org/pypy/pypy/changeset/3b8c459d92f7/

Log:    Test fixes, including moving the two tests about pinned objects to
        test_rewrite.py: we don't need any special case about pinned objects
        any more. Just check that it still gives mostly the same results in
        terms of load_from_gc_table.

diff --git a/rpython/jit/backend/llsupport/gc.py 
b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -247,6 +247,14 @@
         """
         return jitframe.JITFRAME.allocate(frame_info)
 
+    def make_gcref_tracer(self, array_base_addr, gcrefs):
+        # for tests, or for Boehm.  Overridden for framework GCs
+        from rpython.jit.backend.llsupport import gcreftracer
+        return gcreftracer.make_boehm_tracer(array_base_addr, gcrefs)
+
+    def clear_gcref_tracer(self, tracer):
+        pass    # nothing needed unless overridden
+
 class JitFrameDescrs:
     def _freeze_(self):
         return True
@@ -345,13 +353,6 @@
                                  arraydescr.itemsize,
                                  arraydescr.lendescr.offset)
 
-    def make_gcref_tracer(self, array_base_addr, gcrefs):
-        from rpython.jit.backend.llsupport import gcreftracer
-        return gcreftracer.make_boehm_tracer(array_base_addr, gcrefs)
-
-    def clear_gcref_tracer(self, tracer):
-        pass    # nothing needed
-
 # ____________________________________________________________
 # All code below is for the hybrid or minimark GC
 
diff --git a/rpython/jit/backend/llsupport/test/test_pinned_object_rewrite.py 
b/rpython/jit/backend/llsupport/test/test_pinned_object_rewrite.py
deleted file mode 100644
--- a/rpython/jit/backend/llsupport/test/test_pinned_object_rewrite.py
+++ /dev/null
@@ -1,149 +0,0 @@
-from test_rewrite import get_size_descr, get_array_descr, get_description, 
BaseFakeCPU
-from rpython.jit.backend.llsupport.descr import get_size_descr,\
-     get_field_descr, get_array_descr, ArrayDescr, FieldDescr,\
-     SizeDescr, get_interiorfield_descr
-from rpython.jit.backend.llsupport.gc import GcLLDescr_boehm,\
-     GcLLDescr_framework, MovableObjectTracker
-from rpython.jit.backend.llsupport import jitframe, gc
-from rpython.jit.metainterp.gc import get_description
-from rpython.jit.tool.oparser import parse
-from rpython.jit.metainterp.optimizeopt.util import equaloplists
-from rpython.jit.metainterp.history import JitCellToken, FLOAT
-from rpython.rtyper.lltypesystem import lltype, rffi, lltype, llmemory
-from rpython.rtyper import rclass
-from rpython.jit.backend.x86.arch import WORD
-from rpython.rlib import rgc
-
-class Evaluator(object):
-    def __init__(self, scope):
-        self.scope = scope
-    def __getitem__(self, key):
-        return eval(key, self.scope)
-
-
-class FakeLoopToken(object):
-    pass
-
-# The following class is based on 
rpython.jit.backend.llsupport.test.test_rewrite.RewriteTests.
-# It's modified to be able to test the object pinning specific features.
-class RewriteTests(object):
-    def check_rewrite(self, frm_operations, to_operations, **namespace):
-        # objects to use inside the test
-        A = lltype.GcArray(lltype.Signed)
-        adescr = get_array_descr(self.gc_ll_descr, A)
-        adescr.tid = 4321
-        alendescr = adescr.lendescr
-        #
-        pinned_obj_type = lltype.GcStruct('PINNED_STRUCT', ('my_int', 
lltype.Signed))
-        pinned_obj_my_int_descr = get_field_descr(self.gc_ll_descr, 
pinned_obj_type, 'my_int')
-        pinned_obj_ptr = lltype.malloc(pinned_obj_type)
-        pinned_obj_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, 
pinned_obj_ptr)
-        assert rgc.pin(pinned_obj_gcref)
-        #
-        notpinned_obj_type = lltype.GcStruct('NOT_PINNED_STRUCT', ('my_int', 
lltype.Signed))
-        notpinned_obj_my_int_descr = get_field_descr(self.gc_ll_descr, 
notpinned_obj_type, 'my_int')
-        notpinned_obj_ptr = lltype.malloc(notpinned_obj_type)
-        notpinned_obj_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, 
notpinned_obj_ptr)
-        #
-        ptr_array_descr = 
self.cpu.arraydescrof(MovableObjectTracker.ptr_array_type)
-        #
-        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)
-        #
-        tiddescr = self.gc_ll_descr.fielddescr_tid
-        wbdescr = self.gc_ll_descr.write_barrier_descr
-        WORD = globals()['WORD']
-        #
-        strdescr     = self.gc_ll_descr.str_descr
-        unicodedescr = self.gc_ll_descr.unicode_descr
-        strlendescr     = strdescr.lendescr
-        unicodelendescr = unicodedescr.lendescr
-
-        casmdescr = JitCellToken()
-        clt = FakeLoopToken()
-        clt._ll_initial_locs = [0, 8]
-        frame_info = lltype.malloc(jitframe.JITFRAMEINFO, flavor='raw')
-        clt.frame_info = frame_info
-        frame_info.jfi_frame_depth = 13
-        frame_info.jfi_frame_size = 255
-        framedescrs = self.gc_ll_descr.getframedescrs(self.cpu)
-        framelendescr = framedescrs.arraydescr.lendescr
-        jfi_frame_depth = framedescrs.jfi_frame_depth
-        jfi_frame_size = framedescrs.jfi_frame_size
-        jf_frame_info = framedescrs.jf_frame_info
-        signedframedescr = self.cpu.signedframedescr
-        floatframedescr = self.cpu.floatframedescr
-        casmdescr.compiled_loop_token = clt
-        tzdescr = None # noone cares
-        #
-        namespace.update(locals())
-        #
-        for funcname in self.gc_ll_descr._generated_functions:
-            namespace[funcname] = self.gc_ll_descr.get_malloc_fn(funcname)
-            namespace[funcname + '_descr'] = getattr(self.gc_ll_descr,
-                                                     '%s_descr' % funcname)
-        #
-        ops = parse(frm_operations, namespace=namespace)
-        operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
-                                                        ops.operations,
-                                                        [])
-        # make the array containing the GCREF's accessible inside the tests.
-        # This must be done after we call 'rewrite_assembler'. Before that
-        # call 'last_moving_obj_tracker' is None or filled with some old
-        # value.
-        namespace['ptr_array_gcref'] = 
self.gc_ll_descr.last_moving_obj_tracker.ptr_array_gcref
-        expected = parse(to_operations % Evaluator(namespace),
-                         namespace=namespace)
-        equaloplists(operations, expected.operations)
-        lltype.free(frame_info, flavor='raw')
-
-class TestFramework(RewriteTests):
-    def setup_method(self, meth):
-        class config_(object):
-            class translation(object):
-                gc = 'minimark'
-                gcrootfinder = 'asmgcc'
-                gctransformer = 'framework'
-                gcremovetypeptr = False
-        gcdescr = get_description(config_)
-        self.gc_ll_descr = GcLLDescr_framework(gcdescr, None, None, None,
-                                               really_not_translated=True)
-        self.gc_ll_descr.write_barrier_descr.has_write_barrier_from_array = (
-            lambda cpu: True)
-        #
-        class FakeCPU(BaseFakeCPU):
-            def sizeof(self, STRUCT, is_object):
-                descr = SizeDescr(104)
-                descr.tid = 9315
-                descr.vtable = 12
-                return descr
-        self.cpu = FakeCPU()
-
-    def test_simple_getfield(self):
-        self.check_rewrite("""
-            []
-            i0 = getfield_gc_i(ConstPtr(pinned_obj_gcref), 
descr=pinned_obj_my_int_descr)
-            """, """
-            []
-            p1 = gc_load_r(ConstPtr(ptr_array_gcref), %(0 * 
ptr_array_descr.itemsize + 1)s, %(ptr_array_descr.itemsize)s)
-            i0 = gc_load_i(p1, 0, -%(pinned_obj_my_int_descr.field_size)s)
-            """)
-        assert len(self.gc_ll_descr.last_moving_obj_tracker._indexes) == 1
-
-    def test_simple_getfield_twice(self):
-        self.check_rewrite("""
-            []
-            i0 = getfield_gc_i(ConstPtr(pinned_obj_gcref), 
descr=pinned_obj_my_int_descr)
-            i1 = getfield_gc_i(ConstPtr(notpinned_obj_gcref), 
descr=notpinned_obj_my_int_descr)
-            i2 = getfield_gc_i(ConstPtr(pinned_obj_gcref), 
descr=pinned_obj_my_int_descr)
-            """, """
-            []
-            p1 = gc_load_r(ConstPtr(ptr_array_gcref), %(0 * 
ptr_array_descr.itemsize + 1)s, %(ptr_array_descr.itemsize)s)
-            i0 = gc_load_i(p1, 0, -%(pinned_obj_my_int_descr.field_size)s)
-            i1 = gc_load_i(ConstPtr(notpinned_obj_gcref), 0, 
-%(notpinned_obj_my_int_descr.field_size)s)
-            p2 = gc_load_r(ConstPtr(ptr_array_gcref), %(1 * 
ptr_array_descr.itemsize + 1)s, %(ptr_array_descr.itemsize)s)
-            i2 = gc_load_i(p2, 0, -%(pinned_obj_my_int_descr.field_size)s)
-            """)
-        assert len(self.gc_ll_descr.last_moving_obj_tracker._indexes) == 2
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py 
b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -1368,6 +1368,37 @@
         """)
         assert self.gcrefs == [self.myR1, self.myR1b]
 
+    def test_pinned_simple_getfield(self):
+        # originally in test_pinned_object_rewrite; now should give the
+        # same result for pinned objects and for normal objects
+        self.check_rewrite("""
+            []
+            i0 = getfield_gc_i(ConstPtr(myR1), descr=xdescr)
+        """, """
+            []
+            p1 = load_from_gc_table(0)
+            i0 = gc_load_i(p1, %(xdescr.offset)s, -%(xdescr.field_size)s)
+        """)
+        assert self.gcrefs == [self.myR1]
+
+    def test_pinned_simple_getfield_twice(self):
+        # originally in test_pinned_object_rewrite; now should give the
+        # same result for pinned objects and for normal objects
+        self.check_rewrite("""
+            []
+            i0 = getfield_gc_i(ConstPtr(myR1), descr=xdescr)
+            i1 = getfield_gc_i(ConstPtr(myR1b), descr=xdescr)
+            i2 = getfield_gc_i(ConstPtr(myR1), descr=xdescr)
+        """, """
+            []
+            p1 = load_from_gc_table(0)
+            i0 = gc_load_i(p1, %(xdescr.offset)s, -%(xdescr.field_size)s)
+            p2 = load_from_gc_table(1)
+            i1 = gc_load_i(p2, %(xdescr.offset)s, -%(xdescr.field_size)s)
+            i2 = gc_load_i(p1, %(xdescr.offset)s, -%(xdescr.field_size)s)
+        """)
+        assert self.gcrefs == [self.myR1, self.myR1b]
+
     def test_guard_in_gcref(self):
         self.check_rewrite("""
             [i1, i2]
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to