[pypy-commit] pypy resume-refactor: progress

fijal noreply at buildbot.pypy.org
Wed Sep 25 20:07:30 CEST 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r67102:74607bbebebf
Date: 2013-09-25 20:06 +0200
http://bitbucket.org/pypy/pypy/changeset/74607bbebebf/

Log:	progress

diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -4,7 +4,7 @@
 from rpython.jit.metainterp.history import (INT, REF, FLOAT, JitCellToken,
     ConstInt, BoxInt, AbstractFailDescr)
 from rpython.jit.metainterp.resoperation import ResOperation, rop
-from rpython.jit.metainterp.resume2 import rebuild_locs_from_resumedata
+#from rpython.jit.metainterp.resume2 import rebuild_locs_from_resumedata
 from rpython.rlib import rgc
 from rpython.rlib.debug import (debug_start, debug_stop, have_debug_prints,
                                 debug_print)
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -469,15 +469,14 @@
     'READ_TIMESTAMP/0',
     'MARK_OPAQUE_PTR/1b',
     '_RESUME_FIRST',
+    # resume-only operations that never make it to the real assembler
     'ENTER_FRAME/1d',
     'LEAVE_FRAME/0',
     'RESUME_PUT/3',
     'RESUME_NEW/0d',
     'RESUME_SETFIELD_GC/2d',
     'BACKEND_ATTACH/2',
-    # same as resume_put, but the first arg is backend-dependent,
-    # instead of a box
-    '_RESUME_LAST',
+    '_RESUME_LAST', # ----- end of resume only operations ------
     '_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
 
     'SETARRAYITEM_GC/3d',
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
@@ -14,6 +14,10 @@
     def rebuild(self, faildescr):
         self._rebuild_until(faildescr.rd_resume_bytecode,
                             faildescr.rd_bytecode_position)
+        self.finish()
+
+    def finish(self):
+        pass
 
     def _rebuild_until(self, rb, position):
         if rb.parent is not None:
@@ -37,6 +41,8 @@
             elif op.getopnum() == rop.RESUME_SETFIELD_GC:
                 self.resume_setfield_gc(op.getarg(0), op.getarg(1),
                                         op.getdescr())
+            elif op.getopnum() == rop.BACKEND_ATTACH:
+                self.resume_backend_attach(op.getarg(0), op.getarg(1).getint())
             elif not op.is_resume():
                 pos += 1
                 continue
@@ -44,12 +50,11 @@
                 xxx
             pos += 1
 
-    def resume_put(self, jitframe_index, depth, frontend_position):
-        XXX
+    def resume_put(self, box, depth, frontend_position):
         jitcode = self.metainterp.framestack[-1].jitcode
         frame = self.metainterp.framestack[- depth - 1]
         if frontend_position < jitcode.num_regs_i():
-            self.write_int(frame, frontend_position, jitframe_index)
+            self.put_box_int(frame, frontend_position, box)
         elif frontend_position < (jitcode.num_regs_r() + jitcode.num_regs_i()):
             xxx
         else:
@@ -63,6 +68,10 @@
     def __init__(self, metainterp, deadframe):
         self.metainterp = metainterp
         self.deadframe = deadframe
+        self.backend_values = {}
+
+    def resume_backend_attach(self, box, position):
+        self.backend_values[box] = position
 
     def enter_frame(self, pc, jitcode):
         if pc != -1:
@@ -72,49 +81,18 @@
     def leave_frame(self):
         self.metainterp.popframe()
 
-    def write_int(self, frame, pos, jitframe_index):
+    def put_box_int(self, frame, position, box):
+        frame.registers_i[position] = box
+
+    def finish(self):
         cpu = self.metainterp.cpu
-        value = cpu.get_int_value(self.deadframe, jitframe_index)
-        frame.registers_i[pos] = BoxInt(value)
-
-class ReconstructingResumeReader(AbstractResumeReader):
-    def __init__(self):
-        self.framestack = []
-
-    def enter_frame(self, pc, jitcode):
-        self.framestack.append([-1] * jitcode.num_regs())
-
-    def put(self, jitframe_index, depth, frontend_position):
-        self.framestack[- depth - 1][frontend_position] = jitframe_index
-
-    def leave_frame(self):
-        self.framestack.pop()
-
-class SimpleResumeReader(AbstractResumeReader):
-    def __init__(self):
-        self.framestack = []
-
-    def enter_frame(self, pc, jitcode):
-        self.framestack.append(jitcode.num_regs())
-
-    def put(self, *args):
-        pass
-
-    def leave_frame(self):
-        self.framestack.pop()
+        for box, position in self.backend_values.iteritems():
+            if box.type == 'i':
+                intval = cpu.get_int_value(self.deadframe, position)
+                assert isinstance(box, BoxInt)
+                box.value = intval
+            else:
+                xxx
 
 def rebuild_from_resumedata(metainterp, deadframe, faildescr):
     BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
