[pypy-commit] pypy resume-refactor: (fijal, antocuni) Start adding resume2.py infrastructure + tests

fijal noreply at buildbot.pypy.org
Wed Aug 28 18:07:01 CEST 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r66404:8b3e2a4c9b4b
Date: 2013-08-28 17:06 +0100
http://bitbucket.org/pypy/pypy/changeset/8b3e2a4c9b4b/

Log:	(fijal, antocuni) Start adding resume2.py infrastructure + tests

diff --git a/rpython/jit/backend/llsupport/resumebuilder.py b/rpython/jit/backend/llsupport/resumebuilder.py
--- a/rpython/jit/backend/llsupport/resumebuilder.py
+++ b/rpython/jit/backend/llsupport/resumebuilder.py
@@ -59,3 +59,4 @@
     if name.startswith('process_'):
         num = getattr(rop, name[len('process_'):].upper())
         oplist[num] = value
+
diff --git a/rpython/jit/metainterp/resume2.py b/rpython/jit/metainterp/resume2.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/resume2.py
@@ -0,0 +1,56 @@
+
+from rpython.jit.metainterp.resoperation import rop
+from rpython.jit.metainterp.history import BoxInt
+from rpython.jit.codewriter.jitcode import JitCode
+
+class AbstractResumeReader(object):
+    def __init__(self, metainterp, deadframe):
+        self.metainterp = metainterp
+        self.deadframe = deadframe
+
+    def rebuild(self, faildescr):
+        bytecode = faildescr.rd_loop.rd_bytecode
+        pos = faildescr.rd_bytecode_position
+        self.interpret_until(bytecode, pos)
+
+    def interpret_until(self, bytecode, until):
+        pos = 0
+        while pos < until:
+            op = bytecode[pos]
+            if op.getopnum() == rop.ENTER_FRAME:
+                descr = op.getdescr()
+                assert isinstance(descr, JitCode)
+                self.enter_frame(op.getarg(0).getint(), descr)
+            elif op.getopnum() == rop.LEAVE_FRAME:
+                xxx
+            elif op.getopnum() == rop.RESUME_PUT:
+                self.put(op.getarg(0).getint(), op.getarg(1).getint(),
+                         op.getarg(2).getint())
+            else:
+                xxx
+            pos += 1
+
+class DirectResumeReader(AbstractResumeReader):
+    pass
+
+class BoxResumeReader(AbstractResumeReader):
+    def enter_frame(self, pc, jitcode):
+        if pc != -1:
+            self.metainterp.framestack[-1].pc = pc
+        self.metainterp.newframe(jitcode)
+
+    def put(self, jitframe_index, depth, frontend_position):
+        jitcode = self.metainterp.framestack[-1].jitcode
+        cpu = self.metainterp.cpu
+        frame = self.metainterp.framestack[- depth - 1]
+        if frontend_position < jitcode.num_regs_i():
+            box = BoxInt(cpu.get_int_value(self.deadframe, jitframe_index))
+            frame.registers_i[frontend_position] = box
+        elif frontend_position < (jitcode.num_regs_r() + jitcode.num_regs_i()):
+            xxx
+        else:
+            assert frontend_position < jitcode.num_regs()
+            xxx
+
+def rebuild_from_resumedata(metainterp, deadframe, faildescr):
+    BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
diff --git a/rpython/jit/metainterp/test/test_resume2.py b/rpython/jit/metainterp/test/test_resume2.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/test/test_resume2.py
@@ -0,0 +1,50 @@
+
+from rpython.jit.tool.oparser import parse
+from rpython.jit.codewriter.jitcode import JitCode
+from rpython.jit.metainterp.history import AbstractDescr
+from rpython.jit.metainterp.resume2 import rebuild_from_resumedata
+
+class Descr(AbstractDescr):
+    pass
+
+class MockLoop(object):
+    pass
+
+class Frame(object):
+    def __init__(self, jitcode):
+        self.jitcode = jitcode
+        self.registers_i = [None] * jitcode.num_regs_i()
+
+class MockMetaInterp(object):
+    def __init__(self):
+        self.framestack = []
+
+    def newframe(self, jitcode):
+        self.framestack.append(Frame(jitcode))
+
+class MockCPU(object):
+    def get_int_value(self, frame, index):
+        assert frame == "myframe"
+        assert index == 10
+        return 13
+
+class TestResumeDirect(object):
+    def test_direct_resume_reader(self):
+        jitcode = JitCode("jitcode")
+        jitcode.setup(num_regs_i=13)
+        resume_loop = parse("""
+        []
+        enter_frame(-1, descr=jitcode1)
+        resume_put(10, 0, 1)
+        leave_frame()
+        """, namespace={'jitcode1': jitcode})
+        descr = Descr()
+        descr.rd_loop = MockLoop()
+        descr.rd_loop.rd_bytecode = resume_loop.operations
+        descr.rd_bytecode_position = 2
+        metainterp = MockMetaInterp()
+        metainterp.cpu = MockCPU()
+        rebuild_from_resumedata(metainterp, "myframe", descr)
+        assert len(metainterp.framestack) == 1
+        f = metainterp.framestack[-1]
+        assert f.registers_i[1].getint() == 13


More information about the pypy-commit mailing list