[pypy-commit] pypy better-jit-hooks: expose some more of API
fijal
noreply at buildbot.pypy.org
Sun Jan 8 20:46:52 CET 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: better-jit-hooks
Changeset: r51144:4628182fa0e4
Date: 2012-01-08 21:46 +0200
http://bitbucket.org/pypy/pypy/changeset/4628182fa0e4/
Log: expose some more of API
diff --git a/pypy/jit/metainterp/test/test_jitportal.py b/pypy/jit/metainterp/test/test_jitportal.py
--- a/pypy/jit/metainterp/test/test_jitportal.py
+++ b/pypy/jit/metainterp/test/test_jitportal.py
@@ -144,5 +144,12 @@
assert jit_hooks.box_isconst(box3)
box4 = jit_hooks.box_nonconstbox(box)
assert not jit_hooks.box_isconst(box4)
+ box5 = jit_hooks.boxint_new(18)
+ jit_hooks.resop_setarg(op, 0, box5)
+ assert jit_hooks.resop_getarg(op, 0) == box5
+ box6 = jit_hooks.resop_getresult(op)
+ assert jit_hooks.box_getint(box6) == 1
+ jit_hooks.resop_setresult(op, box5)
+ assert jit_hooks.resop_getresult(op) == box5
self.meta_interp(main, [])
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
@@ -113,13 +113,34 @@
ops_offset.get(op, 0),
logops.repr_of_resop(op)) for op in operations]
- at unwrap_spec(num=int, offset=int, repr=str)
-def descr_new_resop(space, w_tp, num, w_args, w_res=None, offset=-1,
+class WrappedBox(Wrappable):
+ """ A class representing a single box
+ """
+ def __init__(self, llbox):
+ self.llbox = llbox
+
+ def descr_getint(self, space):
+ return space.wrap(jit_hooks.box_getint(self.llbox))
+
+ at unwrap_spec(no=int)
+def descr_new_box(space, w_tp, no):
+ return WrappedBox(jit_hooks.boxint_new(no))
+
+WrappedBox.typedef = TypeDef(
+ 'Box',
+ __new__ = interp2app(descr_new_box),
+ getint = interp2app(WrappedBox.descr_getint),
+)
+
+ at unwrap_spec(num=int, offset=int, repr=str, res=WrappedBox)
+def descr_new_resop(space, w_tp, num, w_args, res, offset=-1,
repr=''):
args = [space.interp_w(WrappedBox, w_arg).llbox for w_arg in
space.listview(w_args)]
- llres = space.interp_w(WrappedBox, w_res).llbox
- # XXX None case
+ if res is None:
+ llres = jit_hooks.emptyval()
+ else:
+ llres = res.llbox
return WrappedOp(jit_hooks.resop_new(num, args, llres), offset, repr)
class WrappedOp(Wrappable):
@@ -143,6 +164,19 @@
def descr_getarg(self, space, no):
return WrappedBox(jit_hooks.resop_getarg(self.op, no))
+ @unwrap_spec(no=int, box=WrappedBox)
+ def descr_setarg(self, space, no, box):
+ jit_hooks.resop_setarg(self.op, no, box.llbox)
+ return space.w_None
+
+ def descr_getresult(self, space):
+ return WrappedBox(jit_hooks.resop_getresult(self.op))
+
+ @unwrap_spec(box=WrappedBox)
+ def descr_setresult(self, space, box):
+ jit_hooks.resop_setresult(self.op, box.llbox)
+ return space.w_None
+
WrappedOp.typedef = TypeDef(
'ResOperation',
__doc__ = WrappedOp.__doc__,
@@ -151,24 +185,8 @@
num = GetSetProperty(WrappedOp.descr_num),
name = GetSetProperty(WrappedOp.descr_name),
getarg = interp2app(WrappedOp.descr_getarg),
+ setarg = interp2app(WrappedOp.descr_setarg),
+ result = GetSetProperty(WrappedOp.descr_getresult,
+ WrappedOp.descr_setresult)
)
WrappedOp.acceptable_as_base_class = False
-
-class WrappedBox(Wrappable):
- """ A class representing a single box
- """
- def __init__(self, llbox):
- self.llbox = llbox
-
- def descr_getint(self, space):
- return space.wrap(jit_hooks.box_getint(self.llbox))
-
- at unwrap_spec(no=int)
-def descr_new_box(space, w_tp, no):
- return WrappedBox(jit_hooks.boxint_new(no))
-
-WrappedBox.typedef = TypeDef(
- 'Box',
- __new__ = interp2app(descr_new_box),
- getint = interp2app(WrappedBox.descr_getint),
-)
diff --git a/pypy/module/pypyjit/policy.py b/pypy/module/pypyjit/policy.py
--- a/pypy/module/pypyjit/policy.py
+++ b/pypy/module/pypyjit/policy.py
@@ -88,9 +88,11 @@
for w_item in space.listview(w_res):
item = space.interp_w(WrappedOp, w_item)
l.append(jit_hooks._cast_to_resop(item.op))
- operations[:] = l # modifying operations above is probably not
+ del operations[:] # modifying operations above is probably not
# a great idea since types may not work and we'll end up with
# half-working list and a segfault/fatal RPython error
+ for elem in l:
+ operations.append(elem)
except OperationError, e:
e.write_unraisable(space, "jit hook ", cache.w_compile_hook)
cache.in_recursion = 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
@@ -193,3 +193,9 @@
assert op.name == 'int_add'
box = op.getarg(0)
assert box.getint() == 1
+ box2 = op.result
+ assert box2.getint() == 4
+ op.setarg(0, box2)
+ assert op.getarg(0).getint() == 4
+ op.result = box
+ assert op.result.getint() == 1
diff --git a/pypy/rlib/jit_hooks.py b/pypy/rlib/jit_hooks.py
--- a/pypy/rlib/jit_hooks.py
+++ b/pypy/rlib/jit_hooks.py
@@ -44,6 +44,9 @@
return lltype.cast_opaque_ptr(llmemory.GCREF,
cast_instance_to_base_ptr(obj))
+def emptyval():
+ return lltype.nullptr(llmemory.GCREF.TO)
+
@register_helper(annmodel.SomePtr(llmemory.GCREF))
def resop_new(no, llargs, llres):
from pypy.jit.metainterp.history import ResOperation
@@ -69,6 +72,18 @@
def resop_getarg(llop, no):
return _cast_to_gcref(_cast_to_resop(llop).getarg(no))
+ at register_helper(annmodel.s_None)
+def resop_setarg(llop, no, llbox):
+ _cast_to_resop(llop).setarg(no, _cast_to_box(llbox))
+
+ at register_helper(annmodel.SomePtr(llmemory.GCREF))
+def resop_getresult(llop):
+ return _cast_to_gcref(_cast_to_resop(llop).result)
+
+ at register_helper(annmodel.s_None)
+def resop_setresult(llop, llbox):
+ _cast_to_resop(llop).result = _cast_to_box(llbox)
+
@register_helper(annmodel.SomeInteger())
def box_getint(llbox):
return _cast_to_box(llbox).getint()
More information about the pypy-commit
mailing list