Author: fijal
Branch: compress-numbering
Changeset: r80879:d42389c1c4d6
Date: 2015-11-24 11:40 +0200
http://bitbucket.org/pypy/pypy/changeset/d42389c1c4d6/

Log:    fix parts of test resume

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
@@ -208,6 +208,13 @@
 UNINITIALIZED = tag(-2, TAGCONST)   # used for uninitialized string characters
 
 
+class NumberingState(object):
+    def __init__(self):
+        self.liveboxes = {}
+        self.current = []
+        self.n = 0
+        self.v = 0
+
 class ResumeDataLoopMemo(object):
 
     def __init__(self, metainterp_sd):
@@ -259,9 +266,13 @@
 
     # env numbering
 
-    def _number_boxes(self, boxes, liveboxes, optimizer, v, n):
+    def _number_boxes(self, boxes, optimizer, state):
+        """ Number boxes from one snapshot
+        """
+        n = state.n
+        v = state.v
+        liveboxes = state.liveboxes
         length = len(boxes)
-        current = []
         for i in range(length):
             box = boxes[i]
             box = optimizer.get_box_replacement(box)
@@ -285,57 +296,48 @@
                     tagged = tag(n, TAGBOX)
                     n += 1
                 liveboxes[box] = tagged
-            current.append(tagged)
-        return v, n, current
+            state.current.append(tagged)
+        state.n = n
+        state.v = v
 
-    def _get_prev_snapshot(self, snapshot):
-        cur_snapshot = snapshot
-        while True:
-            try:
-                return self.numberings[cur_snapshot], cur_snapshot
-            except KeyError:
-                pass
-            cur_snapshot = cur_snapshot.prev
-            if not cur_snapshot:
-                return (lltype.nullptr(resumecode.NUMBERING), 0, {}, 0), None
+#    def _get_prev_snapshot(self, snapshot):
+#        cur_snapshot = snapshot
+#        while True:
+#            try:
+#                return self.numberings[cur_snapshot], cur_snapshot
+#            except KeyError:
+#                pass
+#            cur_snapshot = cur_snapshot.prev
+#            if not cur_snapshot:
+#                return (lltype.nullptr(resumecode.NUMBERING), 0, {}, 0), None
 
     def number(self, optimizer, snapshot, frameinfo):
-        # find the parent
+        # flatten the list
+        cur = snapshot
+        snapshot_list = []
+        framestack_list = []
+        while cur:
+            if cur is not snapshot:
+                framestack_list.append(frameinfo)
+                frameinfo = frameinfo.prev
+            snapshot_list.append(cur)
+            cur = cur.prev
+        snapshot_list.reverse()
+        framestack_list.reverse()
+        state = NumberingState()
 
-        p = self._get_prev_snapshot(snapshot)
-        (prev_numb, prev_numb_index, liveboxes, v), s = p
-        n = len(liveboxes) - v
-        first = True
-        all_lists = []
-        total_lgt = 0
-        cur_snapshot = snapshot
-        liveboxes_to_save = []
-        while cur_snapshot != s:
-            liveboxes_to_save.append((liveboxes.copy(), v))
-            v, n, current = self._number_boxes(cur_snapshot.boxes, liveboxes, 
optimizer,
-                v, n)
-            cur_snapshot = cur_snapshot.prev
-            if first:
-                first = False
-            else:
+        for i in range(len(snapshot_list)):
+            self._number_boxes(snapshot_list[i].boxes, optimizer, state)
+            if i != 0:
+                frameinfo = framestack_list[i - 1]
                 jitcode_pos, pc = unpack_uint(frameinfo.packed_jitcode_pc)
-                current.append(rffi.cast(rffi.USHORT, jitcode_pos))
-                current.append(rffi.cast(rffi.USHORT, pc))
-            lst = resumecode.create_numbering(current)
-            total_lgt += len(lst)
-            all_lists.append(lst)
-        numb = lltype.malloc(resumecode.NUMBERING, total_lgt)
-        numb.prev = prev_numb
-        numb.prev_index = rffi.cast(rffi.USHORT, prev_numb_index)
-        index = 0
-        for i in range(len(all_lists)):
-            lst = all_lists[i]
-            liveboxes_snapshot, v = liveboxes_to_save[i]
-            self.numberings[snapshot] = (numb, index, liveboxes_snapshot, v)
-            resumecode.copy_from_list_to_numb(lst, numb, index)
-            index += len(lst)
-            snapshot = snapshot.prev
-        return numb, liveboxes, v
+                state.current.append(rffi.cast(rffi.USHORT, jitcode_pos))
+                state.current.append(rffi.cast(rffi.USHORT, pc))
+
+        numb = resumecode.create_numbering(state.current,
+            lltype.nullptr(resumecode.NUMBERING), 0)
+
+        return numb, state.liveboxes, state.v
         
     def forget_numberings(self):
         # XXX ideally clear only the affected numberings
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
@@ -18,22 +18,24 @@
                             ('code', lltype.Array(rffi.UCHAR)))
 NUMBERINGP.TO.become(NUMBERING)
 
-def create_numbering(lst):
+def create_numbering(lst, prev, prev_index):
        count = 0
        for item in lst:
                if item > 127:
                        count += 1
                count += 1
-       numb = [rffi.cast(rffi.UCHAR, 0)] * count
+       numb = lltype.malloc(NUMBERING, count)
+       numb.prev = prev
+       numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
        index = 0
        for item in lst:
                if item <= 128:
