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

Reply via email to