[pypy-commit] pypy resume-refactor: fix the reconstructing_resume_reader

fijal noreply at buildbot.pypy.org
Sun Jan 12 12:01:38 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68603:278fef54424c
Date: 2014-01-12 11:59 +0100
http://bitbucket.org/pypy/pypy/changeset/278fef54424c/

Log:	fix the reconstructing_resume_reader

diff --git a/rpython/jit/backend/llsupport/llmodel.py b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -339,16 +339,13 @@
         assert isinstance(res, history.AbstractFailDescr)
         return res
 
-    def get_int_value(self, deadframe, locs, pos):
+    def get_int_value(self, deadframe, pos):
         descr = self.gc_ll_descr.getframedescrs(self).arraydescr
         ofs = self.unpack_arraydescr(descr)
-        if locs is None:
-            assert pos == 0
-        else:
-            pos = locs[pos] * WORD
-        return self.read_int_at_mem(deadframe, pos + ofs, WORD, 1)
+        return self.read_int_at_mem(deadframe, pos * WORD + ofs, WORD, 1)
 
     def get_ref_value(self, deadframe, locs, pos):
+        xxx
         descr = self.gc_ll_descr.getframedescrs(self).arraydescr
         ofs = self.unpack_arraydescr(descr)
         if locs is None:
@@ -357,14 +354,10 @@
             pos = locs[pos] * WORD
         return self.read_ref_at_mem(deadframe, pos + ofs)
 
-    def get_float_value(self, deadframe, locs, pos):
+    def get_float_value(self, deadframe, pos):
         descr = self.gc_ll_descr.getframedescrs(self).arraydescr
         ofs = self.unpack_arraydescr(descr)
-        if locs is None:
-            assert pos == 0
-        else:
-            pos = locs[pos] * WORD
-        return self.read_float_at_mem(deadframe, pos + ofs)
+        return self.read_float_at_mem(deadframe, pos * WORD + ofs)
 
     # ____________________ RAW PRIMITIVES ________________________
 
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
@@ -19,7 +19,7 @@
         self.framestack.append([None] * jitcode.num_regs())
 
     def resume_put(self, box, framepos, frontend_pos):
-        self.framestack[-framepos - 1][frontend_pos] = box
+        self.framestack[framepos][frontend_pos] = box
 
     def resume_new(self, result, descr):
         self.deps[result] = {}
diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -69,11 +69,11 @@
         else:
             self.guard_failed = True
         if result_type == 'int':
-            return BoxInt(self.cpu.get_int_value(deadframe, locs, 0))
+            return BoxInt(self.cpu.get_int_value(deadframe, 0))
         elif result_type == 'ref':
-            return BoxPtr(self.cpu.get_ref_value(deadframe, locs, 0))
+            return BoxPtr(self.cpu.get_ref_value(deadframe, 0))
         elif result_type == 'float':
-            return BoxFloat(self.cpu.get_float_value(deadframe, locs, 0))
+            return BoxFloat(self.cpu.get_float_value(deadframe, 0))
         elif result_type == 'void':
             return None
         else:
@@ -132,7 +132,7 @@
         self.cpu.compile_loop(None, inputargs, operations, looptoken)
         deadframe = self.cpu.execute_token(looptoken, 2)
         fail = self.cpu.get_latest_descr(deadframe)
-        res = self.cpu.get_int_value(deadframe, None, 0)
+        res = self.cpu.get_int_value(deadframe, 0)
         assert res == 3
         assert fail.identifier == 1
 
@@ -151,7 +151,7 @@
         deadframe = self.cpu.execute_token(looptoken,
                                            longlong.getfloatstorage(2.8))
         fail = self.cpu.get_latest_descr(deadframe)
-        res = self.cpu.get_float_value(deadframe, None, 0)
+        res = self.cpu.get_float_value(deadframe, 0)
         assert longlong.getrealfloat(res) == 5.1
         fail = self.cpu.get_latest_descr(deadframe)
         assert fail.identifier == 1
@@ -172,7 +172,6 @@
             ResOperation(rop.RESUME_PUT, [i1, ConstInt(0), ConstInt(0)],
                          None),
             ResOperation(rop.GUARD_TRUE, [i2], None, descr=BasicFailDescr(2)),
-            ResOperation(rop.LEAVE_FRAME, [], None),
             ResOperation(rop.JUMP, [i1], None, descr=targettoken),
             ]
         inputargs = [i0]
@@ -181,8 +180,7 @@
         deadframe = self.cpu.execute_token(looptoken, 2)
         fail = self.cpu.get_latest_descr(deadframe)
         assert fail.identifier == 2
