[pypy-commit] pypy jit-hooks-can-be-disabled: add a hook that makes it possible to disable all other hooks.

cfbolz pypy.commits at gmail.com
Wed Mar 28 08:03:44 EDT 2018


Author: Carl Friedrich Bolz-Tereick <cfbolz at gmx.de>
Branch: jit-hooks-can-be-disabled
Changeset: r94161:df360c36c909
Date: 2018-03-28 13:28 +0200
http://bitbucket.org/pypy/pypy/changeset/df360c36c909/

Log:	add a hook that makes it possible to disable all other hooks.

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
@@ -545,15 +545,15 @@
         show_procedures(metainterp_sd, loop)
         loop.check_consistency()
 
+    debug_info = None
+    hooks = None
     if metainterp_sd.warmrunnerdesc is not None:
         hooks = metainterp_sd.warmrunnerdesc.hooks
-        debug_info = JitDebugInfo(jitdriver_sd, metainterp_sd.logger_ops,
-                                  original_jitcell_token, loop.operations,
-                                  type, greenkey)
-        hooks.before_compile(debug_info)
-    else:
-        debug_info = None
-        hooks = None
+        if hooks.are_hooks_enabled():
+            debug_info = JitDebugInfo(jitdriver_sd, metainterp_sd.logger_ops,
+                                      original_jitcell_token, loop.operations,
+                                      type, greenkey)
+            hooks.before_compile(debug_info)
     operations = get_deep_immutable_oplist(loop.operations)
     metainterp_sd.profiler.start_backend()
     debug_start("jit-backend")
@@ -597,15 +597,15 @@
         show_procedures(metainterp_sd)
         seen = dict.fromkeys(inputargs)
         TreeLoop.check_consistency_of_branch(operations, seen)
+    debug_info = None
+    hooks = None
     if metainterp_sd.warmrunnerdesc is not None:
         hooks = metainterp_sd.warmrunnerdesc.hooks
-        debug_info = JitDebugInfo(jitdriver_sd, metainterp_sd.logger_ops,
-                                  original_loop_token, operations, 'bridge',
-                                  fail_descr=faildescr)
-        hooks.before_compile_bridge(debug_info)
-    else:
-        hooks = None
-        debug_info = None
+        if hooks.are_hooks_enabled():
+            debug_info = JitDebugInfo(jitdriver_sd, metainterp_sd.logger_ops,
+                                      original_loop_token, operations, 'bridge',
+                                      fail_descr=faildescr)
+            hooks.before_compile_bridge(debug_info)
     operations = get_deep_immutable_oplist(operations)
     metainterp_sd.profiler.start_backend()
     debug_start("jit-backend")
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
@@ -2365,7 +2365,9 @@
             greenkey = None # we're in the bridge
         else:
             greenkey = self.current_merge_points[0][0][:jd_sd.num_green_args]
-            self.staticdata.warmrunnerdesc.hooks.on_abort(reason,
+            hooks = self.staticdata.warmrunnerdesc.hooks
+            if hooks.are_hooks_enabled():
+                hooks.on_abort(reason,
                     jd_sd.jitdriver, greenkey,
                     jd_sd.warmstate.get_location_str(greenkey),
                     self.staticdata.logger_ops._make_log_operations(
@@ -2374,9 +2376,10 @@
             if self.aborted_tracing_jitdriver is not None:
                 jd_sd = self.aborted_tracing_jitdriver
                 greenkey = self.aborted_tracing_greenkey
-                self.staticdata.warmrunnerdesc.hooks.on_trace_too_long(
-                    jd_sd.jitdriver, greenkey,
-                    jd_sd.warmstate.get_location_str(greenkey))
+                if hooks.are_hooks_enabled():
+                    hooks.on_trace_too_long(
+                        jd_sd.jitdriver, greenkey,
+                        jd_sd.warmstate.get_location_str(greenkey))
                 # no ops for now
                 self.aborted_tracing_jitdriver = None
                 self.aborted_tracing_greenkey = None
diff --git a/rpython/jit/metainterp/test/test_jitiface.py b/rpython/jit/metainterp/test/test_jitiface.py
--- a/rpython/jit/metainterp/test/test_jitiface.py
+++ b/rpython/jit/metainterp/test/test_jitiface.py
@@ -238,7 +238,7 @@
 
         hashes = Hashes()
 
-        class Hooks(object):
+        class Hooks(JitHookInterface):
             def before_compile(self, debug_info):
                 pass
 
@@ -279,6 +279,44 @@
         self.meta_interp(main, [1, 1], policy=JitPolicy(hooks))
         assert len(hashes.t) == 1
 
+
+    def test_are_hooks_enabled(self):
+        reasons = []
+
+        class MyJitIface(JitHookInterface):
+            def are_hooks_enabled(self):
+                return False
+
+            def on_abort(self, reason, jitdriver, greenkey, greenkey_repr, logops, ops):
+                reasons.append(reason)
+
+        iface = MyJitIface()
+
+        myjitdriver = JitDriver(greens=['foo'], reds=['x', 'total'],
+                                get_printable_location=lambda *args: 'blah')
+
+        class Foo:
+            _immutable_fields_ = ['a?']
+
+            def __init__(self, a):
+                self.a = a
+
+        def f(a, x):
+            foo = Foo(a)
+            total = 0
+            while x > 0:
+                myjitdriver.jit_merge_point(foo=foo, x=x, total=total)
+                total += foo.a
+                foo.a += 1
+                x -= 1
+            return total
+        #
+        assert f(100, 7) == 721
+        res = self.meta_interp(f, [100, 7], policy=JitPolicy(iface))
+        assert res == 721
+        assert reasons == []
+
+
 class LLJitHookInterfaceTests(JitHookInterfaceTests):
     # use this for any backend, instead of the super class
     
@@ -320,7 +358,6 @@
         # this so far does not work because of the way setup_once is done,
         # but fine, it's only about untranslated version anyway
         #self.meta_interp(main, [False], ProfilerClass=Profiler)
-        
 
 class TestJitHookInterface(JitHookInterfaceTests, LLJitMixin):
     pass
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -1094,6 +1094,13 @@
     # of the program!  A line like ``pypy_hooks.foo = ...`` must not
     # appear inside your interpreter's RPython code.
 
+    def are_hooks_enabled(self):
+        """ A hook that is called to check whether the interpreter's hooks are
+        enabled at all. Only if this function returns True, are the other hooks
+        called. Otherwise, nothing happens. This is done because constructing
+        some of the hooks' arguments is expensive, so we'd rather not do it."""
+        return True
+
     def on_abort(self, reason, jitdriver, greenkey, greenkey_repr, logops, operations):
         """ A hook called each time a loop is aborted with jitdriver and
         greenkey where it started, reason is a string why it got aborted


More information about the pypy-commit mailing list