[pypy-commit] pypy resume-refactor: finish this test
fijal
noreply at buildbot.pypy.org
Wed Jan 22 18:23:21 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68849:abb0362b055f
Date: 2014-01-18 13:51 +0100
http://bitbucket.org/pypy/pypy/changeset/abb0362b055f/
Log: finish this test
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1873,7 +1873,6 @@
self.attach_debug_info(op)
return resbox
-
def attach_debug_info(self, op):
if (not we_are_translated() and op is not None
and getattr(self, 'framestack', None)):
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
@@ -201,18 +201,20 @@
return self.consts[pos]
else:
assert tag == TAGVIRTUAL
- virtual = self.virtual_list[pos]
+ virtual = self.virtuals[pos]
virtual_box = self.allocate_struct(virtual)
for fielddescr, encoded_field_pos in virtual.fields.iteritems():
- self.setfield(virtual, fielddescr, encoded_field_pos)
+ self.setfield_gc(virtual_box, encoded_field_pos, fielddescr)
self.cache[encoded_pos] = virtual_box
return virtual_box
def allocate_struct(self, virtual):
return self.metainterp.execute_and_record(rop.NEW, virtual.descr)
- def setfield(self, virtual, fielddescr, encoded_field_pos):
- xxx
+ def setfield_gc(self, box, encoded_field_pos, fielddescr):
+ field_box = self.get_box_value(encoded_field_pos, fielddescr.kind)
+ self.metainterp.execute_and_record(rop.SETFIELD_GC, fielddescr,
+ box, field_box)
def store_int_box(self, res, pos, miframe, i, jitframe_pos):
box = self.get_box_value(jitframe_pos, INT)
@@ -227,7 +229,14 @@
if box is None:
return
miframe.registers_r[i] = box
- res[-1][pos] = box
+ tag, index = self.decode(jitframe_pos)
+ if tag == TAGBOX:
+ res[-1][pos] = box
+ elif tag == TAGVIRTUAL:
+ self.metainterp.history.record(rop.RESUME_PUT,
+ [box, ConstInt(len(res) - 1),
+ ConstInt(pos)], None, None)
+ # we can't have virtual ints
return
xxx
if jitframe_pos in self.cache:
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
@@ -25,9 +25,7 @@
def __init__(self, staticdata):
self.framestack = []
self.staticdata = staticdata
- self.consts = [] # XXX cache?
- self.virtuals = {}
- self.virtual_list = []
+ self.virtuals = []
def rebuild(self, faildescr):
self._rebuild_until(faildescr.rd_resume_bytecode,
@@ -65,17 +63,17 @@
def encode(self, box):
xxx
- def resume_new(self, box, descr):
- xxx
- # XXX make it a list
- v = Virtual(len(self.virtual_list), descr)
- self.virtuals[box] = v
- self.virtual_list.append(v)
+ def resume_new(self, v_pos, descr):
+ v = Virtual(v_pos, descr)
+ if v_pos >= len(self.virtuals):
+ self.virtuals += [None] * (len(self.virtuals) - v_pos + 1)
+ self.virtuals[v_pos] = v
- def resume_setfield_gc(self, box, fieldbox, descr):
+ def resume_setfield_gc(self, pos, fieldpos, descr):
# XXX optimize fields
- xxx
- self.virtuals[box].fields[descr] = self.encode(fieldbox)
+ tag, index = self.decode(pos)
+ assert tag == rescode.TAGVIRTUAL # for now
+ self.virtuals[index].fields[descr] = fieldpos
def resume_clear(self, frame_no, frontend_position):
xxx
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
@@ -5,7 +5,7 @@
ConstInt
from rpython.jit.resume.frontend import rebuild_from_resumedata
from rpython.jit.resume.rescode import ResumeBytecode, TAGBOX,\
- ResumeBytecodeBuilder, TAGCONST, TAGSMALLINT
+ ResumeBytecodeBuilder, TAGCONST, TAGSMALLINT, TAGVIRTUAL
from rpython.jit.resume.reader import AbstractResumeReader
from rpython.jit.resume.test.support import MockStaticData
from rpython.jit.metainterp.resoperation import rop
@@ -44,12 +44,20 @@
class AnyBox(object):
def __eq__(self, other):
return True
-
+
+class EqConstInt(ConstInt):
+ def __eq__(self, other):
+ return self.same_box(other)
+
+class mylist(list):
+ def record(self, opnum, argboxes, resbox, descr):
+ self.append(tuple([opnum, descr] + argboxes))
+
class MockMetaInterp(object):
def __init__(self):
self.cpu = MockCPU()
self.framestack = []
- self.history = []
+ self.history = mylist()
def execute_and_record(self, *args):
self.history.append(args)
@@ -160,12 +168,12 @@
builder.enter_frame(-1, jitcode1)
builder.resume_put(TAGBOX | (42 << 2), 0, 0)
rd1 = builder.build()
- lgt1 = len(rd1.opcodes)
+ lgt1 = len(rd1)
builder = ResumeBytecodeBuilder()
builder.resume_put(TAGBOX | (2 << 2), 0, 1)
rd2 = builder.build()
- lgt2 = len(rd2.opcodes)
+ lgt2 = len(rd2)
descr = Descr()
descr.rd_bytecode_position = lgt2
@@ -173,6 +181,7 @@
b = ResumeBytecode(rd2, [], parent, parent_position=lgt1)
descr.rd_resume_bytecode = b
metainterp = MockMetaInterp()
+ metainterp.staticdata = MockStaticData([jitcode1], [])
metainterp.cpu = MockCPU()
rebuild_from_resumedata(metainterp, "myframe", descr)
f = metainterp.framestack[-1]
@@ -182,23 +191,32 @@
def test_new(self):
jitcode1 = JitCode("jitcode")
+ jitcode1.global_index = 0
jitcode1.setup(num_regs_i=0, num_regs_r=1, num_regs_f=0)
- base = parse("""
- []
- enter_frame(-1, descr=jitcode)
- p0 = resume_new()
- resume_setfield_gc(p0, 13)
- resume_put(p0, 0, 0)
- leave_frame()
- """, namespace={'jitcode':jitcode1})
+ builder = ResumeBytecodeBuilder()
descr = Descr()
- descr.rd_resume_bytecode = ResumeBytecode(base.operations)
- descr.rd_bytecode_position = 4
+ descr.global_descr_index = 0
+ builder.enter_frame(-1, jitcode1)
+ builder.resume_new(0, descr)
+ d2 = Descr()
+ d2.kind = INT
+ d2.global_descr_index = 1
+ builder.resume_setfield_gc(TAGVIRTUAL | (0 << 2),
+ TAGSMALLINT | (1 << 2), d2)
+ builder.resume_put(TAGVIRTUAL | (0 << 2), 0, 0)
+ rd = builder.build()
+ descr = Descr()
+ descr.rd_resume_bytecode = ResumeBytecode(rd, [])
+ descr.rd_bytecode_position = len(rd)
metainterp = MockMetaInterp()
+ metainterp.staticdata = MockStaticData([jitcode1], [descr, d2])
metainterp.cpu = MockCPU()
rebuild_from_resumedata(metainterp, "myframe", descr)
- assert metainterp.history == [(rop.NEW, None),
- (rop.SETFIELD_GC, None, AnyBox())]
+ expected = [(rop.NEW, descr),
+ (rop.SETFIELD_GC, d2, AnyBox(), EqConstInt(1)),
+ (rop.RESUME_PUT, None, AnyBox(), EqConstInt(0),
+ EqConstInt(0))]
+ assert metainterp.history == expected
def test_reconstructing_resume_reader(self):
jitcode1 = JitCode("jitcode")
More information about the pypy-commit
mailing list