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