Author: Maciej Fijalkowski <fij...@gmail.com> Branch: vmprof2 Changeset: r76830:2af4eb203367 Date: 2015-04-19 14:07 +0200 http://bitbucket.org/pypy/pypy/changeset/2af4eb203367/
Log: fix the test and hopefully fix the problem diff --git a/rpython/jit/backend/x86/test/test_recursive.py b/rpython/jit/backend/x86/test/test_recursive.py --- a/rpython/jit/backend/x86/test/test_recursive.py +++ b/rpython/jit/backend/x86/test/test_recursive.py @@ -12,14 +12,19 @@ return # this is 64 bit only check assert len(codemaps) == 3 + # we want to create a map of differences, so unpacking the tracebacks + # byte by byte codemaps.sort(lambda a, b: cmp(a[1], b[1])) # biggest is the big loop, smallest is the bridge - assert unpack_traceback(codemaps[1][0]) == [2] - # XXX very specific ASM addresses, very fragile test, but what we can - # do, really? 64bit only so far - assert unpack_traceback(codemaps[0][0]) == [2] - assert unpack_traceback(codemaps[1][0] + 100) == [2] - assert unpack_traceback(codemaps[2][0] + 100) == [4] - assert unpack_traceback(codemaps[2][0] + 200) == [4, 2] - assert unpack_traceback(codemaps[2][0] + 500) == [4, 2] - assert unpack_traceback(codemaps[2][0] + 380) == [4] + def get_ranges(c): + ranges = [] + prev_traceback = None + for b in range(c[0], c[0] + c[1]): + tb = unpack_traceback(b) + if tb != prev_traceback: + ranges.append(tb) + prev_traceback = tb + return ranges + assert get_ranges(codemaps[2]) == [[4], [4, 2], [4], [4, 2], [4]] + assert get_ranges(codemaps[1]) == [[2]] + assert get_ranges(codemaps[0]) == [[2], []] diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py --- a/rpython/jit/metainterp/pyjitpl.py +++ b/rpython/jit/metainterp/pyjitpl.py @@ -1163,12 +1163,15 @@ # itself, which has no result at all. assert len(self.metainterp.framestack) >= 2 try: - self.metainterp.finishframe(None) + old_frame = self.metainterp.framestack[-1] + self.metainterp.finishframe(None, leave_portal_frame=False) except ChangeFrame: pass frame = self.metainterp.framestack[-1] frame.do_recursive_call(jitdriver_sd, greenboxes + redboxes, orgpc, assembler_call=True) + jd_no = old_frame.jitcode.jitdriver_sd.index + self.metainterp.leave_portal_frame(jd_no) raise ChangeFrame def debug_merge_point(self, jitdriver_sd, jd_index, portal_call_depth, current_call_id, greenkey): @@ -1808,12 +1811,13 @@ self.history.record(rop.LEAVE_PORTAL_FRAME, [ConstInt(jd_no)], None) - def popframe(self): + def popframe(self, leave_portal_frame=True): frame = self.framestack.pop() jitcode = frame.jitcode if jitcode.jitdriver_sd: self.portal_call_depth -= 1 - self.leave_portal_frame(jitcode.jitdriver_sd.index) + if leave_portal_frame: + self.leave_portal_frame(jitcode.jitdriver_sd.index) self.call_ids.pop() if frame.greenkey is not None and self.is_main_jitcode(jitcode): self.portal_trace_positions.append( @@ -1824,10 +1828,10 @@ frame.cleanup_registers() self.free_frames_list.append(frame) - def finishframe(self, resultbox): + def finishframe(self, resultbox, leave_portal_frame=True): # handle a non-exceptional return from the current frame self.last_exc_value_box = None - self.popframe() + self.popframe(leave_portal_frame=leave_portal_frame) if self.framestack: if resultbox is not None: self.framestack[-1].make_result_of_lastop(resultbox) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit