[pypy-commit] pypy vlen-resume: (arigo, fijal, cfbolz) random progress

fijal pypy.commits at gmail.com
Sun Feb 21 12:50:09 EST 2016


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
 
+ at 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)


More information about the pypy-commit mailing list