[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