Author: Maciej Fijalkowski <fij...@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") _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit