[pypy-commit] pypy default: issue2470
arigo
pypy.commits at gmail.com
Thu Jan 19 03:56:21 EST 2017
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r89669:5390a8769eb3
Date: 2017-01-19 09:50 +0100
http://bitbucket.org/pypy/pypy/changeset/5390a8769eb3/
Log: issue2470
Remove FrontendTagOverflow and raise directly SwitchToBlackhole
(there are a few obscure paths where the convertion would not
occur).
Catch such SwitchToBlackhole more widely to avoid other obscure
paths where it could escape the JIT.
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -726,15 +726,7 @@
op.setref_base(value)
def _record_op(self, opnum, argboxes, descr=None):
- from rpython.jit.metainterp.opencoder import FrontendTagOverflow
-
- try:
- return self.trace.record_op(opnum, argboxes, descr)
- except FrontendTagOverflow:
- # note that with the default settings this one should not
- # happen - however if we hit that case, we don't get
- # anything disabled
- raise SwitchToBlackhole(Counters.ABORT_TOO_LONG)
+ return self.trace.record_op(opnum, argboxes, descr)
@specialize.argtype(3)
def record(self, opnum, argboxes, value, descr=None):
diff --git a/rpython/jit/metainterp/opencoder.py b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -49,8 +49,12 @@
way up to lltype.Signed for indexes everywhere
"""
-class FrontendTagOverflow(Exception):
- pass
+def frontend_tag_overflow():
+ # Minor abstraction leak: raise directly the right exception
+ # expected by the rest of the machinery
+ from rpython.jit.metainterp import history
+ from rpython.rlib.jit import Counters
+ raise history.SwitchToBlackhole(Counters.ABORT_TOO_LONG)
class BaseTrace(object):
pass
@@ -296,7 +300,7 @@
# grow by 2X
self._ops = self._ops + [rffi.cast(model.STORAGE_TP, 0)] * len(self._ops)
if not model.MIN_VALUE <= v <= model.MAX_VALUE:
- raise FrontendTagOverflow
+ raise frontend_tag_overflow()
self._ops[self._pos] = rffi.cast(model.STORAGE_TP, v)
self._pos += 1
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
@@ -2424,7 +2424,6 @@
self.staticdata.profiler.start_tracing()
assert jitdriver_sd is self.jitdriver_sd
self.staticdata.try_to_free_some_loops()
- self.create_empty_history()
try:
original_boxes = self.initialize_original_boxes(jitdriver_sd, *args)
return self._compile_and_run_once(original_boxes)
@@ -2438,10 +2437,11 @@
num_green_args = self.jitdriver_sd.num_green_args
original_greenkey = original_boxes[:num_green_args]
self.resumekey = compile.ResumeFromInterpDescr(original_greenkey)
- self.history.set_inputargs(original_boxes[num_green_args:],
- self.staticdata)
self.seen_loop_header_for_jdindex = -1
try:
+ self.create_empty_history()
+ self.history.set_inputargs(original_boxes[num_green_args:],
+ self.staticdata)
self.interpret()
except SwitchToBlackhole as stb:
self.run_blackhole_interp_to_cancel_tracing(stb)
@@ -2461,9 +2461,11 @@
if self.resumekey_original_loop_token is None:
raise compile.giveup() # should be rare
self.staticdata.try_to_free_some_loops()
- inputargs = self.initialize_state_from_guard_failure(key, deadframe)
try:
+ inputargs = self.initialize_state_from_guard_failure(key, deadframe)
return self._handle_guard_failure(resumedescr, key, inputargs, deadframe)
+ except SwitchToBlackhole as stb:
+ self.run_blackhole_interp_to_cancel_tracing(stb)
finally:
self.resumekey_original_loop_token = None
self.staticdata.profiler.end_tracing()
@@ -2475,13 +2477,10 @@
self.seen_loop_header_for_jdindex = -1
if isinstance(key, compile.ResumeAtPositionDescr):
self.seen_loop_header_for_jdindex = self.jitdriver_sd.index
- try:
- self.prepare_resume_from_failure(deadframe, inputargs, resumedescr)
- if self.resumekey_original_loop_token is None: # very rare case
- raise SwitchToBlackhole(Counters.ABORT_BRIDGE)
- self.interpret()
- except SwitchToBlackhole as stb:
- self.run_blackhole_interp_to_cancel_tracing(stb)
+ self.prepare_resume_from_failure(deadframe, inputargs, resumedescr)
+ if self.resumekey_original_loop_token is None: # very rare case
+ raise SwitchToBlackhole(Counters.ABORT_BRIDGE)
+ self.interpret()
assert False, "should always raise"
def run_blackhole_interp_to_cancel_tracing(self, stb):
diff --git a/rpython/jit/metainterp/test/test_opencoder.py b/rpython/jit/metainterp/test/test_opencoder.py
--- a/rpython/jit/metainterp/test/test_opencoder.py
+++ b/rpython/jit/metainterp/test/test_opencoder.py
@@ -1,6 +1,5 @@
import py
from rpython.jit.metainterp.opencoder import Trace, untag, TAGINT, TAGBOX
-from rpython.jit.metainterp.opencoder import FrontendTagOverflow
from rpython.jit.metainterp.resoperation import rop, AbstractResOp
from rpython.jit.metainterp.history import ConstInt, IntFrontendOp
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
@@ -8,6 +7,7 @@
from rpython.jit.metainterp.test.strategies import lists_of_operations
from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest
from rpython.jit.metainterp.history import TreeLoop, AbstractDescr
+from rpython.jit.metainterp.history import SwitchToBlackhole
from hypothesis import given, strategies
class JitCode(object):
@@ -209,5 +209,5 @@
def test_tag_overflow(self):
t = Trace([], metainterp_sd)
i0 = FakeOp(100000)
- py.test.raises(FrontendTagOverflow, t.record_op, rop.FINISH, [i0])
+ py.test.raises(SwitchToBlackhole, t.record_op, rop.FINISH, [i0])
assert t.unpack() == ([], [])
More information about the pypy-commit
mailing list