[pypy-svn] r67332 - in pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport: . test

arigo at codespeak.net arigo at codespeak.net
Sat Aug 29 23:21:09 CEST 2009


Author: arigo
Date: Sat Aug 29 23:21:08 2009
New Revision: 67332

Modified:
   pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/gc.py
   pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_gc.py
Log:
Test for do_write_barrier.


Modified: pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/gc.py
==============================================================================
--- pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/gc.py	(original)
+++ pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/gc.py	Sat Aug 29 23:21:08 2009
@@ -266,6 +266,7 @@
 
     def __init__(self, gcdescr, translator, llop1=llop):
         from pypy.rpython.memory.gc.base import choose_gc_from_config
+        from pypy.rpython.memory.gcheader import GCHeaderBuilder
         from pypy.rpython.memory.gctransform import framework
         GcLLDescription.__init__(self, gcdescr, translator)
         assert self.translate_support_code, "required with the framework GC"
@@ -299,6 +300,7 @@
         self.GCClass, _ = choose_gc_from_config(gcdescr.config)
         self.moving_gc = self.GCClass.moving_gc
         self.HDRPTR = lltype.Ptr(self.GCClass.HDR)
+        self.gcheaderbuilder = GCHeaderBuilder(self.HDRPTR.TO)
         self.fielddescr_tid = get_field_descr(self, self.GCClass.HDR, 'tid')
         (self.array_basesize, _, self.array_length_ofs) = \
              symbolic.get_array_token(lltype.GcArray(lltype.Signed), True)
@@ -383,17 +385,16 @@
 
     def args_for_new(self, sizedescr):
         assert isinstance(sizedescr, BaseSizeDescr)
-        size = descrsize.v0
-        type_id = descrsize.type_id
-        has_finalizer = descrsize.flag2
+        size = sizedescr.size
+        type_id = sizedescr.type_id
+        has_finalizer = sizedescr.has_finalizer
         return [size, type_id, has_finalizer]
 
     def args_for_new_array(self, arraydescr):
-        assert isinstance(arraydescr, ConstDescr3)
-        basesize = arraydescr.v0
-        itemsize = arraydescr.v1
+        assert isinstance(arraydescr, BaseArrayDescr)
+        itemsize = arraydescr.get_item_size(self.translate_support_code)
         type_id = arraydescr.type_id
-        return [basesize, itemsize, type_id]
+        return [itemsize, type_id]
 
     def get_funcptr_for_new(self):
         return llhelper(self.GC_MALLOC_BASIC, self.malloc_basic)
@@ -409,6 +410,7 @@
 
     def do_write_barrier(self, gcref_struct, gcref_newptr):
         hdr_addr = llmemory.cast_ptr_to_adr(gcref_struct)
+        hdr_addr -= self.gcheaderbuilder.size_gc_header
         hdr = llmemory.cast_adr_to_ptr(hdr_addr, self.HDRPTR)
         if hdr.tid & self.GCClass.JIT_WB_IF_FLAG:
             # get a pointer to the 'remember_young_pointer' function from

Modified: pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_gc.py
==============================================================================
--- pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_gc.py	(original)
+++ pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_gc.py	Sat Aug 29 23:21:08 2009
@@ -121,50 +121,84 @@
                             repr(offset_to_length), p))
         return p
 
+    def _write_barrier_failing_case(self, adr_struct, adr_newptr):
+        self.record.append(('barrier', adr_struct, adr_newptr))
 