-        locs = rebuild_locs_from_resumedata(fail)
-        res = self.cpu.get_int_value(deadframe, locs, 0)
+        res = self.cpu.get_int_value(deadframe, 0)
         assert res == 10
 
     def test_backends_dont_keep_loops_alive(self):
@@ -357,7 +355,7 @@
             deadframe = self.cpu.execute_token(looptoken, value)
             fail = self.cpu.get_latest_descr(deadframe)
             assert fail is faildescr
-            res = self.cpu.get_float_value(deadframe, None, 0)
+            res = self.cpu.get_float_value(deadframe, 0)
             assert longlong.getrealfloat(res) == -61.25
 
             looptoken = JitCellToken()
@@ -368,7 +366,7 @@
             deadframe = self.cpu.execute_token(looptoken)
             fail = self.cpu.get_latest_descr(deadframe)
             assert fail is faildescr
-            res = self.cpu.get_float_value(deadframe, None, 0)
+            res = self.cpu.get_float_value(deadframe, 0)
             assert longlong.getrealfloat(res) == 42.5
 
     def test_execute_operations_in_env(self):
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
@@ -34,7 +34,7 @@
             elif op.getopnum() == rop.LEAVE_FRAME:
                 self.leave_frame()
             elif op.getopnum() == rop.RESUME_PUT:
-                self.resume_put(op.getarg(0).getint(), op.getarg(1).getint(),
+                self.resume_put(op.getarg(0), op.getarg(1).getint(),
                          op.getarg(2).getint())
             elif op.getopnum() == rop.RESUME_NEW:
                 self.resume_new(op.result, op.getdescr())
@@ -48,7 +48,8 @@
                 xxx
             pos += 1
 
-    def resume_put(self, jitframe_pos, depth, frontend_position):
+    def resume_put(self, jitframe_pos_const, depth, frontend_position):
+        jitframe_pos = jitframe_pos_const.getint()
         jitcode = self.metainterp.framestack[-1].jitcode
         frame = self.metainterp.framestack[depth]
         if frontend_position < jitcode.num_regs_i():
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
@@ -30,6 +30,7 @@
 
 class MockMetaInterp(object):
     def __init__(self):
+        self.cpu = MockCPU()
         self.framestack = []
 
     def newframe(self, jitcode):
@@ -45,14 +46,23 @@
 
 class RebuildingResumeReader(BoxResumeReader):
     def __init__(self):
-        self.backend_values = {}
         self.metainterp = MockMetaInterp()
 
+    def put_box_int(self, frame, position, jitframe_pos):
+        frame.registers_i[position] = jitframe_pos
+
+    def put_box_float(self, frame, position, jitframe_pos):
+        xxx
+
+    def put_box_ref(self, frame, position, jitframe_pos):
+        xxx
+
     def finish(self):
-        l = []
+        framestack = []
         for frame in self.metainterp.framestack:
-            frame.dump_registers(l, self.backend_values)
-        return l
+            framestack.append(frame.registers_i + frame.registers_r +
+                              frame.registers_f)
+        return framestack
 
 def rebuild_locs_from_resumedata(faildescr):
     return RebuildingResumeReader().rebuild(faildescr)
@@ -161,27 +171,23 @@
         """, namespace={'jitcode':jitcode1})
 
     def test_reconstructing_resume_reader(self):
-        py.test.skip("xxx")
         jitcode1 = JitCode("jitcode")
         jitcode1.setup(num_regs_i=2, num_regs_f=0, num_regs_r=0)
         jitcode2 = JitCode("jitcode2")
         jitcode2.setup(num_regs_i=1, num_regs_f=0, num_regs_r=0)
         resume_loop = parse("""
-        [i0, i1, i2, i3]
+        []
         enter_frame(-1, descr=jitcode1)
-        resume_put(i0, 0, 1)
-        backend_attach(i0, 11)
+        resume_put(11, 0, 1)
         enter_frame(12, descr=jitcode2)
-        resume_put(i1, 0, 0)
-        backend_attach(i1, 12)
-        resume_put(i3, 1, 0)
-        backend_attach(i3, 8)
+        resume_put(12, 1, 0)
+        resume_put(8, 0, 0)
         leave_frame()
         leave_frame()
         """, namespace={'jitcode1': jitcode1,
                         'jitcode2': jitcode2})
         descr = Descr()
         descr.rd_resume_bytecode = ResumeBytecode(resume_loop.operations)
-        descr.rd_bytecode_position = 8
+        descr.rd_bytecode_position = 5
         locs = rebuild_locs_from_resumedata(descr)
-        assert locs == [8, 11, 12]
+        assert locs == [[8, 11], [12]]


More information about the pypy-commit mailing list