Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r66409:d90df29ed710
Date: 2013-08-28 17:20 +0100
http://bitbucket.org/pypy/pypy/changeset/d90df29ed710/
Log: (fijal, antocuni) Write more tests
diff --git a/rpython/jit/metainterp/resume2.py
b/rpython/jit/metainterp/resume2.py
--- a/rpython/jit/metainterp/resume2.py
+++ b/rpython/jit/metainterp/resume2.py
@@ -22,7 +22,7 @@
assert isinstance(descr, JitCode)
self.enter_frame(op.getarg(0).getint(), descr)
elif op.getopnum() == rop.LEAVE_FRAME:
- xxx
+ self.leave_frame()
elif op.getopnum() == rop.RESUME_PUT:
self.put(op.getarg(0).getint(), op.getarg(1).getint(),
op.getarg(2).getint())
@@ -30,27 +30,33 @@
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 leave_frame(self):
+ self.metainterp.popframe()
+
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
+ self.write_int(frame, frontend_position,
+ cpu.get_int_value(self.deadframe, jitframe_index))
elif frontend_position < (jitcode.num_regs_r() + jitcode.num_regs_i()):
xxx
else:
assert frontend_position < jitcode.num_regs()
xxx
+class DirectResumeReader(AbstractResumeReader):
+ pass
+
+class BoxResumeReader(AbstractResumeReader):
+ def write_int(self, frame, pos, value):
+ frame.registers_i[pos] = BoxInt(value)
+
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
--- a/rpython/jit/metainterp/test/test_resume2.py
+++ b/rpython/jit/metainterp/test/test_resume2.py
@@ -15,6 +15,9 @@
self.jitcode = jitcode
self.registers_i = [None] * jitcode.num_regs_i()
+ def num_nonempty_regs(self):
+ return len(filter(bool, self.registers_i))
+
class MockMetaInterp(object):
def __init__(self):
self.framestack = []
@@ -22,11 +25,13 @@
def newframe(self, jitcode):
self.framestack.append(Frame(jitcode))
+ def popframe(self):
+ self.framestack.pop()
+
class MockCPU(object):
def get_int_value(self, frame, index):
assert frame == "myframe"
- assert index == 10
- return 13
+ return index + 3
class TestResumeDirect(object):
def test_box_resume_reader(self):
@@ -49,3 +54,45 @@
f = metainterp.framestack[-1]
assert f.registers_i[1].getint() == 13
+ def test_nested_call(self):
+ jitcode1 = JitCode("jitcode")
+ jitcode1.setup(num_regs_i=13)
+ jitcode2 = JitCode("jitcode2")
+ jitcode2.setup(num_regs_i=9)
+ resume_loop = parse("""
+ []
+ enter_frame(-1, descr=jitcode1)
+ resume_put(11, 0, 2)
+ enter_frame(12, descr=jitcode2)
+ resume_put(12, 0, 3)
+ resume_put(8, 1, 4)
+ leave_frame()
+ resume_put(10, 0, 1)
+ leave_frame()
+ """, namespace={'jitcode1': jitcode1, 'jitcode2': jitcode2})
+ metainterp = MockMetaInterp()
+ metainterp.cpu = MockCPU()
+ descr = Descr()
+ descr.rd_loop = MockLoop()
+ descr.rd_loop.rd_bytecode = resume_loop.operations
+ descr.rd_bytecode_position = 5
+ rebuild_from_resumedata(metainterp, "myframe", descr)
+ assert len(metainterp.framestack) == 2
+ f = metainterp.framestack[-1]
+ f2 = metainterp.framestack[0]
+ assert f.num_nonempty_regs() == 1
+ assert f2.num_nonempty_regs() == 2
+ assert f.registers_i[3].getint() == 12 + 3
+ assert f2.registers_i[4].getint() == 8 + 3
+ assert f2.registers_i[2].getint() == 11 + 3
+
+ descr.rd_bytecode_position = 7
+ metainterp.framestack = []
+ rebuild_from_resumedata(metainterp, "myframe", descr)
+ assert len(metainterp.framestack) == 1
+ f = metainterp.framestack[-1]
+ assert f.num_nonempty_regs() == 3
+ assert f.registers_i[1].getint() == 10 + 3
+ assert f.registers_i[2].getint() == 11 + 3
+ assert f.registers_i[4].getint() == 8 + 3
+
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit