Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r66285:7abd061e246f
Date: 2013-08-21 16:32 +0200
http://bitbucket.org/pypy/pypy/changeset/7abd061e246f/

Log:    fix an error in richards.py caused by missing barriers in llmodel.py

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
@@ -426,8 +426,8 @@
 
     @specialize.arg(2)
     def _do_barrier(self, gcref_struct, returns_modified_object):
+        raise NotImplementedError("implement in subclasses!")
         assert self.returns_modified_object == returns_modified_object
-        # XXX: fastpath for Read and Write variants
         funcptr = self.get_barrier_funcptr(returns_modified_object)
         res = funcptr(llmemory.cast_ptr_to_adr(gcref_struct))
         return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
@@ -451,7 +451,8 @@
         priv_rev = self.llop1.stm_get_adr_of_private_rev_num(rffi.SIGNEDP)
         if objhdr.h_revision == priv_rev[0]:
             return gcref_struct
-        
+
+        # readcache[obj] == obj
         read_cache = self.llop1.stm_get_adr_of_read_barrier_cache(rffi.SIGNEDP)
         objint = llmemory.cast_adr_to_int(objadr)
         assert WORD == 8, "check for 32bit compatibility"
@@ -461,7 +462,6 @@
         if rcp[index] == objint:
             return gcref_struct
         
-        # XXX: readcache!
         funcptr = self.get_barrier_funcptr(returns_modified_object)
         res = funcptr(objadr)
         return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
diff --git a/rpython/jit/backend/llsupport/llmodel.py 
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -52,6 +52,10 @@
             self._setup_exception_handling_untranslated()
         self.asmmemmgr = AsmMemoryManager()
         self._setup_frame_realloc(translate_support_code)
+        self._setup_descrs()
+        self.setup()
+
+    def _setup_descrs(self):
         ad = self.gc_ll_descr.getframedescrs(self).arraydescr
         self.signedarraydescr = ad
         # the same as normal JITFRAME, however with an array of pointers
@@ -63,7 +67,6 @@
         else:
             self.floatarraydescr = ArrayDescr(ad.basesize, ad.itemsize,
                                               ad.lendescr, FLAG_FLOAT)
-        self.setup()
 
     def getarraydescr_for_frame(self, type):
         if type == history.FLOAT:
@@ -475,6 +478,7 @@
 
     def bh_arraylen_gc(self, array, arraydescr):
         assert isinstance(arraydescr, ArrayDescr)
+        array = self.gc_ll_descr.do_stm_barrier(array, 'R')
         ofs = arraydescr.lendescr.offset
         return rffi.cast(rffi.CArrayPtr(lltype.Signed), array)[ofs/WORD]
 
@@ -617,18 +621,22 @@
         # --- end of GC unsafe code ---
 
     def bh_strlen(self, string):
+        string = self.gc_ll_descr.do_stm_barrier(string, 'R')
         s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
         return len(s.chars)
 
     def bh_unicodelen(self, string):
+        string = self.gc_ll_descr.do_stm_barrier(string, 'R')
         u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
         return len(u.chars)
 
     def bh_strgetitem(self, string, index):
+        string = self.gc_ll_descr.do_stm_barrier(string, 'R')
         s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
         return ord(s.chars[index])
 
     def bh_unicodegetitem(self, string, index):
+        string = self.gc_ll_descr.do_stm_barrier(string, 'R')
         u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
         return ord(u.chars[index])
 
@@ -759,6 +767,8 @@
     def bh_new_with_vtable(self, vtable, sizedescr):
         res = self.gc_ll_descr.gc_malloc(sizedescr)
         if self.vtable_offset is not None:
+            assert not self.gc_ll_descr.stm
+            res = self.gc_ll_descr.do_stm_barrier(res, 'W')
             as_array = rffi.cast(rffi.CArrayPtr(lltype.Signed), res)
             as_array[self.vtable_offset/WORD] = vtable
         return res
@@ -767,6 +777,7 @@
         return lltype.malloc(rffi.CCHARP.TO, size, flavor='raw')
 
     def bh_classof(self, struct):
+        struct = self.gc_ll_descr.do_stm_barrier(struct, 'R')
         struct = lltype.cast_opaque_ptr(rclass.OBJECTPTR, struct)
         result_adr = llmemory.cast_ptr_to_adr(struct.typeptr)
         return heaptracker.adr2int(result_adr)
@@ -781,19 +792,25 @@
         return self.gc_ll_descr.gc_malloc_unicode(length)
 
     def bh_strsetitem(self, string, index, newvalue):
+        string = self.gc_ll_descr.do_stm_barrier(string, 'W')
         s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
         s.chars[index] = chr(newvalue)
 
     def bh_unicodesetitem(self, string, index, newvalue):
+        string = self.gc_ll_descr.do_stm_barrier(string, 'W')
         u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
         u.chars[index] = unichr(newvalue)
 
     def bh_copystrcontent(self, src, dst, srcstart, dststart, length):
+        src = self.gc_ll_descr.do_stm_barrier(src, 'R')
+        dst = self.gc_ll_descr.do_stm_barrier(dst, 'W')
         src = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), src)
         dst = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), dst)
         rstr.copy_string_contents(src, dst, srcstart, dststart, length)
 
     def bh_copyunicodecontent(self, src, dst, srcstart, dststart, length):
+        src = self.gc_ll_descr.do_stm_barrier(src, 'R')
+        dst = self.gc_ll_descr.do_stm_barrier(dst, 'W')
         src = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), src)
         dst = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), dst)
         rstr.copy_unicode_contents(src, dst, srcstart, dststart, length)
