[pypy-commit] pypy resume-refactor: (fijal, rguillebert) make the first test_frontend pass

fijal noreply at buildbot.pypy.org
Fri Jan 17 18:13:15 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68729:7cee71ea433a
Date: 2014-01-17 18:12 +0100
http://bitbucket.org/pypy/pypy/changeset/7cee71ea433a/

Log:	(fijal, rguillebert) make the first test_frontend pass

diff --git a/rpython/jit/resume/backend.py b/rpython/jit/resume/backend.py
--- a/rpython/jit/resume/backend.py
+++ b/rpython/jit/resume/backend.py
@@ -1,6 +1,6 @@
 
-from rpython.jit.metainterp.resoperation import rop, ResOperation
-from rpython.jit.metainterp.history import ConstInt, Box, Const
+from rpython.jit.metainterp.resoperation import rop
+from rpython.jit.metainterp.history import Box, Const
 from rpython.jit.resume.rescode import ResumeBytecodeBuilder, TAGBOX,\
      ResumeBytecode, TAGVIRTUAL
 from rpython.jit.codewriter.jitcode import JitCode
@@ -67,7 +67,7 @@
                 pos += 1
                 continue
             else:
-                xxx
+                raise Exception("strange operation")
             pos += 1
 
     def _track(self, allboxes, box):
@@ -156,37 +156,7 @@
             descr = op.getdescr()
             self.builder.resume_setfield_gc(structpos, fieldpos, descr)
         else:
-            xxx
-        return
-        xxxx
-        if op.getopnum() == rop.RESUME_PUT:
-            box = op.getarg(0)
-            args = op.getarglist()
-            if isinstance(box, Const):
-                XXX
-                newop = op.copy_and_change(rop.RESUME_PUT_CONST)
-            elif box in self.virtuals:
-                newop = op
-            else:
-                try:
-                    loc = self.regalloc.loc(box, must_exist=True)
-                    pos = loc.get_jitframe_position()
-                except KeyError:
-                    # the thing is not *yet* anywhere, which means we'll record
-                    # we know about it, but not store the resume_put just yet
-                    self.current_attachment[box] = -1
-                    self.frontend_pos[box] = (args[1], args[2])
-                    return
-                self.current_attachment[box] = pos
-                self.frontend_pos[box] = (args[1], args[2])
-                args[0] = ConstInt(pos)
-                newop = op.copy_and_change(rop.RESUME_PUT, args=args)
-        elif op.getopnum() == rop.RESUME_NEW:
-            self.virtuals[op.result] = None
-            newop = op
-        else:
-            newop = op
-        self.newops.append(newop)
+            raise Exception("strange operation")
 
     def _mark_visited(self, v, loc):
         pos = loc.get_jitframe_position()
@@ -215,7 +185,8 @@
         return self.builder.getpos()
 
     def finish(self, parent, parent_position, clt):
