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