[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