Author: Armin Rigo <ar...@tunes.org> Branch: guard-compatible Changeset: r85228:524da3e89aea Date: 2016-06-19 19:08 +0100 http://bitbucket.org/pypy/pypy/changeset/524da3e89aea/
Log: Fix an easy and a subtle GC issue diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py --- a/rpython/jit/backend/llsupport/assembler.py +++ b/rpython/jit/backend/llsupport/assembler.py @@ -49,7 +49,8 @@ def compute_gcmap(self, gcmap, failargs, fail_locs, frame_depth): # note that regalloc has a very similar compute, but # one that does iteration over all bindings, so slightly different, - # eh + # eh. Also: for GUARD_COMPATIBLE, the gcmap we receive is not + # empty. Make sure we only add some bits, but don't remove any. input_i = 0 for i in range(len(failargs)): arg = failargs[i] diff --git a/rpython/jit/backend/llsupport/guard_compat.py b/rpython/jit/backend/llsupport/guard_compat.py --- a/rpython/jit/backend/llsupport/guard_compat.py +++ b/rpython/jit/backend/llsupport/guard_compat.py @@ -25,6 +25,7 @@ def _getofs(name): return llmemory.offsetof(BACKEND_CHOICES, name) BCFAILDESCR = _getofs('bc_faildescr') +BCGCTABLETRACER = _getofs('bc_gc_table_tracer') BCMOSTRECENT = _getofs('bc_most_recent') BCLIST = _getofs('bc_list') del _getofs @@ -46,6 +47,7 @@ def bchoices_trace(gc, obj_addr, callback, arg): gc._trace_callback(callback, arg, obj_addr + BCFAILDESCR) + gc._trace_callback(callback, arg, obj_addr + BCGCTABLETRACER) bchoices_pair(gc, obj_addr + BCMOSTRECENT, callback, arg) length = (obj_addr + BCLIST + BCLISTLENGTHOFS).signed[0] array_addr = obj_addr + BCLIST + BCLISTITEMSOFS 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 @@ -1937,7 +1937,15 @@ def implement_guard_recovery(self, guard_opnum, faildescr, failargs, fail_locs, frame_depth): - gcmap = allocate_gcmap(self, frame_depth, JITFRAME_FIXED_SIZE) + if guard_opnum == rop.GUARD_COMPATIBLE: + # In this case, we might stop at the guard but continue + # running anyway. So we must make sure that the gcmap + # ensures that all gcrefs stay alive. + gcmap = self._regalloc.get_gcmap() + else: + # Common case: get an empty gcmap. It will be filled + # with compute_gcmap() in llsupport.assembler. + gcmap = allocate_gcmap(self, frame_depth, JITFRAME_FIXED_SIZE) faildescrindex = self.get_gcref_from_faildescr(faildescr) return GuardToken(self.cpu, gcmap, faildescr, failargs, fail_locs, guard_opnum, frame_depth, faildescrindex) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit