[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