-
-def rebuild_locs_from_resumedata(faildescr):
-    reader = ReconstructingResumeReader()
-    reader.rebuild(faildescr)
-    size = 0
-    for frame in reader.framestack:
-        size += len(frame)
-    res = [-1] * size
-    i = 0
-    for frame in reader.framestack:
-        res[i : i + len(frame)] = frame
-        i += len(frame)
-    return res
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
@@ -3,7 +3,7 @@
 from rpython.jit.codewriter.jitcode import JitCode
 from rpython.jit.metainterp.history import AbstractDescr
 from rpython.jit.metainterp.resume2 import rebuild_from_resumedata,\
-     rebuild_locs_from_resumedata, ResumeBytecode
+     ResumeBytecode
 
 
 class Descr(AbstractDescr):
@@ -40,14 +40,15 @@
         jitcode = JitCode("jitcode")
         jitcode.setup(num_regs_i=13)
         resume_loop = parse("""
-        []
+        [i0]
         enter_frame(-1, descr=jitcode1)
-        backend_put(10, 0, 1)
+        resume_put(i0, 0, 1)
+        backend_attach(i0, 10)
         leave_frame()
         """, namespace={'jitcode1': jitcode})
         descr = Descr()
         descr.rd_resume_bytecode = ResumeBytecode(resume_loop.operations)
-        descr.rd_bytecode_position = 2
+        descr.rd_bytecode_position = 3
         metainterp = MockMetaInterp()
         metainterp.cpu = MockCPU()
         rebuild_from_resumedata(metainterp, "myframe", descr)
@@ -61,21 +62,25 @@
         jitcode2 = JitCode("jitcode2")
         jitcode2.setup(num_regs_i=9)
         resume_loop = parse("""
-        []
+        [i0, i1, i2, i3]
         enter_frame(-1, descr=jitcode1)
-        backend_put(11, 0, 2)
+        resume_put(i0, 0, 2)
+        backend_attach(i0, 11)
         enter_frame(12, descr=jitcode2)
-        backend_put(12, 0, 3)
-        backend_put(8, 1, 4)
+        resume_put(i1, 0, 3)
+        resume_put(i2, 1, 4)
+        backend_attach(i1, 12)
+        backend_attach(i2, 8)
         leave_frame()
-        backend_put(10, 0, 1)
+        backend_attach(i3, 10)
+        resume_put(i3, 0, 1)
         leave_frame()
         """, namespace={'jitcode1': jitcode1, 'jitcode2': jitcode2})
         metainterp = MockMetaInterp()
         metainterp.cpu = MockCPU()
         descr = Descr()
         descr.rd_resume_bytecode = ResumeBytecode(resume_loop.operations)
-        descr.rd_bytecode_position = 5
+        descr.rd_bytecode_position = 8
         rebuild_from_resumedata(metainterp, "myframe", descr)
         assert len(metainterp.framestack) == 2
         f = metainterp.framestack[-1]
@@ -86,7 +91,7 @@
         assert f2.registers_i[4].getint() == 8 + 3
         assert f2.registers_i[2].getint() == 11 + 3
 
-        descr.rd_bytecode_position = 7
+        descr.rd_bytecode_position = 11
         metainterp.framestack = []
         rebuild_from_resumedata(metainterp, "myframe", descr)
         assert len(metainterp.framestack) == 1
@@ -100,21 +105,24 @@
         jitcode1 = JitCode("jitcode")
         jitcode1.setup(num_regs_i=13)
         base = parse("""
-        []
+        [i0, i1]
         enter_frame(-1, descr=jitcode1)
-        backend_put(42, 0, 0)
+        resume_put(i0, 0, 0)
+        backend_attach(i0, 42)
         # here is the split caused by a guard
-        backend_put(1, 0, 1)
+        resume_put(i1, 0, 1)
+        backend_attach(i1, 1)
         """, namespace={'jitcode1': jitcode1})
         bridge = parse("""
-        []
-        backend_put(2, 0, 1)
+        [i2]
+        resume_put(i2, 0, 1)
+        backend_attach(i2, 2)
         """)
         descr = Descr()
-        descr.rd_bytecode_position = 1
+        descr.rd_bytecode_position = 2
         parent = ResumeBytecode(base.operations)
         b = ResumeBytecode(bridge.operations, parent=parent,
-                           parent_position=2)
+                           parent_position=3)
         descr.rd_resume_bytecode = b
         metainterp = MockMetaInterp()
         metainterp.cpu = MockCPU()
@@ -125,17 +133,19 @@
         assert f.registers_i[1].getint() == 2 + 3
 
     def test_new(self):
+        jitcode1 = JitCode("jitcode")
+        jitcode1.setup(num_regs_i=1)
         base = parse("""
         []
         enter_frame(-1, descr=jitcode)
         i0 = new(descr=structdescr)
-        XXX
-        resume_setfield(i0, 13
+        resume_setfield(i0, 13, descr=fielddescr)
         backend_put(12,
         leave_frame()
-        """)
+        """, namespace={'jitcode':jitcode})
 
     def test_reconstructing_resume_reader(self):
+        XXX
         jitcode1 = JitCode("jitcode")
         jitcode1.setup(num_regs_i=3, num_regs_f=0, num_regs_r=0)
         jitcode2 = JitCode("jitcode2")


More information about the pypy-commit mailing list