Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68722:fa61ebe921c8
Date: 2014-01-17 16:34 +0100
http://bitbucket.org/pypy/pypy/changeset/fa61ebe921c8/
Log: (fijal, rguillebert) make resume_new tests pass
diff --git a/rpython/jit/codewriter/assembler.py
b/rpython/jit/codewriter/assembler.py
--- a/rpython/jit/codewriter/assembler.py
+++ b/rpython/jit/codewriter/assembler.py
@@ -170,6 +170,7 @@
elif isinstance(x, AbstractDescr):
if x not in self._descr_dict:
self._descr_dict[x] = len(self.descrs)
+ x.global_descr_index = len(self.descrs)
self.descrs.append(x)
if isinstance(x, SwitchDictDescr):
self.switchdictdescrs.append(x)
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
@@ -2,7 +2,7 @@
from rpython.jit.metainterp.resoperation import rop, ResOperation
from rpython.jit.metainterp.history import ConstInt, Box, Const
from rpython.jit.resume.rescode import ResumeBytecodeBuilder, TAGBOX,\
- ResumeBytecode
+ ResumeBytecode, TAGVIRTUAL
# if op.getopnum() == rop.ENTER_FRAME:
# descr = op.getdescr()
@@ -111,34 +111,40 @@
if box not in self.current_attachment:
self.current_attachment[box] = loc_pos
+ def get_box_pos(self, box):
+ if box in self.virtuals:
+ return TAGVIRTUAL | (self.virtuals[box] << 2)
+ if isinstance(box, Const):
+ return self.builder.encode_const(box)
+ try:
+ loc = self.regalloc.loc(box,
must_exist=True).get_jitframe_position()
+ pos = self.builder.encode(TAGBOX, loc)
+ self.current_attachment[box] = pos
+ return pos
+ except KeyError:
+ raise
+
def process(self, op):
if op.getopnum() == rop.ENTER_FRAME:
self.builder.enter_frame(op.getarg(0).getint(), op.getdescr())
elif op.getopnum() == rop.RESUME_PUT:
frame_pos = op.getarg(1).getint()
pos_in_frame = op.getarg(2).getint()
- box = op.getarg(0)
- if box in self.virtuals:
- xxx
- if isinstance(box, Const):
- pos = self.builder.encode_const(box)
- self.builder.resume_put(pos, frame_pos, pos_in_frame)
- return
- try:
- loc = self.regalloc.loc(box,
must_exist=True).get_jitframe_position()
- pos = self.builder.encode(TAGBOX, loc)
- self.builder.resume_put(pos, frame_pos, pos_in_frame)
- except KeyError:
- xxx
- self.current_attachment[box] = pos
- self.frontend_pos[box] = (frame_pos, pos_in_frame)
+ pos = self.get_box_pos(op.getarg(0))
+ self.builder.resume_put(pos, frame_pos, pos_in_frame)
+ if pos & TAGBOX:
+ self.frontend_pos[op.getarg(0)] = (frame_pos, pos_in_frame)
elif op.getopnum() == rop.LEAVE_FRAME:
self.builder.leave_frame()
elif op.getopnum() == rop.RESUME_NEW:
v_pos = len(self.virtuals)
self.virtuals[op.result] = v_pos
- XXX
self.builder.resume_new(v_pos, op.getdescr())
+ elif op.getopnum() == rop.RESUME_SETFIELD_GC:
+ structpos = self.get_box_pos(op.getarg(0))
+ fieldpos = self.get_box_pos(op.getarg(1))
+ descr = op.getdescr()
+ self.builder.resume_setfield_gc(structpos, fieldpos, descr)
else:
xxx
return
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
@@ -71,6 +71,7 @@
xxx
def resume_new(self, box, descr):
+ xxx
# XXX make it a list
v = Virtual(len(self.virtual_list), descr)
self.virtuals[box] = v
@@ -78,6 +79,7 @@
def resume_setfield_gc(self, box, fieldbox, descr):
# XXX optimize fields
+ xxx
self.virtuals[box].fields[descr] = self.encode(fieldbox)
def resume_clear(self, frame_no, frontend_position):
@@ -121,6 +123,18 @@
pos_in_frame = self.read(pos + 4)
self.resume_put(encoded, frame_pos, pos_in_frame)
pos += 5
+ elif op == rescode.RESUME_NEW:
+ tag, v_pos = self.decode(self.read_short(pos + 1))
+ assert tag == rescode.TAGVIRTUAL
+ descr = self.staticdata.opcode_descrs[self.read_short(pos + 3)]
+ self.resume_new(v_pos, descr)
+ pos += 5
+ elif op == rescode.RESUME_SETFIELD_GC:
+ structpos = self.read_short(pos + 1)
+ fieldpos = self.read_short(pos + 3)
+ descr = self.staticdata.opcode_descrs[self.read_short(pos + 5)]
+ self.resume_setfield_gc(structpos, fieldpos, descr)
+ pos += 7
else:
xxx
self.bytecode = None
@@ -141,5 +155,14 @@
self.l.append("resume_put (%d, %d) %d %d" % (tag, index, frame_pos,
pos_in_frame))
+ def resume_new(self, v_pos, descr):
+ self.l.append("%d = resume_new %d" % (v_pos, descr.global_descr_index))
+
+ def resume_setfield_gc(self, structpos, fieldpos, descr):
+ stag, sindex = self.decode(structpos)
+ ftag, findex = self.decode(fieldpos)
+ self.l.append("resume_setfield_gc (%d, %d) (%d, %d) %d" % (
+ stag, sindex, ftag, findex, descr.global_descr_index))
+
def finish(self):
return "\n".join(self.l)
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
@@ -1,7 +1,8 @@
from rpython.jit.metainterp.history import ConstInt
-UNUSED, ENTER_FRAME, LEAVE_FRAME, RESUME_PUT = range(4)
+(UNUSED, ENTER_FRAME, LEAVE_FRAME, RESUME_PUT,
+ RESUME_NEW, RESUME_SETFIELD_GC) = range(6)
TAGCONST = 0x0
TAGVIRTUAL = 0x2
@@ -64,3 +65,14 @@
self.write_short(pos)
self.write(frame_pos)
self.write(pos_in_frame)
+
+ def resume_new(self, v_pos, descr):
+ self.write(RESUME_NEW)
+ self.write_short(self.encode(TAGVIRTUAL, v_pos))
+ self.write_short(descr.global_descr_index)
+
+ def resume_setfield_gc(self, structpos, fieldpos, descr):
+ self.write(RESUME_SETFIELD_GC)
+ self.write_short(structpos)
+ self.write_short(fieldpos)
+ self.write_short(descr.global_descr_index)
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
@@ -20,8 +20,9 @@
return 'MockJitCode(%d)' % self.no
class MockStaticData(object):
- def __init__(self, *jitcodes):
- self.alljitcodes = list(jitcodes)
+ 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()])
@@ -46,7 +47,7 @@
looptoken)
descr = loop.operations[3].getdescr()
assert descr.rd_bytecode_position == 15
- staticdata = MockStaticData(None, jitcode)
+ staticdata = MockStaticData([None, jitcode], [])
res = descr.rd_resume_bytecode.dump(staticdata,
descr.rd_bytecode_position)
expected_resume = preparse("""
@@ -62,7 +63,9 @@
jitcode.setup(num_regs_i=1, num_regs_r=0, num_regs_f=0)
S = lltype.GcStruct('S', ('field', lltype.Signed))
structdescr = self.cpu.sizeof(S)
+ structdescr.global_descr_index = 0
fielddescr = self.cpu.fielddescrof(S, 'field')
+ fielddescr.global_descr_index = 1
namespace = {'jitcode':jitcode, 'structdescr':structdescr,
'fielddescr':fielddescr}
loop = parse("""
@@ -79,18 +82,17 @@
looptoken = JitCellToken()
self.cpu.compile_loop(None, loop.inputargs, loop.operations,
looptoken)
- xxx
+ staticdata = MockStaticData([None, jitcode], [structdescr, fielddescr])
+ descr = loop.operations[5].getdescr()
+ res = descr.rd_resume_bytecode.dump(staticdata,
+ descr.rd_bytecode_position)
expected_resume = preparse("""
- enter_frame -1 frame-1
- p0 = resume_new(descr=structdescr)
- resume_setfield_gc(p0, i0, descr=fielddescr)
- resume_put(p0, 0, 0)
- leave_frame()
- """, namespace=namespace)
- descr = loop.operations[-3].getdescr()
- assert descr.rd_bytecode_position == 4
- equaloplists(descr.rd_resume_bytecode.opcodes,
- expected_resume.operations)
+ enter_frame -1 name
+ 0 = resume_new 0
+ resume_setfield_gc (2, 0) (3, 28) 1
+ resume_put (2, 0) 0 0
+ """)
+ assert res == expected_resume
def test_spill(self):
jitcode = JitCode("name")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit