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