-                       numb[index] = rffi.cast(rffi.UCHAR, item)
+                       numb.code[index] = rffi.cast(rffi.UCHAR, item)
                        index += 1
                else:
                        assert (item >> 8) <= 127
-                       numb[index] = rffi.cast(rffi.UCHAR, (item >> 8) | 0x80)
-                       numb[index + 1] = rffi.cast(rffi.UCHAR, item & 0xff)
+                       numb.code[index] = rffi.cast(rffi.UCHAR, (item >> 8) | 
0x80)
+                       numb.code[index + 1] = rffi.cast(rffi.UCHAR, item & 
0xff)
                        index += 2
        return numb
 
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
@@ -11,6 +11,7 @@
      VUniPlainInfo, VUniConcatInfo, VUniSliceInfo, Snapshot, FrameInfo,\
      capture_resumedata, ResumeDataLoopMemo, UNASSIGNEDVIRTUAL, INT,\
      annlowlevel, PENDINGFIELDSP, unpack_uint
+from rpython.jit.metainterp.resumecode import unpack_numbering
 from rpython.jit.metainterp.optimizeopt import info
 from rpython.jit.metainterp.history import ConstInt, Const, AbstractDescr
 from rpython.jit.metainterp.history import ConstPtr, ConstFloat
@@ -926,21 +927,19 @@
 
     assert liveboxes == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
                          b3: tag(2, TAGBOX)}
-    assert list(numb.nums) == [tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX),
-                               tag(1, TAGINT)]
-    assert list(numb.prev.nums) == [tag(0, TAGBOX), tag(1, TAGINT),
-                                    tag(1, TAGBOX),
-                                    tag(0, TAGBOX), tag(2, TAGINT)]
-    assert not numb.prev.prev
+    base = [tag(0, TAGBOX), tag(1, TAGINT), tag(1, TAGBOX), tag(0, TAGBOX), 
tag(2, TAGINT)]
 
-    numb2, liveboxes2, v = memo.number(FakeOptimizer(), snap2)
+    assert unpack_numbering(numb) == base + [
+          tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(1, TAGINT), 0, 0]
+
+    numb2, liveboxes2, v = memo.number(FakeOptimizer(), snap2, frameinfo)
     assert v == 0
     
     assert liveboxes2 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
                          b3: tag(2, TAGBOX)}
     assert liveboxes2 is not liveboxes
-    assert list(numb2.nums) == [tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX),
-                                tag(3, TAGINT)]
+    assert unpack_numbering(numb2) == base + [
+         tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
     assert numb2.prev == numb.prev
 
     env3 = [c3, b3, b1, c3]
@@ -955,41 +954,39 @@
 
     # renamed
     b3.set_forwarded(c4)
-    numb3, liveboxes3, v = memo.number(FakeOptimizer(), snap3)
+    numb3, liveboxes3, v = memo.number(FakeOptimizer(), snap3, frameinfo)
     assert v == 0
     
     assert liveboxes3 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)}
-    assert list(numb3.nums) == [tag(3, TAGINT), tag(4, TAGINT), tag(0, TAGBOX),
-                                tag(3, TAGINT)]
-    assert numb3.prev == numb.prev
+    assert unpack_numbering(numb3) == base + [tag(3, TAGINT), tag(4, TAGINT), 
tag(0, TAGBOX),
+                                tag(3, TAGINT), 0, 0]
 
     # virtual
     env4 = [c3, b4, b1, c3]
     snap4 = Snapshot(snap, env4)
 
     b4.set_forwarded(FakeVirtualInfo(True))
-    numb4, liveboxes4, v = memo.number(FakeOptimizer(), snap4)
+    numb4, liveboxes4, v = memo.number(FakeOptimizer(), snap4, frameinfo)
     assert v == 1
     
     assert liveboxes4 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
                           b4: tag(0, TAGVIRTUAL)}
-    assert list(numb4.nums) == [tag(3, TAGINT), tag(0, TAGVIRTUAL),
-                                tag(0, TAGBOX), tag(3, TAGINT)]
-    assert numb4.prev == numb.prev
+    assert unpack_numbering(numb4) == base + [tag(3, TAGINT), tag(0, 
TAGVIRTUAL),
+                                tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
 
     env5 = [b1, b4, b5]
     snap5 = Snapshot(snap4, env5)
 
     b4.set_forwarded(FakeVirtualInfo(True))
     b5.set_forwarded(FakeVirtualInfo(True))
-    numb5, liveboxes5, v = memo.number(FakeOptimizer(), snap5)
+    frameinfo = FrameInfo(frameinfo, FakeJitCode("foo", 2), 1)
+    numb5, liveboxes5, v = memo.number(FakeOptimizer(), snap5, frameinfo)
     assert v == 2
     
     assert liveboxes5 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
                           b4: tag(0, TAGVIRTUAL), b5: tag(1, TAGVIRTUAL)}
-    assert list(numb5.nums) == [tag(0, TAGBOX), tag(0, TAGVIRTUAL),
-                                                tag(1, TAGVIRTUAL)]
-    assert numb5.prev == numb4
+    assert unpack_numbering(numb5) == unpack_numbering(numb4) + [tag(0, 
TAGBOX), tag(0, TAGVIRTUAL),
+                                                tag(1, TAGVIRTUAL), 2, 1]
 
 def test_ResumeDataLoopMemo_number_boxes():
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to