Author: Maciej Fijalkowski <[email protected]>
Branch: jit-applevel-hook
Changeset: r44398:0b8de5f20516
Date: 2011-05-24 11:46 +0200
http://bitbucket.org/pypy/pypy/changeset/0b8de5f20516/
Log: fix test and improve hooks
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -154,7 +154,7 @@
old_loop_tokens.append(loop_token)
def send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, type):
- jitdriver_sd.on_compile(loop, type, greenkey)
+ jitdriver_sd.on_compile(loop.token, loop.operations, type, greenkey)
globaldata = metainterp_sd.globaldata
loop_token = loop.token
loop_token.number = n = globaldata.loopnumbering
@@ -192,6 +192,8 @@
def send_bridge_to_backend(jitdriver_sd, metainterp_sd, faildescr, inputargs,
operations, original_loop_token):
+ n = metainterp_sd.cpu.get_fail_descr_number(faildescr)
+ jitdriver_sd.on_compile_bridge(original_loop_token, operations, n)
if not we_are_translated():
show_loop(metainterp_sd)
TreeLoop.check_consistency_of(inputargs, operations)
@@ -208,7 +210,6 @@
metainterp_sd.stats.compiled()
metainterp_sd.log("compiled new bridge")
#
- n = metainterp_sd.cpu.get_fail_descr_number(faildescr)
metainterp_sd.logger_ops.log_bridge(inputargs, operations, n, ops_offset)
#
if metainterp_sd.warmrunnerdesc is not None: # for tests
diff --git a/pypy/jit/metainterp/test/test_jitdriver.py
b/pypy/jit/metainterp/test/test_jitdriver.py
--- a/pypy/jit/metainterp/test/test_jitdriver.py
+++ b/pypy/jit/metainterp/test/test_jitdriver.py
@@ -15,8 +15,8 @@
called = {}
class MyJitDriver(JitDriver):
- def on_compile(self, loop, type, n, m):
- called[(m, n, type)] = loop
+ def on_compile(self, looptoken, operations, type, n, m):
+ called[(m, n, type)] = looptoken
driver = MyJitDriver(greens = ['n', 'm'], reds = ['i'])
@@ -37,8 +37,11 @@
called = {}
class MyJitDriver(JitDriver):
- def on_compile(self, loop, type, n, m):
+ def on_compile(self, looptoken, operations, type, n, m):
called[(m, n, type)] = loop
+ def on_compile_bridge(self, orig_token, operations, n):
+ assert 'bridge' not in called
+ called['bridge'] = orig_token
driver = MyJitDriver(greens = ['n', 'm'], reds = ['i'])
@@ -47,12 +50,13 @@
while i < n + m:
driver.can_enter_jit(n=n, m=m, i=i)
driver.jit_merge_point(n=n, m=m, i=i)
- if i == 5:
+ if i >= 4:
i += 2
i += 1
- self.meta_interp(loop, [1, 4])
- assert sorted(called.keys()) == [(4, 1, "entry bridge"), (4, 1,
"loop")]
+ self.meta_interp(loop, [1, 10])
+ assert sorted(called.keys()) == ['bridge', (10, 1, "entry bridge"),
+ (10, 1, "loop")]
class TestLLtypeSingle(JitDriverTests, LLJitMixin):
diff --git a/pypy/jit/metainterp/warmstate.py b/pypy/jit/metainterp/warmstate.py
--- a/pypy/jit/metainterp/warmstate.py
+++ b/pypy/jit/metainterp/warmstate.py
@@ -566,10 +566,13 @@
return can_inline_greenargs(*greenargs)
self.can_inline_greenargs = can_inline_greenargs
self.can_inline_callable = can_inline_callable
- def on_compile(loop, type, greenkey):
+ def on_compile(token, operations, type, greenkey):
greenargs = unwrap_greenkey(greenkey)
- return jd.jitdriver.on_compile(loop, type, *greenargs)
+ return jd.jitdriver.on_compile(token, operations, type, *greenargs)
+ def on_compile_bridge(orig_token, operations, n):
+ return jd.jitdriver.on_compile_bridge(orig_token, operations, n)
jd.on_compile = on_compile
+ jd.on_compile_bridge = on_compile_bridge
def get_assembler_token(greenkey, redboxes):
# 'redboxes' is only used to know the types of red arguments
diff --git a/pypy/rlib/jit.py b/pypy/rlib/jit.py
--- a/pypy/rlib/jit.py
+++ b/pypy/rlib/jit.py
@@ -342,12 +342,17 @@
raise
set_user_param._annspecialcase_ = 'specialize:arg(0)'
- def on_compile(self, loop, type, *args):
- """ A hook called when loop or bridge is compiled. Overwrite
+ def on_compile(self, looptoken, operations, type, *greenargs):
+ """ A hook called when loop is compiled. Overwrite
for your own jitdriver if you want to do something special, like
call applevel code
"""
+ def on_compile_bridge(self, orig_looptoken, operations, n):
+ """ A hook called when a bridge is compiled. Overwrite
+ for your own jitdriver if you want to do something special
+ """
+
def _make_extregistryentries(self):
# workaround: we cannot declare ExtRegistryEntries for functions
# used as methods of a frozen object, but we can attach the
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit