Author: fijal Branch: vlen-resume Changeset: r82374:bf67fc4e3ab1 Date: 2016-02-21 18:49 +0100 http://bitbucket.org/pypy/pypy/changeset/bf67fc4e3ab1/
Log: (arigo, fijal, cfbolz) random progress diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py --- a/rpython/jit/metainterp/resume.py +++ b/rpython/jit/metainterp/resume.py @@ -212,7 +212,7 @@ c = len(snapshot.vable_boxes) for snapshot in lst: c += len(snapshot.boxes) - c += 2 * (len(lst) - 1) + 1 + c += 2 * (len(lst) - 1) + 1 + 1 return c def append(self, item): @@ -328,11 +328,12 @@ state.position -= len(snapshot_list[i].boxes) + 2 assert isinstance(topsnapshot, TopSnapshot) - special_boxes_size = (len(topsnapshot.vable_boxes) + + special_boxes_size = (1 + len(topsnapshot.vable_boxes) + 1 + len(topsnapshot.boxes)) assert state.position == special_boxes_size state.position = 0 + state.append(rffi.cast(rffi.SHORT, len(topsnapshot.vable_boxes))) self._number_boxes(topsnapshot.vable_boxes, optimizer, state) n = len(topsnapshot.boxes) assert not (n & 1) @@ -1447,12 +1448,14 @@ info = blackholeinterp.get_current_position_info() self._prepare_next_section(info) - def consume_virtualref_info(self, vrefinfo, end): + def consume_virtualref_info(self, vrefinfo, index): # we have to decode a list of references containing pairs - # [..., virtual, vref, ...] stopping at 'end' + # [..., virtual, vref, ...] and returns the index at the end + size, index = resumecode.numb_next_item(self.numb, index) if vrefinfo is None: - assert end == 0 - return + assert size == 0 + return index + xxxx assert (end & 1) == 0 self.cur_index = 0 for i in range(0, end, 2): @@ -1496,15 +1499,18 @@ load_value_of_type._annspecialcase_ = 'specialize:arg(1)' def consume_vref_and_vable(self, vrefinfo, vinfo, ginfo): + vable_size, index = resumecode.numb_next_item(self.numb, 0) if self.resume_after_guard_not_forced != 2: - end_vref = rffi.cast(lltype.Signed, self.numb.first_snapshot_size) if vinfo is not None: - end_vref = self.consume_vable_info(vinfo) + index = self.consume_vable_info(vinfo, index) if ginfo is not None: end_vref -= 1 xxxxxxxxxxxxxxx - self.consume_virtualref_info(vrefinfo, end_vref) - self.cur_index = rffi.cast(lltype.Signed, self.numb.first_snapshot_size) + index = self.consume_virtualref_info(vrefinfo, index) + else: + index = resumecode.numb_next_n_items(self.numb, vable_size, index) + xxxx + self.cur_index = index def allocate_with_vtable(self, descr=None): from rpython.jit.metainterp.executor import exec_new_with_vtable diff --git a/rpython/jit/metainterp/resumecode.py b/rpython/jit/metainterp/resumecode.py --- a/rpython/jit/metainterp/resumecode.py +++ b/rpython/jit/metainterp/resumecode.py @@ -1,11 +1,11 @@ """ Resume bytecode. It goes as following: - [<virtualizable object> <numb> <numb> <numb>] if vinfo is not None + [<length> <virtualizable object> <numb> <numb> <numb>] if vinfo is not None -OR- - [<ginfo object>] if ginfo is not None + [1 <ginfo object>] if ginfo is not None -OR- - [] if both are None + [0] if both are None [<length> <virtual> <vref> <virtual> <vref>] for virtualrefs @@ -27,6 +27,7 @@ def create_numbering(lst): result = [] for item in lst: + item = rffi.cast(lltype.Signed, item) item *= 2 if item < 0: item = -1 - item diff --git a/rpython/jit/metainterp/test/test_resume.py b/rpython/jit/metainterp/test/test_resume.py --- a/rpython/jit/metainterp/test/test_resume.py +++ b/rpython/jit/metainterp/test/test_resume.py @@ -22,9 +22,12 @@ from rpython.jit.codewriter import heaptracker, longlong from rpython.jit.metainterp.resoperation import ResOperation, InputArgInt,\ InputArgRef, rop +from rpython.jit.metainterp.test.strategies import boxlists from rpython.rlib.debug import debug_start, debug_stop, debug_print,\ have_debug_prints +from hypothesis import given + class Storage: rd_frame_info_list = None rd_numb = None @@ -918,7 +921,7 @@ base = [0, 0, tag(0, TAGBOX), tag(1, TAGINT), tag(1, TAGBOX), tag(0, TAGBOX), tag(2, TAGINT)] - assert unpack_numbering(numb) == [2, tag(3, TAGINT), tag(2, TAGBOX), + assert unpack_numbering(numb) == [0, 2, tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(1, TAGINT)] + base numb2, liveboxes2, v = memo.number(FakeOptimizer(), snap2, frameinfo) @@ -927,7 +930,7 @@ assert liveboxes2 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), b3: tag(2, TAGBOX)} assert liveboxes2 is not liveboxes - assert unpack_numbering(numb2) == [2, tag(3, TAGINT), tag(2, TAGBOX), + assert unpack_numbering(numb2) == [0, 2, tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(3, TAGINT)] + base env3 = [c3, b3, b1, c3] @@ -946,7 +949,7 @@ assert v == 0 assert liveboxes3 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)} - assert unpack_numbering(numb3) == [2, tag(3, TAGINT), tag(4, TAGINT), + assert unpack_numbering(numb3) == [0, 2, tag(3, TAGINT), tag(4, TAGINT), tag(0, TAGBOX), tag(3, TAGINT)] + base # virtual @@ -959,7 +962,7 @@ assert liveboxes4 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), b4: tag(0, TAGVIRTUAL)} - assert unpack_numbering(numb4) == [2, tag(3, TAGINT), tag(0, TAGVIRTUAL), + assert unpack_numbering(numb4) == [0, 2, tag(3, TAGINT), tag(0, TAGVIRTUAL), tag(0, TAGBOX), tag(3, TAGINT)] + base env5 = [b1, b4, b5] @@ -974,11 +977,29 @@ assert liveboxes5 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), b4: tag(0, TAGVIRTUAL), b5: tag(1, TAGVIRTUAL)} assert unpack_numbering(numb5) == [ - tag(0, TAGBOX), tag(0, TAGVIRTUAL), tag(1, TAGVIRTUAL), + 3, tag(0, TAGBOX), tag(0, TAGVIRTUAL), tag(1, TAGVIRTUAL), 0, 2, 1, tag(3, TAGINT), tag(0, TAGVIRTUAL), tag(0, TAGBOX), tag(3, TAGINT) ] + base +@given(boxlists) +def test_ResumeDataLoopMemo_random(lst): + s = TopSnapshot(None, [], lst) + frameinfo = FrameInfo(None, FakeJitCode("foo", 0), 0) + memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) + num, liveboxes, v = memo.number(FakeOptimizer(), s, frameinfo) + l = unpack_numbering(num) + assert l[-1] == 0 + assert l[0] == len(lst) + for i, item in enumerate(lst): + v, tag = untag(l[i + 1]) + if tag == TAGBOX: + assert l[i + 1] == liveboxes[item] + elif tag == TAGCONST: + assert memo.consts[v].getint() == item.getint() + elif tag == TAGINT: + assert v == item.getint() + def test_ResumeDataLoopMemo_number_boxes(): memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) b1, b2 = [InputArgInt(), InputArgInt()] @@ -1062,10 +1083,11 @@ storage = Storage() snapshot = Snapshot(None, [b1, ConstInt(1), b1, b2]) snapshot = Snapshot(snapshot, [ConstInt(2), ConstInt(3)]) - snapshot = Snapshot(snapshot, [b1, b2, b3]) - frameinfo = FrameInfo(FrameInfo(None, FakeJitCode("code1", 21), 22), - FakeJitCode("code2", 31), 32) - storage.rd_snapshot = snapshot + snapshot = Snapshot(snapshot, [b1, b2, b3]) + top_snapshot = TopSnapshot(snapshot, [], []) + frameinfo = FrameInfo(FrameInfo(FrameInfo(None, FakeJitCode("code1", 21), 22), + FakeJitCode("code2", 31), 32), FakeJitCode("code3", 41), 42) + storage.rd_snapshot = top_snapshot storage.rd_frame_info_list = frameinfo return storage @@ -1078,6 +1100,8 @@ assert storage.rd_snapshot is None cpu = MyCPU([]) reader = ResumeDataDirectReader(MyMetaInterp(cpu), storage, "deadframe") + reader.consume_vref_and_vable(None, None, None) + reader.cur_index += 2 # framestack _next_section(reader, sys.maxint, 2**16, -65) reader.cur_index += 2 # framestack _next_section(reader, 2, 3) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit