Author: Armin Rigo <[email protected]>
Branch: issue2335
Changeset: r85623:7667ac88c004
Date: 2016-07-09 14:59 +0200
http://bitbucket.org/pypy/pypy/changeset/7667ac88c004/

Log:    Un-backout 5440c8b2d979

diff --git a/rpython/jit/metainterp/compile.py 
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -615,28 +615,35 @@
     final_descr = True
 
 class DoneWithThisFrameDescrVoid(_DoneWithThisFrameDescr):
+    def get_result(self, cpu, deadframe):
+        return None
     def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
         assert jitdriver_sd.result_type == history.VOID
         raise jitexc.DoneWithThisFrameVoid()
 
 class DoneWithThisFrameDescrInt(_DoneWithThisFrameDescr):
+    def get_result(self, cpu, deadframe):
+        return cpu.get_int_value(deadframe, 0)
     def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
         assert jitdriver_sd.result_type == history.INT
-        result = metainterp_sd.cpu.get_int_value(deadframe, 0)
-        raise jitexc.DoneWithThisFrameInt(result)
+        cpu = metainterp_sd.cpu
+        raise jitexc.DoneWithThisFrameInt(self.get_result(cpu, deadframe))
 
 class DoneWithThisFrameDescrRef(_DoneWithThisFrameDescr):
+    def get_result(self, cpu, deadframe):
+        return cpu.get_ref_value(deadframe, 0)
     def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
         assert jitdriver_sd.result_type == history.REF
         cpu = metainterp_sd.cpu
-        result = cpu.get_ref_value(deadframe, 0)
-        raise jitexc.DoneWithThisFrameRef(cpu, result)
+        raise jitexc.DoneWithThisFrameRef(cpu, self.get_result(cpu, deadframe))
 
 class DoneWithThisFrameDescrFloat(_DoneWithThisFrameDescr):
+    def get_result(self, cpu, deadframe):
+        return cpu.get_float_value(deadframe, 0)
     def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
         assert jitdriver_sd.result_type == history.FLOAT
-        result = metainterp_sd.cpu.get_float_value(deadframe, 0)
-        raise jitexc.DoneWithThisFrameFloat(result)
+        cpu = metainterp_sd.cpu
+        raise jitexc.DoneWithThisFrameFloat(self.get_result(cpu, deadframe))
 
 class ExitFrameWithExceptionDescrRef(_DoneWithThisFrameDescr):
     def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
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
@@ -2543,7 +2543,13 @@
             elif box.type == history.REF: args.append(box.getref_base())
             elif box.type == history.FLOAT: args.append(box.getfloatstorage())
             else: assert 0
-        self.jitdriver_sd.warmstate.execute_assembler(loop_token, *args)
+        res = self.jitdriver_sd.warmstate.execute_assembler(loop_token, *args)
+        kind = getkind(lltype.typeOf(res))
+        if kind == history.VOID:  raise DoneWithThisFrameVoid()
+        if kind == history.INT:   raise DoneWithThisFrameInt(res)
+        if kind == history.REF:   raise DoneWithThisFrameRef(self.cpu, res)
+        if kind == history.FLOAT: raise DoneWithThisFrameFloat(res)
+        raise AssertionError(kind)
 
     def prepare_resume_from_failure(self, deadframe, inputargs, resumedescr):
         exception = self.cpu.grab_exc_value(deadframe)
diff --git a/rpython/jit/metainterp/warmspot.py 
b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -893,6 +893,7 @@
         rtyper = self.translator.rtyper
         RESULT = PORTALFUNC.RESULT
         result_kind = history.getkind(RESULT)
+        assert result_kind.startswith(jd.result_type)
         ts = self.cpu.ts
         state = jd.warmstate
         maybe_compile_and_run = jd._maybe_compile_and_run_fn
@@ -921,10 +922,9 @@
                     except EnterJitAssembler as e:
                         while True:
                             try:
-                                e.execute()
+                                return e.execute()
                             except EnterJitAssembler as e:
                                 continue
-                            assert 0  # execute() should always raise for now
                 except jitexc.ContinueRunningNormally as e:
                     args = ()
                     for ARGTYPE, attrname, count in portalfunc_ARGS:
diff --git a/rpython/jit/metainterp/warmstate.py 
b/rpython/jit/metainterp/warmstate.py
--- a/rpython/jit/metainterp/warmstate.py
+++ b/rpython/jit/metainterp/warmstate.py
@@ -379,6 +379,18 @@
         cpu = self.cpu
         jitcounter = self.warmrunnerdesc.jitcounter
 
+        result_type = jitdriver_sd.result_type
+        if result_type == history.VOID:
+            _DoneWithThisFrameCls = jitexc.DoneWithThisFrameVoid
+        elif result_type == history.INT:
+            _DoneWithThisFrameCls = jitexc.DoneWithThisFrameInt
+        elif result_type == history.REF:
+            _DoneWithThisFrameCls = jitexc.DoneWithThisFrameRef
+        elif result_type == history.FLOAT:
+            _DoneWithThisFrameCls = jitexc.DoneWithThisFrameFloat
+        else:
+            raise AssertionError(result_type)
+
         def execute_assembler(loop_token, *args):
             # Call the backend to run the 'looptoken' with the given
             # input args.
@@ -398,9 +410,13 @@
             #
             # Handle the failure
             fail_descr = cpu.get_latest_descr(deadframe)
-            fail_descr.handle_fail(deadframe, metainterp_sd, jitdriver_sd)
-            #
-            assert 0, "should have raised"
+            if isinstance(fail_descr, _DoneWithThisFrameCls):
+                # A fast path to avoid raising and immediately catching
+                # a DoneWithThisFrame exception
+                return fail_descr.get_result(cpu, deadframe)
+            else:
+                fail_descr.handle_fail(deadframe, metainterp_sd, jitdriver_sd)
+                assert 0, "should have raised"
 
         def bound_reached(hash, cell, *args):
             if not confirm_enter_jit(*args):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to