-        return ResumeBytecode(self.builder.build(), parent, parent_position,
+        return ResumeBytecode(self.builder.build(), self.builder.consts,
+                              parent, parent_position,
                               clt)
 
 
diff --git a/rpython/jit/resume/frontend.py b/rpython/jit/resume/frontend.py
--- a/rpython/jit/resume/frontend.py
+++ b/rpython/jit/resume/frontend.py
@@ -1,141 +1,134 @@
 
-import sys
 from rpython.jit.metainterp.resoperation import rop
 from rpython.jit.metainterp.history import BoxInt, BoxPtr, BoxFloat, ConstInt,\
-     Box, INT, REF, FLOAT
+     INT, REF
 from rpython.jit.metainterp import history
-from rpython.jit.codewriter.jitcode import JitCode
-from rpython.rlib import rstack
-from rpython.jit.resume.reader import ResumeFrame, Virtual
-from rpython.jit.resume.rescode import TAGBOX, TAGCONST, TAGVIRTUAL, TAGOFFSET
+from rpython.jit.resume.reader import AbstractResumeReader
+from rpython.jit.resume.rescode import TAGBOX, TAGCONST, TAGSMALLINT, TAGVIRTUAL
 
 
+# class AbstractResumeReader(object):
+#     """ A resume reader that can follow resume until given point. Consult
+#     the concrete classes for details
+#     """
 
+#     def __init__(self):
+#         self.framestack = []
+#         self.consts = [] # XXX cache?
+#         self.virtuals = {}
+#         self.virtual_list = []
 
-class AbstractResumeReader(object):
-    """ A resume reader that can follow resume until given point. Consult
-    the concrete classes for details
-    """
+#     def rebuild(self, faildescr):
+#         self._rebuild_until(faildescr.rd_resume_bytecode,
+#                             faildescr.rd_bytecode_position)
+#         return self.finish()
 
-    def __init__(self):
-        self.framestack = []
-        self.consts = [] # XXX cache?
-        self.virtuals = {}
-        self.virtual_list = []
+#     def finish(self):
+#         pass
 
-    def rebuild(self, faildescr):
-        self._rebuild_until(faildescr.rd_resume_bytecode,
-                            faildescr.rd_bytecode_position)
-        return self.finish()
+#     def enter_frame(self, pc, jitcode):
+#         if self.framestack:
+#             assert pc != -1
+#             self.framestack[-1].pc = pc
+#         self.framestack.append(ResumeFrame(jitcode))
 
-    def finish(self):
-        pass
+#     def encode_box(self, pos):
+#         return TAGBOX | (pos << TAGOFFSET)
 
-    def enter_frame(self, pc, jitcode):
-        if self.framestack:
-            assert pc != -1
-            self.framestack[-1].pc = pc
-        self.framestack.append(ResumeFrame(jitcode))
+#     def encode_virtual(self, box):
+#         return TAGVIRTUAL | (self.virtuals[box].pos << TAGOFFSET)
 
-    def encode_box(self, pos):
-        return TAGBOX | (pos << TAGOFFSET)
+#     def encode_const(self, const):
+#         if isinstance(const, ConstInt) and const.getint() < (sys.maxint >> 3):
+#             return TAGSMALLINT | (const.getint() << TAGOFFSET)
+#         self.consts.append(const)
+#         return TAGCONST | ((len(self.consts) - 1) << TAGOFFSET)
 
-    def encode_virtual(self, box):
-        return TAGVIRTUAL | (self.virtuals[box].pos << TAGOFFSET)
+#     def decode(self, pos):
+#         return pos & 0x3, pos >> TAGOFFSET
 
-    def encode_const(self, const):
-        if isinstance(const, ConstInt) and const.getint() < (sys.maxint >> 3):
-            return TAGSMALLINT | (const.getint() << TAGOFFSET)
-        self.consts.append(const)
-        return TAGCONST | ((len(self.consts) - 1) << TAGOFFSET)
+#     def resume_put(self, jitframe_pos_box, frame_no, frontend_position):
+#         if isinstance(jitframe_pos_box, Box):
+#             jitframe_pos = self.encode_virtual(jitframe_pos_box)
+#         else:
+#             jitframe_pos = self.encode_box(jitframe_pos_box.getint())
+#         self.framestack[frame_no].registers[frontend_position] = jitframe_pos
 
-    def decode(self, pos):
-        return pos & 0x3, pos >> TAGOFFSET
+#     def encode(self, box):
+#         xxx
 
-    def resume_put(self, jitframe_pos_box, frame_no, frontend_position):
-        if isinstance(jitframe_pos_box, Box):
-            jitframe_pos = self.encode_virtual(jitframe_pos_box)
-        else:
-            jitframe_pos = self.encode_box(jitframe_pos_box.getint())
-        self.framestack[frame_no].registers[frontend_position] = jitframe_pos
+#     def resume_new(self, box, descr):
+#         # XXX make it a list
+#         v = Virtual(len(self.virtual_list), descr)
+#         self.virtuals[box] = v
+#         self.virtual_list.append(v)
 
-    def encode(self, box):
-        xxx
+#     def resume_setfield_gc(self, box, fieldbox, descr):
+#         # XXX optimize fields
+#         self.virtuals[box].fields[descr] = self.encode(fieldbox)
 
-    def resume_new(self, box, descr):
-        # XXX make it a list
-        v = Virtual(len(self.virtual_list), descr)
-        self.virtuals[box] = v
-        self.virtual_list.append(v)
+#     def resume_clear(self, frame_no, frontend_position):
+#         self.framestack[frame_no].registers[frontend_position] = -1
 
-    def resume_setfield_gc(self, box, fieldbox, descr):
-        # XXX optimize fields
-        self.virtuals[box].fields[descr] = self.encode(fieldbox)
+#     def resume_put_const(self, const, frame_no, frontend_position):
+#         pos = self.encode_const(const)
+#         self.framestack[frame_no].registers[frontend_position] = pos
 
-    def resume_clear(self, frame_no, frontend_position):
-        self.framestack[frame_no].registers[frontend_position] = -1
+#     def resume_set_pc(self, pc):
+#         self.framestack[-1].pc = pc
 
-    def resume_put_const(self, const, frame_no, frontend_position):
-        pos = self.encode_const(const)
-        self.framestack[frame_no].registers[frontend_position] = pos
+#     def leave_frame(self):
+#         self.framestack.pop()
 
-    def resume_set_pc(self, pc):
-        self.framestack[-1].pc = pc
+#     def _rebuild_until(self, rb, position):
+#         if rb.parent is not None:
+#             self._rebuild_until(rb.parent, rb.parent_position)
+#         self.interpret_until(rb.opcodes, position)
 
-    def leave_frame(self):
-        self.framestack.pop()
+#     def interpret_until(self, bytecode, until, pos=0):
+#         while pos < until:
+#             op = bytecode[pos]
+#             if op == rescode.ENTER_FRAME:
+#                 xxx
+#                 descr = op.getdescr()
+#                 assert isinstance(descr, JitCode)
+#                 self.enter_frame(op.getarg(0).getint(), descr)
+#             elif op.getopnum() == rop.LEAVE_FRAME:
+#                 self.leave_frame()
+#             elif op.getopnum() == rop.RESUME_PUT:
+#                 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())
+#             elif op.getopnum() == rop.RESUME_SETFIELD_GC:
+#                 self.resume_setfield_gc(op.getarg(0), op.getarg(1),
+#                                         op.getdescr())
+#             elif op.getopnum() == rop.RESUME_SET_PC:
+#                 self.resume_set_pc(op.getarg(0).getint())
+#             elif op.getopnum() == rop.RESUME_CLEAR:
+#                 self.resume_clear(op.getarg(0).getint(),
+#                                   op.getarg(1).getint())
+#             elif not op.is_resume():
+#                 pos += 1
+#                 continue
+#             else:
+#                 xxx
+#             pos += 1
 
-    def _rebuild_until(self, rb, position):
-        if rb.parent is not None:
-            self._rebuild_until(rb.parent, rb.parent_position)
-        self.interpret_until(rb.opcodes, position)
+#     def read_int(self, jitframe_pos):
+#         return self.metainterp.cpu.get_int_value(self.deadframe, jitframe_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:
-                self.leave_frame()
-            elif op.getopnum() == rop.RESUME_PUT:
-                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())
-            elif op.getopnum() == rop.RESUME_SETFIELD_GC:
-                self.resume_setfield_gc(op.getarg(0), op.getarg(1),
-                                        op.getdescr())
-            elif op.getopnum() == rop.RESUME_SET_PC:
-                self.resume_set_pc(op.getarg(0).getint())
-            elif op.getopnum() == rop.RESUME_CLEAR:
-                self.resume_clear(op.getarg(0).getint(),
-                                  op.getarg(1).getint())
-            elif not op.is_resume():
-                pos += 1
-                continue
-            else:
-                xxx
-            pos += 1
-
-    def read_int(self, jitframe_pos):
-        return self.metainterp.cpu.get_int_value(self.deadframe, jitframe_pos)
-
-class Dumper(AbstractResumeReader):
-    def __init__(self):
-        xxx
 
 class DirectResumeReader(AbstractResumeReader):
     """ Directly read values from the jitframe and put them in the blackhole
     interpreter
     """
 
