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

Reply via email to