[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