-    def __init__(self, binterpbuilder, cpu, deadframe):
+    def __init__(self, metainterp_sd, binterpbuilder, cpu, deadframe):
         self.bhinterpbuilder = binterpbuilder
         self.cpu = cpu
         self.deadframe = deadframe
-        AbstractResumeReader.__init__(self)
+        AbstractResumeReader.__init__(self, metainterp_sd)
 
     def finish(self):
         nextbh = None
@@ -186,7 +179,7 @@
     def __init__(self, metainterp, deadframe):
         self.metainterp = metainterp
         self.deadframe = deadframe
-        AbstractResumeReader.__init__(self)
+        AbstractResumeReader.__init__(self, metainterp.staticdata)
 
     def get_box_value(self, encoded_pos, TP):
         if encoded_pos == -1:
diff --git a/rpython/jit/resume/reader.py b/rpython/jit/resume/reader.py
--- a/rpython/jit/resume/reader.py
+++ b/rpython/jit/resume/reader.py
@@ -88,6 +88,7 @@
         self.framestack.pop()
 
     def _rebuild_until(self, rb, position):
+        self.consts = rb.consts
         if rb.parent is not None:
             self._rebuild_until(rb.parent, rb.parent_position)
         self.interpret_until(rb, position)
diff --git a/rpython/jit/resume/rescode.py b/rpython/jit/resume/rescode.py
--- a/rpython/jit/resume/rescode.py
+++ b/rpython/jit/resume/rescode.py
@@ -12,9 +12,11 @@
 TAGOFFSET = 2
 
 class ResumeBytecode(object):
