Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit