Author: fijal
Branch: faster-traceback
Changeset: r83416:88009e2e49fb
Date: 2016-03-29 14:15 +0200
http://bitbucket.org/pypy/pypy/changeset/88009e2e49fb/

Log:    remove outermost enter/leave frame, see what happens

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
@@ -1945,16 +1945,17 @@
                 jitcode.jitdriver_sd.jitdriver.is_recursive)
         #return self.jitdriver_sd is not None and jitcode is 
self.jitdriver_sd.mainjitcode
 
-    def newframe(self, jitcode, greenkey=None):
+    def newframe(self, jitcode, greenkey=None, enter_portal_frame=True):
         if jitcode.jitdriver_sd:
             self.portal_call_depth += 1
             self.call_ids.append(self.current_call_id)
-            unique_id = -1
-            if greenkey is not None:
-                unique_id = jitcode.jitdriver_sd.warmstate.get_unique_id(
-                    greenkey)
-                jd_no = jitcode.jitdriver_sd.index
-                self.enter_portal_frame(jd_no, unique_id)
+            if enter_portal_frame:
+                unique_id = -1
+                if greenkey is not None:
+                    unique_id = jitcode.jitdriver_sd.warmstate.get_unique_id(
+                        greenkey)
+                    jd_no = jitcode.jitdriver_sd.index
+                    self.enter_portal_frame(jd_no, unique_id)
             self.current_call_id += 1
         if greenkey is not None and self.is_main_jitcode(jitcode):
             self.portal_trace_positions.append(
@@ -1995,6 +1996,8 @@
     def finishframe(self, resultbox, leave_portal_frame=True):
         # handle a non-exceptional return from the current frame
         self.last_exc_value = lltype.nullptr(rclass.OBJECT)
+        if leave_portal_frame and len(self.framestack) == 1:
+            leave_portal_frame = False # don't emit for the last one
         self.popframe(leave_portal_frame=leave_portal_frame)
         if self.framestack:
             if resultbox is not None:
@@ -2033,7 +2036,8 @@
                     target = ord(code[position+1]) | (ord(code[position+2])<<8)
                     frame.pc = target
                     raise ChangeFrame
-            self.popframe()
+            # emit leave_portal_frame for all but last
+            self.popframe(leave_portal_frame=bool(self.framestack))
         try:
             self.compile_exit_frame_with_exception(self.last_exc_box)
         except SwitchToBlackhole, stb:
@@ -2714,7 +2718,8 @@
         # ----- make a new frame -----
         self.portal_call_depth = -1 # always one portal around
         self.framestack = []
-        f = self.newframe(self.jitdriver_sd.mainjitcode)
+        f = self.newframe(self.jitdriver_sd.mainjitcode,
+                          enter_portal_frame=False)
         f.setup_call(original_boxes)
         assert self.portal_call_depth == 0
         self.virtualref_boxes = []
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to