-def test_framework_malloc():
-    class FakeTranslator:
-        pass
-    class config:
-        class translation:
-            gc = 'hybrid'
-            gcrootfinder = 'asmgcc'
-            gctransformer = 'framework'
-    gcdescr = get_description(config)
-    translator = FakeTranslator()
-    llop1 = FakeLLOp()
-    gc_ll_descr = GcLLDescr_framework(gcdescr, FakeTranslator(), llop1)
-    #
-    # ---------- gc_malloc ----------
-    S = lltype.GcStruct('S', ('x', lltype.Signed))
-    sizedescr = get_size_descr(gc_ll_descr, S)
-    p = gc_ll_descr.gc_malloc(sizedescr)
-    assert llop1.record == [("fixedsize", sizedescr.type_id,
-                             repr(sizedescr.size), False, p)]
-    del llop1.record[:]
-    # ---------- gc_malloc_array ----------
-    A = lltype.GcArray(lltype.Signed)
-    arraydescr = get_array_descr(gc_ll_descr, A)
-    p = gc_ll_descr.gc_malloc_array(arraydescr, 10)
-    assert llop1.record == [("varsize", arraydescr.type_id, 10,
-                             repr(arraydescr.get_base_size(True)),
-                             repr(arraydescr.get_item_size(True)),
-                             repr(arraydescr.get_ofs_length(True)), p)]
-    del llop1.record[:]
-    # ---------- gc_malloc_str ----------
-    p = gc_ll_descr.gc_malloc_str(10)
-    type_id = gc_ll_descr.layoutbuilder.get_type_id(rstr.STR)
-    basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, True)
-    assert llop1.record == [("varsize", type_id, 10,
-                             repr(basesize), repr(itemsize), repr(ofs_length),
-                             p)]
-    del llop1.record[:]
-    # ---------- gc_malloc_unicode ----------
-    p = gc_ll_descr.gc_malloc_unicode(10)
-    type_id = gc_ll_descr.layoutbuilder.get_type_id(rstr.UNICODE)
-    basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
-                                                              True)
-    assert llop1.record == [("varsize", type_id, 10,
-                             repr(basesize), repr(itemsize), repr(ofs_length),
-                             p)]
-    del llop1.record[:]
+    def get_write_barrier_failing_case(self, FUNCTYPE):
+        return self._write_barrier_failing_case
+
+
+class TestFramework:
+
+    def setup_method(self, meth):
+        class FakeTranslator:
+            pass
+        class config:
+            class translation:
+                gc = 'hybrid'
+                gcrootfinder = 'asmgcc'
+                gctransformer = 'framework'
+        gcdescr = get_description(config)
+        translator = FakeTranslator()
+        self.llop1 = FakeLLOp()
+        self.gc_ll_descr = GcLLDescr_framework(gcdescr, FakeTranslator(),
+                                               self.llop1)
+
+    def test_gc_malloc(self):
+        S = lltype.GcStruct('S', ('x', lltype.Signed))
+        sizedescr = get_size_descr(self.gc_ll_descr, S)
+        p = self.gc_ll_descr.gc_malloc(sizedescr)
+        assert self.llop1.record == [("fixedsize", sizedescr.type_id,
+                                      repr(sizedescr.size), False, p)]
+        assert repr(self.gc_ll_descr.args_for_new(sizedescr)) == repr(
+            [sizedescr.size, sizedescr.type_id, False])
+
+    def test_gc_malloc_array(self):
+        A = lltype.GcArray(lltype.Signed)
+        arraydescr = get_array_descr(self.gc_ll_descr, A)
+        p = self.gc_ll_descr.gc_malloc_array(arraydescr, 10)
+        assert self.llop1.record == [("varsize", arraydescr.type_id, 10,
+                                      repr(arraydescr.get_base_size(True)),
+                                      repr(arraydescr.get_item_size(True)),
+                                      repr(arraydescr.get_ofs_length(True)),
+                                      p)]
+        assert repr(self.gc_ll_descr.args_for_new_array(arraydescr)) == repr(
+            [arraydescr.get_item_size(True), arraydescr.type_id])
+
+    def test_gc_malloc_str(self):
+        p = self.gc_ll_descr.gc_malloc_str(10)
+        type_id = self.gc_ll_descr.layoutbuilder.get_type_id(rstr.STR)
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+                                                                  True)
+        assert self.llop1.record == [("varsize", type_id, 10,
+                                      repr(basesize), repr(itemsize),
+                                      repr(ofs_length), p)]
+
+    def test_gc_malloc_unicode(self):
+        p = self.gc_ll_descr.gc_malloc_unicode(10)
+        type_id = self.gc_ll_descr.layoutbuilder.get_type_id(rstr.UNICODE)
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+                                                                  True)
+        assert self.llop1.record == [("varsize", type_id, 10,
+                                      repr(basesize), repr(itemsize),
+                                      repr(ofs_length), p)]
+
+    def test_do_write_barrier(self):
+        gc_ll_descr = self.gc_ll_descr
+        R = lltype.GcStruct('R')
+        S = lltype.GcStruct('S', ('r', lltype.Ptr(R)))
+        s = lltype.malloc(S)
+        r = lltype.malloc(R)
+        s_hdr = gc_ll_descr.gcheaderbuilder.new_header(s)
+        s_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, s)
+        r_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, r)
+        s_adr = llmemory.cast_ptr_to_adr(s)
+        r_adr = llmemory.cast_ptr_to_adr(r)
+        #
+        s_hdr.tid &= ~gc_ll_descr.GCClass.JIT_WB_IF_FLAG
+        gc_ll_descr.do_write_barrier(s_gcref, r_gcref)
+        assert self.llop1.record == []    # not called
+        #
+        s_hdr.tid |= gc_ll_descr.GCClass.JIT_WB_IF_FLAG
+        gc_ll_descr.do_write_barrier(s_gcref, r_gcref)
+        assert self.llop1.record == [('barrier', s_adr, r_adr)]



More information about the Pypy-commit mailing list