[pypy-commit] pypy better-jit-hooks: work in progress on improving the JITted ops representation

fijal noreply at buildbot.pypy.org
Fri Jan 6 09:57:04 CET 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: better-jit-hooks
Changeset: r51052:b7cde06c0fc6
Date: 2012-01-06 10:56 +0200
http://bitbucket.org/pypy/pypy/changeset/b7cde06c0fc6/

Log:	work in progress on improving the JITted ops representation

diff --git a/pypy/module/pypyjit/__init__.py b/pypy/module/pypyjit/__init__.py
--- a/pypy/module/pypyjit/__init__.py
+++ b/pypy/module/pypyjit/__init__.py
@@ -9,7 +9,7 @@
         'residual_call': 'interp_jit.residual_call',
         'set_compile_hook': 'interp_resop.set_compile_hook',
         'set_abort_hook': 'interp_resop.set_abort_hook',
-        'DebugMergePoint': 'interp_resop.W_DebugMergePoint',
+        'ResOperation': 'interp_resop.WrappedOp',
     }
 
     def setup_after_space_initialization(self):
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
@@ -77,44 +77,21 @@
     return space.w_None
 
 def wrap_oplist(space, logops, operations, ops_offset):
-    list_w = []
-    for op in operations:
-        if op.getopnum() == rop.DEBUG_MERGE_POINT:
-            list_w.append(space.wrap(debug_merge_point_from_boxes(
-                op.getarglist())))
-        else:
-            list_w.append(space.wrap(logops.repr_of_resop(op)))
-    return list_w
+    return [WrappedOp(op, ops_offset, logops) for op in operations]
 
-class W_DebugMergePoint(Wrappable):
-    """ A class representing debug_merge_point JIT operation
+class WrappedOp(Wrappable):
+    """ A class representing a single ResOperation, wrapped nicely
     """
-
-    def __init__(self, mp_no, offset, pycode):
-        self.mp_no = mp_no
-        self.offset = offset
-        self.pycode = pycode
+    def __init__(self, op, ops_offset, logops):
+        self.op = op
+        self.offset = ops_offset[op]
+        self.logops = logops # for __repr__
 
     def descr_repr(self, space):
-        return space.wrap('DebugMergePoint()')
+        return space.wrap(self.logops.repr_of_resop(self.op))
 
- at unwrap_spec(mp_no=int, offset=int, pycode=PyCode)
-def new_debug_merge_point(space, w_tp, mp_no, offset, pycode):
-    return W_DebugMergePoint(mp_no, offset, pycode)
-
-def debug_merge_point_from_boxes(boxes):
-    mp_no = boxes[0].getint()
-    offset = boxes[2].getint()
-    llcode = lltype.cast_opaque_ptr(lltype.Ptr(OBJECT),
-                                    boxes[4].getref_base())
-    pycode = cast_base_ptr_to_instance(PyCode, llcode)
-    assert pycode is not None
-    return W_DebugMergePoint(mp_no, offset, pycode)
-
-W_DebugMergePoint.typedef = TypeDef(
-    'DebugMergePoint',
-    __new__ = interp2app(new_debug_merge_point),
-    __doc__ = W_DebugMergePoint.__doc__,
-    __repr__ = interp2app(W_DebugMergePoint.descr_repr),
-    code = interp_attrproperty('pycode', W_DebugMergePoint),
+WrappedOp.typedef = TypeDef(
+    'ResOperation',
+    __doc__ = WrappedOp.__doc__,
+    __repr__ = interp2app(WrappedOp.descr_repr),
 )
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
@@ -26,9 +26,9 @@
         space = gettestobjspace(usemodules=('pypyjit',))
         cls.space = space
         w_f = space.appexec([], """():
-        def f():
+        def function():
             pass
-        return f
+        return function
         """)
         cls.w_f = w_f
         ll_code = cast_instance_to_base_ptr(w_f.code)
@@ -42,15 +42,19 @@
         guard_true(i3) []
         """, namespace={'ptr0': code_gcref}).operations
         greenkey = [ConstInt(0), ConstInt(0), ConstPtr(code_gcref)]
+        offset = {}
+        for i, op in enumerate(oplist):
+            offset[op] = i
 
         def interp_on_compile():
             pypy_portal.on_compile(pypyjitdriver, logger, JitCellToken(),
-                                   oplist, 'loop', greenkey, {}, 0, 0)
+                                   oplist, 'loop', greenkey, offset,
+                                   0, 0)
 
         def interp_on_compile_bridge():
             pypy_portal.on_compile_bridge(pypyjitdriver, logger,
-                                            JitCellToken(), oplist, 0,
-                                            {}, 0, 0)
+                                          JitCellToken(), oplist, 0,
+                                          offset, 0, 0)
 
         def interp_on_abort():
             pypy_portal.on_abort(ABORT_TOO_LONG, pypyjitdriver, greenkey)
@@ -73,7 +77,7 @@
         assert len(all) == 1
         elem = all[0]
         assert elem[0] == 'pypyjit'
-        assert elem[2][0].co_name == 'f'
+        assert elem[2][0].co_name == 'function'
         assert elem[2][1] == 0
         assert elem[2][2] == False
         assert len(elem[3]) == 3
@@ -125,14 +129,9 @@
 
         pypyjit.set_compile_hook(hook)
         self.on_compile()
-        dmp = l[0][3][1]
-        assert isinstance(dmp, pypyjit.DebugMergePoint)
-        assert dmp.code is self.f.func_code
-
-    def test_creation(self):
-        import pypyjit
-        dmp = pypyjit.DebugMergePoint(0, 0, self.f.func_code)
-        assert dmp.code is self.f.func_code 
+        op = l[0][3][1]
+        assert isinstance(op, pypyjit.ResOperation)
+        assert 'function' in repr(op)
 
     def test_on_abort(self):
         import pypyjit


More information about the pypy-commit mailing list