Author: Maciej Fijalkowski <[email protected]>
Branch: better-jit-hooks-2
Changeset: r51422:1ef43f689d9b
Date: 2012-01-17 22:45 +0200
http://bitbucket.org/pypy/pypy/changeset/1ef43f689d9b/
Log: implement jithooks
diff --git a/pypy/module/pypyjit/interp_resop.py
b/pypy/module/pypyjit/interp_resop.py
--- a/pypy/module/pypyjit/interp_resop.py
+++ b/pypy/module/pypyjit/interp_resop.py
@@ -11,6 +11,7 @@
from pypy.jit.metainterp.resoperation import rop, AbstractResOp
from pypy.rlib.nonconst import NonConstant
from pypy.rlib import jit_hooks
+from pypy.module.pypyjit.interp_jit import pypyjitdriver
class Cache(object):
in_recursion = False
@@ -112,13 +113,24 @@
def wrap_oplist(space, logops, operations, ops_offset=None):
l_w = []
+ jitdrivers_sd = logops.metainterp_sd.jitdrivers_sd
for op in operations:
if ops_offset is None:
ofs = -1
else:
ofs = ops_offset.get(op, 0)
- l_w.append(WrappedOp(jit_hooks._cast_to_gcref(op), ofs,
- logops.repr_of_resop(op)))
+ if op.opnum == rop.DEBUG_MERGE_POINT:
+ jd_sd = jitdrivers_sd[op.getarg(0).getint()]
+ greenkey = op.getarglist()[2:]
+ repr = jd_sd.warmstate.get_location_str(greenkey)
+ w_descr = wrap_greenkey(space, jd_sd.jitdriver, greenkey, repr)
+ l_w.append(DebugMergePoint(space, jit_hooks._cast_to_gcref(op),
+ logops.repr_of_resop(op),
+ jd_sd.jitdriver.name,
+ w_descr))
+ else:
+ l_w.append(WrappedOp(jit_hooks._cast_to_gcref(op), ofs,
+ logops.repr_of_resop(op)))
return l_w
class WrappedBox(Wrappable):
@@ -151,13 +163,14 @@
llres = res.llbox
return WrappedOp(jit_hooks.resop_new(num, args, llres), offset, repr)
-@unwrap_spec(repr=str, pycode=PyCode, bytecode_no=int)
-def descr_new_dmp(space, w_tp, w_args, repr, pycode, bytecode_no):
+@unwrap_spec(repr=str, jd_name=str)
+def descr_new_dmp(space, w_tp, w_args, repr, jd_name, w_descr):
args = [space.interp_w(WrappedBox, w_arg).llbox for w_arg in
space.listview(w_args)]
num = rop.DEBUG_MERGE_POINT
- return DebugMergePoint(jit_hooks.resop_new(num, args,
jit_hooks.emptyval()),
- repr, pycode, bytecode_no)
+ return DebugMergePoint(space,
+ jit_hooks.resop_new(num, args,
jit_hooks.emptyval()),
+ repr, jd_name, w_descr)
class WrappedOp(Wrappable):
""" A class representing a single ResOperation, wrapped nicely
@@ -192,15 +205,26 @@
jit_hooks.resop_setresult(self.op, box.llbox)
class DebugMergePoint(WrappedOp):
- def __init__(self, op, repr_of_resop, pycode, bytecode_no):
+ def __init__(self, space, op, repr_of_resop, jd_name, w_descr):
WrappedOp.__init__(self, op, -1, repr_of_resop)
- self.pycode = pycode
- self.bytecode_no = bytecode_no
+ self.w_descr = w_descr
+ self.jd_name = jd_name
+
+ def get_descr(self, space):
+ return self.w_descr
+
+ def get_pycode(self, space):
+ if self.jd_name == pypyjitdriver.name:
+ return space.getitem(self.w_descr, space.wrap(0))
+ raise OperationError(space.w_AttributeError,
space.wrap('DebugMergePoint is not the main jitdriver DMP'))
def get_bytecode_no(self, space):
- if self.pycode is None:
- return space.w_None
- return space.wrap(self.bytecode_no)
+ if self.jd_name == pypyjitdriver.name:
+ return space.getitem(self.w_descr, space.wrap(1))
+ raise OperationError(space.w_AttributeError,
space.wrap('DebugMergePoint is not the main jitdriver DMP'))
+
+ def get_jitdriver(self, space):
+ return space.wrap(self.jd_name)
WrappedOp.typedef = TypeDef(
'ResOperation',
@@ -219,8 +243,10 @@
DebugMergePoint.typedef = TypeDef(
'DebugMergePoint', WrappedOp.typedef,
__new__ = interp2app(descr_new_dmp),
- pycode = interp_attrproperty('pycode', cls=DebugMergePoint),
+ descr = GetSetProperty(DebugMergePoint.get_descr),
+ pycode = GetSetProperty(DebugMergePoint.get_pycode),
bytecode_no = GetSetProperty(DebugMergePoint.get_bytecode_no),
+ jitdriver_name = GetSetProperty(DebugMergePoint.get_jitdriver),
)
DebugMergePoint.acceptable_as_base_class = False
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
@@ -118,6 +118,9 @@
assert elem[2][2] == False
assert len(elem[3]) == 4
int_add = elem[3][0]
+ dmp = elem[3][1]
+ assert isinstance(dmp, pypyjit.DebugMergePoint)
+ assert dmp.pycode is self.f.func_code
#assert int_add.name == 'int_add'
assert int_add.num == self.int_add_num
self.on_compile_bridge()
@@ -219,7 +222,11 @@
def f():
pass
- op = DebugMergePoint([Box(0)], '', f.func_code, 0)
+ op = DebugMergePoint([Box(0)], 'repr', 'pypyjit', (f.func_code, 0, 0))
assert op.bytecode_no == 0
assert op.pycode is f.func_code
+ assert repr(op) == 'repr'
+ assert op.jitdriver_name == 'pypyjit'
assert op.num == self.dmp_num
+ op = DebugMergePoint([Box(0)], 'repr', 'notmain', ('str',))
+ raises(AttributeError, 'op.pycode')
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit