Author: Maciej Fijalkowski <[email protected]>
Branch: jit-applevel-hook
Changeset: r44513:a4862ff67f66
Date: 2011-05-26 14:59 +0200
http://bitbucket.org/pypy/pypy/changeset/a4862ff67f66/
Log: pass logger around and a bit of fun with RPython
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,8 @@
old_loop_tokens.append(loop_token)
def send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, type):
- jitdriver_sd.on_compile(loop.token, loop.operations, type, greenkey)
+ jitdriver_sd.on_compile(metainterp_sd.logger_ops, loop.token,
+ loop.operations, type, greenkey)
globaldata = metainterp_sd.globaldata
loop_token = loop.token
loop_token.number = n = globaldata.loopnumbering
@@ -193,7 +194,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)
+ jitdriver_sd.on_compile_bridge(metainterp_sd.logger_ops,
+ original_loop_token, operations, n)
if not we_are_translated():
show_loop(metainterp_sd)
TreeLoop.check_consistency_of(inputargs, operations)
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,7 +15,7 @@
called = {}
class MyJitDriver(JitDriver):
- def on_compile(self, looptoken, operations, type, n, m):
+ def on_compile(self, logger, looptoken, operations, type, n, m):
called[(m, n, type)] = looptoken
driver = MyJitDriver(greens = ['n', 'm'], reds = ['i'])
@@ -37,9 +37,9 @@
called = {}
class MyJitDriver(JitDriver):
- def on_compile(self, looptoken, operations, type, n, m):
+ def on_compile(self, logger, looptoken, operations, type, n, m):
called[(m, n, type)] = loop
- def on_compile_bridge(self, orig_token, operations, n):
+ def on_compile_bridge(self, logger, orig_token, operations, n):
assert 'bridge' not in called
called['bridge'] = orig_token
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,11 +566,13 @@
return can_inline_greenargs(*greenargs)
self.can_inline_greenargs = can_inline_greenargs
self.can_inline_callable = can_inline_callable
- def on_compile(token, operations, type, greenkey):
+ def on_compile(logger, token, operations, type, greenkey):
greenargs = unwrap_greenkey(greenkey)
- 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)
+ return jd.jitdriver.on_compile(logger, token, operations, type,
+ *greenargs)
+ def on_compile_bridge(logger, orig_token, operations, n):
+ return jd.jitdriver.on_compile_bridge(logger, orig_token,
+ operations, n)
jd.on_compile = on_compile
jd.on_compile_bridge = on_compile_bridge
diff --git a/pypy/module/pypyjit/interp_jit.py
b/pypy/module/pypyjit/interp_jit.py
--- a/pypy/module/pypyjit/interp_jit.py
+++ b/pypy/module/pypyjit/interp_jit.py
@@ -51,7 +51,7 @@
greens = ['next_instr', 'is_being_profiled', 'pycode']
virtualizables = ['frame']
- def on_compile(self, looptoken, operations, type, next_instr,
+ def on_compile(self, logger, looptoken, operations, type, next_instr,
is_being_profiled, ll_pycode):
from pypy.rpython.annlowlevel import cast_base_ptr_to_instance
@@ -61,7 +61,7 @@
pycode = cast_base_ptr_to_instance(PyCode, ll_pycode)
space.call_function(cache.w_compile_hook, pycode)
- def on_compile_bridge(self, orig_looptoken, operations, n):
+ def on_compile_bridge(self, logger, orig_looptoken, operations, n):
pass
pypyjitdriver = PyPyJitDriver(get_printable_location = get_printable_location,
diff --git a/pypy/module/pypyjit/test/test_jit_hook.py
b/pypy/module/pypyjit/test/test_jit_hook.py
--- a/pypy/module/pypyjit/test/test_jit_hook.py
+++ b/pypy/module/pypyjit/test/test_jit_hook.py
@@ -4,9 +4,16 @@
from pypy.interpreter.gateway import interp2app
from pypy.jit.metainterp.history import LoopToken
from pypy.jit.metainterp.resoperation import ResOperation, rop
+from pypy.jit.metainterp.logger import Logger
from pypy.rpython.annlowlevel import (cast_instance_to_base_ptr,
cast_base_ptr_to_instance)
from pypy.module.pypyjit.interp_jit import pypyjitdriver
+from pypy.jit.tool.oparser import parse
+from pypy.jit.metainterp.typesystem import llhelper
+
+class MockSD(object):
+ class cpu:
+ ts = llhelper
class AppTestJitHook(object):
def setup_class(cls):
@@ -18,15 +25,20 @@
return f
""")
ll_code = cast_instance_to_base_ptr(w_f.code)
+ logger = Logger(MockSD())
- oplist = []
+ oplist = parse("""
+ [i1, i2]
+ i3 = int_add(i1, i2)
+ guard_true(i3) []
+ """)
def interp_on_compile():
- pypyjitdriver.on_compile(LoopToken(), oplist, 'loop',
+ pypyjitdriver.on_compile(logger, LoopToken(), oplist, 'loop',
0, False, ll_code)
def interp_on_compile_bridge():
- pypyjitdriver.on_compile_bridge(LoopToken(), oplist, 0)
+ pypyjitdriver.on_compile_bridge(logger, LoopToken(), oplist, 0)
cls.w_on_compile = space.wrap(interp2app(interp_on_compile))
cls.w_on_compile_bridge =
space.wrap(interp2app(interp_on_compile_bridge))
diff --git a/pypy/rlib/jit.py b/pypy/rlib/jit.py
--- a/pypy/rlib/jit.py
+++ b/pypy/rlib/jit.py
@@ -342,17 +342,24 @@
raise
set_user_param._annspecialcase_ = 'specialize:arg(0)'
- def on_compile(self, looptoken, operations, type, *greenargs):
+
+ def on_compile(self, logger, 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):
+ def on_compile_bridge(self, logger, orig_looptoken, operations, n):
""" A hook called when a bridge is compiled. Overwrite
for your own jitdriver if you want to do something special
"""
+ # note: if you overwrite this functions with the above signature it'll
+ # work, but the *greenargs is different for each jitdriver, so we
+ # can't share the same methods
+ del on_compile
+ del on_compile_bridge
+
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