diff --git a/rpython/jit/backend/x86/test/test_stm_integration.py 
b/rpython/jit/backend/x86/test/test_stm_integration.py
--- a/rpython/jit/backend/x86/test/test_stm_integration.py
+++ b/rpython/jit/backend/x86/test/test_stm_integration.py
@@ -188,15 +188,21 @@
                                RESULT=lltype.Signed)
 
         def malloc_big_fixedsize(size, tid):
+            print "malloc:", size, tid
+            if size > sys.maxint / 2:
+                # for testing exception
+                return lltype.nullptr(llmemory.GCREF.TO)
+            
             entries = size + StmGC.GCHDRSIZE
             TP = rffi.CArray(lltype.Char)
             obj = lltype.malloc(TP, n=entries, flavor='raw',
-                                            track_allocation=False, zero=True)
+                                track_allocation=False, zero=True)
             objptr = rffi.cast(StmGC.GCHDRP, obj)
             objptr.h_tid = rffi.cast(lltype.Unsigned,
-                                  StmGC.GCFLAG_OLD|StmGC.GCFLAG_WRITE_BARRIER
-                                  | tid)
+                                     StmGC.GCFLAG_OLD
+                                     | StmGC.GCFLAG_WRITE_BARRIER | tid)
             objptr.h_revision = rffi.cast(lltype.Signed, -sys.maxint)
+            print "return:", obj, objptr
             return rffi.cast(llmemory.GCREF, objptr)
         self.generate_function('malloc_big_fixedsize', malloc_big_fixedsize,
                                [lltype.Signed] * 2)
@@ -659,6 +665,108 @@
         deadframe = self.cpu.execute_token(othertoken, *args)
         assert called == [id(finish_descr2)]
 
+
+    def test_call_malloc_gc(self):
+        cpu = self.cpu
+        cpu.gc_ll_descr.init_nursery(100)
+        cpu.setup_once()
+
+        size = WORD*3
+        addr = cpu.gc_ll_descr.get_malloc_fn_addr('malloc_big_fixedsize')
+        typeid = 11
+        descr = cpu.gc_ll_descr.malloc_big_fixedsize_descr
+
+        p0 = BoxPtr()
+        ops1 = [ResOperation(rop.CALL_MALLOC_GC, 
+                             [ConstInt(addr), ConstInt(size), 
ConstInt(typeid)],
+                             p0, descr),
+                ResOperation(rop.FINISH, [p0], None, 
+                             descr=BasicFinalDescr(0)),
+                ]
+
+        inputargs = []
+        looptoken = JitCellToken()
+        c_loop = cpu.compile_loop(inputargs, ops1, 
+                                  looptoken)
+        
+        args = []
+        print "======"
+        print "inputargs:", inputargs, args
+        print "\n".join(map(str,c_loop[1]))
+        
+        frame = self.cpu.execute_token(looptoken, *args)
+
+
+    def test_assembler_call_propagate_exc(self):
+        cpu = self.cpu
+        cpu._setup_descrs()
+        cpu.gc_ll_descr.init_nursery(100)
+
+        excdescr = BasicFailDescr(666)
+        cpu.propagate_exception_descr = excdescr
+        cpu.setup_once()    # xxx redo it, because we added
+                            # propagate_exception
+
+        def assembler_helper(deadframe, virtualizable):
+            #assert cpu.get_latest_descr(deadframe) is excdescr
+            # let's assume we handled that
+            return 3
+
+        FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF,
+                                              llmemory.GCREF],
+                                             lltype.Signed))
+        class FakeJitDriverSD:
+            index_of_virtualizable = -1
+            _assembler_helper_ptr = llhelper(FUNCPTR, assembler_helper)
+            assembler_helper_adr = llmemory.cast_ptr_to_adr(
+                _assembler_helper_ptr)
+
+
+
+        addr = cpu.gc_ll_descr.get_malloc_fn_addr('malloc_big_fixedsize')
+        typeid = 11
+        descr = cpu.gc_ll_descr.malloc_big_fixedsize_descr
+
+        p0 = BoxPtr()
+        i0 = BoxInt()
+        ops = [ResOperation(rop.CALL_MALLOC_GC, 
+                            [ConstInt(addr), i0, ConstInt(typeid)],
+                            p0, descr),
+               ResOperation(rop.FINISH, [p0], None, 
+                            descr=BasicFinalDescr(0)),
+               ]
+
+        inputargs = [i0]
+        looptoken = JitCellToken()
+        looptoken.outermost_jitdriver_sd = FakeJitDriverSD()
+        c_loop = cpu.compile_loop(inputargs, ops, looptoken)
+        
+        
+        ARGS = [lltype.Signed] * 10
+        RES = lltype.Signed
+        FakeJitDriverSD.portal_calldescr = cpu.calldescrof(
+            lltype.Ptr(lltype.FuncType(ARGS, RES)), ARGS, RES,
+            EffectInfo.MOST_GENERAL)
+        i1 = ConstInt(sys.maxint - 1)
+        i2 = BoxInt()
+        finaldescr = BasicFinalDescr(1)
+        not_forced = ResOperation(rop.GUARD_NOT_FORCED, [], None,
+                                  descr=BasicFailDescr(1))
+        not_forced.setfailargs([])
+        ops = [ResOperation(rop.CALL_ASSEMBLER, [i1], i2, descr=looptoken),
+               not_forced,
+               ResOperation(rop.FINISH, [i1], None, descr=finaldescr),
+               ]
+        othertoken = JitCellToken()
+        cpu.done_with_this_frame_descr_int = BasicFinalDescr()
+        loop = cpu.compile_loop([], ops, othertoken)
+        
+        deadframe = cpu.execute_token(othertoken)
+        frame = rffi.cast(JITFRAMEPTR, deadframe)
+        frame_adr = rffi.cast(lltype.Signed, frame.jf_descr)
+        assert frame_adr != id(finaldescr)
+
+
     
         
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to