Author: Armin Rigo <ar...@tunes.org>
Branch: jit-constptr-2
Changeset: r83500:aa7ba84109cb
Date: 2016-04-01 18:17 +0200
http://bitbucket.org/pypy/pypy/changeset/aa7ba84109cb/

Log:    Boehm support: the custom tracer won't work there, and the memory
        may not be scanned by Boehm itself

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
@@ -345,6 +345,13 @@
                                  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
 
@@ -755,6 +762,13 @@
         p = rffi.cast(rffi.CCHARP, p)
         return (ord(p[0]) & IS_OBJECT_FLAG) != 0
 
+    def make_gcref_tracer(self, array_base_addr, gcrefs):
+        from rpython.jit.backend.llsupport import gcreftracer
+        return gcreftracer.make_framework_tracer(array_base_addr, gcrefs)
+
+    def clear_gcref_tracer(self, tracer):
+        tracer.array_length = 0
+
 # ____________________________________________________________
 
 def get_ll_description(gcdescr, translator=None, rtyper=None):
diff --git a/rpython/jit/backend/llsupport/gcreftracer.py 
b/rpython/jit/backend/llsupport/gcreftracer.py
--- a/rpython/jit/backend/llsupport/gcreftracer.py
+++ b/rpython/jit/backend/llsupport/gcreftracer.py
@@ -21,7 +21,7 @@
         i += 1
 lambda_gcrefs_trace = lambda: gcrefs_trace
 
-def make_gcref_tracer(array_base_addr, gcrefs):
+def make_framework_tracer(array_base_addr, gcrefs):
     # careful about the order here: the allocation of the GCREFTRACER
     # can trigger a GC.  So we must write the gcrefs into the raw
     # array only afterwards...
@@ -39,3 +39,11 @@
     llop.gc_writebarrier(lltype.Void, tr)
     # --no GC until here--
     return tr
+
+def make_boehm_tracer(array_base_addr, gcrefs):
+    # copy the addresses, but return 'gcrefs' as the object that must be
+    # kept alive
+    for i in range(len(gcrefs)):
+        p = rffi.cast(rffi.SIGNEDP, array_base_addr + i * WORD)
+        p[0] = rffi.cast(lltype.Signed, gcrefs[i])
+    return gcrefs
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
@@ -251,7 +251,7 @@
         if tracers is not None:
             compiled_loop_token.asmmemmgr_gcreftracers = None
             for tracer in tracers:
-                tracer.array_length = 0
+                self.gc_ll_descr.clear_gcref_tracer(tracer)
         # then free all blocks of code and raw data
         blocks = compiled_loop_token.asmmemmgr_blocks
         if blocks is not None:
diff --git a/rpython/jit/backend/llsupport/test/test_gcreftracer.py 
b/rpython/jit/backend/llsupport/test/test_gcreftracer.py
--- a/rpython/jit/backend/llsupport/test/test_gcreftracer.py
+++ b/rpython/jit/backend/llsupport/test/test_gcreftracer.py
@@ -1,6 +1,7 @@
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
 from rpython.jit.backend.llsupport.gcreftracer import GCREFTRACER, gcrefs_trace
-from rpython.jit.backend.llsupport.gcreftracer import make_gcref_tracer
+from rpython.jit.backend.llsupport.gcreftracer import make_framework_tracer
+from rpython.jit.backend.llsupport.gcreftracer import make_boehm_tracer
 
 
 class FakeGC:
@@ -29,13 +30,24 @@
         assert gc.called[i] == rffi.cast(llmemory.Address, base + i * WORD)
     lltype.free(a, flavor='raw')
 
-def test_make_gcref_tracer():
+def test_make_framework_tracer():
     a = lltype.malloc(rffi.CArray(lltype.Signed), 3, flavor='raw')
     base = rffi.cast(lltype.Signed, a)
-    tr = make_gcref_tracer(base, [123, 456, 789])
+    tr = make_framework_tracer(base, [123, 456, 789])
     assert a[0] == 123
     assert a[1] == 456
     assert a[2] == 789
     assert tr.array_base_addr == base
     assert tr.array_length == 3
     lltype.free(a, flavor='raw')
+
+def test_make_boehm_tracer():
+    a = lltype.malloc(rffi.CArray(lltype.Signed), 3, flavor='raw')
+    base = rffi.cast(lltype.Signed, a)
+    lst = [123, 456, 789]
+    tr = make_boehm_tracer(base, lst)
+    assert a[0] == 123
+    assert a[1] == 456
+    assert a[2] == 789
+    assert tr is lst
+    lltype.free(a, flavor='raw')
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -2,7 +2,7 @@
 import os
 import py
 
-from rpython.jit.backend.llsupport import symbolic, jitframe, rewrite, 
gcreftracer
+from rpython.jit.backend.llsupport import symbolic, jitframe, rewrite
 from rpython.jit.backend.llsupport.assembler import (GuardToken, BaseAssembler,
                                                 DEBUG_COUNTER)
 from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
@@ -702,7 +702,8 @@
             # the gc table was already allocated by reserve_gcref_table()
             rawstart = self.gc_table_addr
         #
-        tracer = gcreftracer.make_gcref_tracer(rawstart, self._allgcrefs)
+        tracer = self.cpu.gc_ll_descr.make_gcref_tracer(rawstart,
+                                                        self._allgcrefs)
         gcreftracers = self.get_asmmemmgr_gcreftracers(looptoken)
         gcreftracers.append(tracer)    # keepalive
         self.teardown_gcrefs_list()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to