-    def __init__(self, opcodes, parent=None, parent_position=-1, loop=None):
+    def __init__(self, opcodes, consts, parent=None, parent_position=-1,
+                 loop=None):
         self.opcodes = opcodes
         self.parent = parent
+        self.consts = consts
         self.parent_position = parent_position
         self.loop = loop
 
@@ -28,6 +30,7 @@
 class ResumeBytecodeBuilder(object):
     def __init__(self):
         self.l = []
+        self.consts = []
 
     def getpos(self):
         return len(self.l)
diff --git a/rpython/jit/resume/test/test_backend.py b/rpython/jit/resume/test/test_backend.py
--- a/rpython/jit/resume/test/test_backend.py
+++ b/rpython/jit/resume/test/test_backend.py
@@ -5,6 +5,7 @@
 from rpython.jit.tool.oparser import parse
 from rpython.jit.metainterp.optimizeopt.util import equaloplists
 from rpython.jit.resume.test.test_frontend import rebuild_locs_from_resumedata
+from rpython.jit.resume.test.support import MockStaticData
 from rpython.rtyper.lltypesystem import lltype
 
 class MockJitCode(JitCode):
@@ -19,11 +20,6 @@
     def __repr__(self):
         return 'MockJitCode(%d)' % self.no
 
-class MockStaticData(object):
-    def __init__(self, jitcodes, descrs):
-        self.alljitcodes = jitcodes
-        self.opcode_descrs = descrs
-
 def preparse(inp):
     return "\n".join([s.strip() for s in inp.split("\n") if s.strip()])
 
diff --git a/rpython/jit/resume/test/test_frontend.py b/rpython/jit/resume/test/test_frontend.py
--- a/rpython/jit/resume/test/test_frontend.py
+++ b/rpython/jit/resume/test/test_frontend.py
@@ -1,10 +1,13 @@
 
 from rpython.jit.tool.oparser import parse
 from rpython.jit.codewriter.jitcode import JitCode
-from rpython.jit.metainterp.history import AbstractDescr, Const, INT, Stats
+from rpython.jit.metainterp.history import AbstractDescr, Const, INT, Stats,\
+     ConstInt
 from rpython.jit.resume.frontend import rebuild_from_resumedata
-from rpython.jit.resume.rescode import ResumeBytecode, TAGBOX
+from rpython.jit.resume.rescode import ResumeBytecode, TAGBOX,\
+     ResumeBytecodeBuilder, TAGCONST, TAGSMALLINT
 from rpython.jit.resume.reader import AbstractResumeReader
+from rpython.jit.resume.test.support import MockStaticData
 from rpython.jit.metainterp.resoperation import rop
 from rpython.jit.codewriter.format import unformat_assembler
 from rpython.jit.codewriter.codewriter import CodeWriter
@@ -80,25 +83,28 @@
 class TestResumeDirect(object):
     def test_box_resume_reader(self):
         jitcode = JitCode("jitcode")
+        jitcode.global_index = 0
         jitcode.setup(num_regs_i=13, num_regs_r=0, num_regs_f=0)
-        resume_loop = parse("""
-        []
-        enter_frame(-1, descr=jitcode1)
-        resume_put(10, 0, 1)
-        resume_put_const(1, 0, 2)
-        leave_frame()
-        """, namespace= {'jitcode1': jitcode})
+        builder = ResumeBytecodeBuilder()
+        builder.enter_frame(-1, jitcode)
+        builder.resume_put(TAGBOX | (100 << 2), 0, 1)
+        builder.resume_put(TAGCONST | (0 << 2), 0, 2)
+        builder.resume_put(TAGSMALLINT | (13 << 2), 0, 3)
+        builder.consts.append(ConstInt(15))
         descr = Descr()
-        descr.rd_resume_bytecode = ResumeBytecode(resume_loop.operations)
-        descr.rd_bytecode_position = 3
+        descr.rd_resume_bytecode = ResumeBytecode(builder.build(),
+                                                  builder.consts)
+        descr.rd_bytecode_position = len(descr.rd_resume_bytecode.opcodes)
         metainterp = MockMetaInterp()
+        metainterp.staticdata = MockStaticData([jitcode], [])
         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
+        assert f.registers_i[1].getint() == 103
         assert isinstance(f.registers_i[2], Const)
-        assert f.registers_i[2].getint() == 1
+        assert f.registers_i[2].getint() == 15
+        assert f.registers_i[3].getint() == 13
 
     def test_nested_call(self):
         jitcode1 = JitCode("jitcode")


More information about the pypy-commit mailing list