Author: fijal
Branch: compress-numbering
Changeset: r80926:2a006fba78d9
Date: 2015-11-25 09:54 +0200
http://bitbucket.org/pypy/pypy/changeset/2a006fba78d9/

Log:    write the snapshots in a better order. complicates code, but will
        probably be beneficial

diff --git a/lib_pypy/cffi/__init__.py b/lib_pypy/cffi/__init__.py
--- a/lib_pypy/cffi/__init__.py
+++ b/lib_pypy/cffi/__init__.py
@@ -4,8 +4,8 @@
 from .api import FFI, CDefError, FFIError
 from .ffiplatform import VerificationError, VerificationMissing
 
-__version__ = "1.3.0"
-__version_info__ = (1, 3, 0)
+__version__ = "1.3.1"
+__version_info__ = (1, 3, 1)
 
 # The verifier module file names are based on the CRC32 of a string that
 # contains the following version number.  It may be older than __version__
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
@@ -202,19 +202,31 @@
 TAGBOX      = 2
 TAGVIRTUAL  = 3
 
-UNASSIGNED = tag(-1 << 13, TAGBOX)
-UNASSIGNEDVIRTUAL = tag(-1 << 13, TAGVIRTUAL)
-NULLREF = tag(0, TAGCONST)
-UNINITIALIZED = tag(1, TAGCONST)   # used for uninitialized string characters
-TAG_CONST_OFFSET = 2
+UNASSIGNED = tag(-1, TAGBOX)
+UNASSIGNEDVIRTUAL = tag(-1, TAGVIRTUAL)
+NULLREF = tag(-1, TAGCONST)
+UNINITIALIZED = tag(2, TAGCONST)   # used for uninitialized string characters
+TAG_CONST_OFFSET = 0
 
 class NumberingState(object):
-    def __init__(self):
+    def __init__(self, snapshot_list):
         self.liveboxes = {}
-        self.current = []
+        self.current = [None] * self.count_boxes(snapshot_list)
+        self.position = len(self.current)
         self.n = 0
         self.v = 0
 
+    def count_boxes(self, lst):
+        c = 0
+        for snapshot in lst:
+            c += len(snapshot.boxes)
+        c += 2 * (len(lst) - 1)
+        return c
+
+    def append(self, item):
+        self.current[self.position] = item
+        self.position += 1
+
 class ResumeDataLoopMemo(object):
 
     def __init__(self, metainterp_sd):
@@ -273,6 +285,7 @@
         v = state.v
         liveboxes = state.liveboxes
         length = len(boxes)
+        state.position -= length
         for i in range(length):
             box = boxes[i]
             box = optimizer.get_box_replacement(box)
@@ -296,9 +309,10 @@
                     tagged = tag(n, TAGBOX)
                     n += 1
                 liveboxes[box] = tagged
-            state.current.append(tagged)
+            state.append(tagged)
         state.n = n
         state.v = v
+        state.position -= length
 
 #    def _get_prev_snapshot(self, snapshot):
 #        cur_snapshot = snapshot
@@ -313,26 +327,28 @@
 
     def number(self, optimizer, snapshot, frameinfo):
         # flatten the list
-        cur = snapshot
-        snapshot_list = []
+        vref_snapshot = snapshot
+        cur = snapshot.prev
+        snapshot_list = [vref_snapshot]
         framestack_list = []
         while cur:
-            if cur is not snapshot:
-                framestack_list.append(frameinfo)
-                frameinfo = frameinfo.prev
+            framestack_list.append(frameinfo)
+            frameinfo = frameinfo.prev
             snapshot_list.append(cur)
             cur = cur.prev
-        snapshot_list.reverse()
-        framestack_list.reverse()
-        state = NumberingState()
+        state = NumberingState(snapshot_list)
 
-        for i in range(len(snapshot_list)):
+        # we want to number snapshots starting from the back, but ending
+        # with a forward list
+        for i in range(len(snapshot_list) - 1, -1, -1):
             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)
-                state.current.append(rffi.cast(rffi.USHORT, jitcode_pos))
-                state.current.append(rffi.cast(rffi.USHORT, pc))
+                state.position -= 2
+                state.append(rffi.cast(rffi.USHORT, jitcode_pos))
+                state.append(rffi.cast(rffi.USHORT, pc))
+                state.position -= 2
 
         numb = resumecode.create_numbering(state.current,
             lltype.nullptr(resumecode.NUMBERING), 0)
@@ -1090,6 +1106,7 @@
 
 def rebuild_from_resumedata(metainterp, storage, deadframe,
                             virtualizable_info, greenfield_info):
+    xxx
     resumereader = ResumeDataBoxReader(storage, deadframe, metainterp)
     boxes = resumereader.consume_vref_and_vable_boxes(virtualizable_info,
                                                       greenfield_info)
@@ -1480,6 +1497,7 @@
     load_value_of_type._annspecialcase_ = 'specialize:arg(1)'
 
     def consume_vref_and_vable(self, vrefinfo, vinfo, ginfo):
+        xxx
         numb = self.cur_numb
         self.cur_numb = numb.prev
         if self.resume_after_guard_not_forced != 2:
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
@@ -15,49 +15,78 @@
 NUMBERING = lltype.GcStruct('Numbering',
                             ('prev', NUMBERINGP),
                             ('prev_index', rffi.USHORT),
-                            ('code', lltype.Array(rffi.UCHAR)))
+                            ('code', lltype.Array(rffi.SHORT)))
 NUMBERINGP.TO.become(NUMBERING)
 NULL_NUMBER = lltype.nullptr(NUMBERING)
 
 def create_numbering(lst, prev, prev_index):
-       count = 0
-       for item in lst:
-               if item > 127:
-                       count += 1
-               count += 1
-       numb = lltype.malloc(NUMBERING, count)
-       numb.prev = prev
-       numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
-       index = 0
-       for item in lst:
-               assert item >= 0
-               if item <= 128:
-                       numb.code[index] = rffi.cast(rffi.UCHAR, item)
-                       index += 1
-               else:
-                       assert (item >> 8) <= 127
-                       numb.code[index] = rffi.cast(rffi.UCHAR, (item >> 8) | 
0x80)
-                       numb.code[index + 1] = rffi.cast(rffi.UCHAR, item & 
0xff)
-                       index += 2
-       return numb
+    numb = lltype.malloc(NUMBERING, len(lst))
+    for i in range(len(lst)):
+        numb.code[i] = rffi.cast(rffi.SHORT, lst[i])
+    numb.prev = prev
+    numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
+    return numb
+
+def _create_numbering(lst, prev, prev_index):
+    count = 0
+    for item in lst:
+        if item < 0:
+            if item < -63:
+                count += 1
+        if item > 127:
+            count += 1
+        count += 1
+    numb = lltype.malloc(NUMBERING, count)
+    numb.prev = prev
+    numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
+    index = 0
+    for item in lst:
+        if 0 <= item <= 128:
+            numb.code[index] = rffi.cast(rffi.UCHAR, item)
+            index += 1
+        else:
+            assert (item >> 8) <= 63
+            if item < 0:
+                item = -item
+                if item <= 63:
+                    numb.code[index] = rffi.cast(rffi.UCHAR, item | 0x40)
+                    index += 1
+                else:
+                    numb.code[index] = rffi.cast(rffi.UCHAR, (item >> 8) | 
0x80 | 0x40)
+                    numb.code[index + 1] = rffi.cast(rffi.UCHAR, item & 0xff)
+                    index += 2
+            else:
+                numb.code[index] = rffi.cast(rffi.UCHAR, (item >> 8) | 0x80)
+                numb.code[index + 1] = rffi.cast(rffi.UCHAR, item & 0xff)
+                index += 2
+    return numb
 
 def copy_from_list_to_numb(lst, numb, index):
-       i = 0
-       while i < len(lst):
-               numb.code[i + index] = lst[i]
-               i += 1
+    i = 0
+    while i < len(lst):
+        numb.code[i + index] = lst[i]
+        i += 1
 
 def numb_next_item(numb, index):
-       one = rffi.cast(lltype.Signed, numb.code[index])
-       if one & 0x80:
-               two = rffi.cast(lltype.Signed, numb.code[index + 1])
-               return ((one & 0x7f) << 8) | two, index + 2
-       return one, index + 1
+    return rffi.cast(lltype.Signed, numb.code[index]), index + 1
+
+def _numb_next_item(numb, index):
+    one = rffi.cast(lltype.Signed, numb.code[index])
+    if one & 0x40:
+        if one & 0x80:
+            two = rffi.cast(lltype.Signed, numb.code[index + 1])
+            return -(((one & ~(0x80 | 0x40)) << 8) | two), index + 2
+        else:
+            return -(one & (~0x40)), index + 1
+    if one & 0x80:
+        two = rffi.cast(lltype.Signed, numb.code[index + 1])
+        return ((one & 0x7f) << 8) | two, index + 2
+    return one, index + 1
 
 def unpack_numbering(numb):
-       l = []
-       i = 0
-       while i < len(numb.code):
-               next, i = numb_next_item(numb, i)
-               l.append(next)
-       return l
+    l = []
+    i = 0
+    while i < len(numb.code):
+        next, i = numb_next_item(numb, i)
+        l.append(next)
+    return l
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
@@ -336,7 +336,7 @@
 def test_simple_read_tagged_ints():
     storage = Storage()
     storage.rd_consts = []
-    numb = Numbering(None, [tag(100, TAGINT)])
+    numb = Numbering([tag(100, TAGINT)])
     storage.rd_numb = numb
     #
     cpu = MyCPU([])
@@ -552,17 +552,6 @@
     assert jitcode_pos == 42
     assert pc == 3
 
-def test_Numbering_create():
-    l = [rffi.r_short(1), rffi.r_short(2)]
-    numb = Numbering(None, l)
-    assert not numb.prev
-    assert list(numb.nums) == l
-
-    l1 = [rffi.r_short(3)]
-    numb1 = Numbering(numb, l1)
-    assert numb1.prev == numb
-    assert list(numb1.nums) == l1
-
 def test_capture_resumedata():
     b1, b2, b3 = [InputArgInt(), InputArgRef(), InputArgInt()]
     c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]
@@ -869,7 +858,7 @@
     tagged = memo.getconst(const)
     index, tagbits = untag(tagged)
     assert tagbits == TAGCONST
-    assert memo.consts[index] is const
+    assert memo.consts[index - TAG_CONST_OFFSET] is const
     tagged = memo.getconst(ConstInt(50000))
     index2, tagbits = untag(tagged)
     assert tagbits == TAGCONST
@@ -887,7 +876,7 @@
     tagged = memo.getconst(const)
     index, tagbits = untag(tagged)
     assert tagbits == TAGCONST
-    assert memo.consts[index] is const    
+    assert memo.consts[index - TAG_CONST_OFFSET] is const    
     tagged = memo.getconst(cpu.ts.ConstRef(demo55o))
     index2, tagbits = untag(tagged)
     assert tagbits == TAGCONST
@@ -905,7 +894,7 @@
     tagged = memo.getconst(const)
     index, tagbits = untag(tagged)
     assert tagbits == TAGCONST
-    assert memo.consts[index] is const
+    assert memo.consts[index - TAG_CONST_OFFSET] is const
 
 def test_ResumeDataLoopMemo_number():
     b1, b2, b3, b4, b5 = [InputArgInt(), InputArgInt(), InputArgInt(),
@@ -929,8 +918,8 @@
                          b3: tag(2, TAGBOX)}
     base = [tag(0, TAGBOX), tag(1, TAGINT), tag(1, TAGBOX), tag(0, TAGBOX), 
tag(2, TAGINT)]
 
-    assert unpack_numbering(numb) == base + [
-          tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(1, TAGINT), 0, 0]
+    assert unpack_numbering(numb) == [
+          tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(1, TAGINT), 0, 
0] + base
 
     numb2, liveboxes2, v = memo.number(FakeOptimizer(), snap2, frameinfo)
     assert v == 0
@@ -938,8 +927,8 @@
     assert liveboxes2 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
                          b3: tag(2, TAGBOX)}
     assert liveboxes2 is not liveboxes
-    assert unpack_numbering(numb2) == base + [
-         tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
+    assert unpack_numbering(numb2) == [
+         tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(3, TAGINT), 0, 0] 
+ base
     assert numb2.prev == numb.prev
 
     env3 = [c3, b3, b1, c3]
@@ -958,8 +947,8 @@
     assert v == 0
     
     assert liveboxes3 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)}
-    assert unpack_numbering(numb3) == base + [tag(3, TAGINT), tag(4, TAGINT), 
tag(0, TAGBOX),
-                                tag(3, TAGINT), 0, 0]
+    assert unpack_numbering(numb3) == [tag(3, TAGINT), tag(4, TAGINT), tag(0, 
TAGBOX),
+                                tag(3, TAGINT), 0, 0] + base
 
     # virtual
     env4 = [c3, b4, b1, c3]
@@ -971,8 +960,8 @@
     
     assert liveboxes4 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
                           b4: tag(0, TAGVIRTUAL)}
-    assert unpack_numbering(numb4) == base + [tag(3, TAGINT), tag(0, 
TAGVIRTUAL),
-                                tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
+    assert unpack_numbering(numb4) == [tag(3, TAGINT), tag(0, TAGVIRTUAL),
+                                tag(0, TAGBOX), tag(3, TAGINT), 0, 0] + base
 
     env5 = [b1, b4, b5]
     snap5 = Snapshot(snap4, env5)
@@ -985,8 +974,8 @@
     
     assert liveboxes5 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
                           b4: tag(0, TAGVIRTUAL), b5: tag(1, TAGVIRTUAL)}
-    assert unpack_numbering(numb5) == unpack_numbering(numb4) + [tag(0, 
TAGBOX), tag(0, TAGVIRTUAL),
-                                                tag(1, TAGVIRTUAL), 2, 1]
+    assert unpack_numbering(numb5) == [tag(0, TAGBOX), tag(0, TAGVIRTUAL),
+                           tag(1, TAGVIRTUAL), 2, 1] + unpack_numbering(numb4)
 
 def test_ResumeDataLoopMemo_number_boxes():
     memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
@@ -1087,9 +1076,10 @@
     assert storage.rd_snapshot is None
     cpu = MyCPU([])
     reader = ResumeDataDirectReader(MyMetaInterp(cpu), storage, "deadframe")
+    _next_section(reader, sys.maxint, 1, sys.maxint, 2**16)
+    _next_section(reader, 2, 3)
+    reader.cur_index += 2 # framestack
     _next_section(reader, sys.maxint, 2**16, -65)
-    _next_section(reader, 2, 3)
-    _next_section(reader, sys.maxint, 1, sys.maxint, 2**16)
 
 
 def test_virtual_adder_memo_const_sharing():
@@ -1125,8 +1115,8 @@
                 return True
         class MyInfo:
             @staticmethod
-            def enumerate_vars(callback_i, callback_r, callback_f, _):
-                for index, tagged in enumerate(self.cur_numb.nums):
+            def enumerate_vars(callback_i, callback_r, callback_f, _, index):
+                for tagged in self.cur_numb.nums:
                     _, tag = untag(tagged)
                     if tag == TAGVIRTUAL:
                         kind = REF
@@ -1134,11 +1124,11 @@
                         kind = Whatever()
                     box = self.decode_box(tagged, kind)
                     if box.type == INT:
-                        callback_i(index, index)
+                        index = callback_i(index, index)
                     elif box.type == REF:
-                        callback_r(index, index)
+                        index = callback_r(index, index)
                     elif box.type == FLOAT:
-                        callback_f(index, index)
+                        index = callback_f(index, index)
                     else:
                         assert 0
         self._prepare_next_section(MyInfo())
diff --git a/rpython/jit/metainterp/test/test_resumecode.py 
b/rpython/jit/metainterp/test/test_resumecode.py
--- a/rpython/jit/metainterp/test/test_resumecode.py
+++ b/rpython/jit/metainterp/test/test_resumecode.py
@@ -1,18 +1,16 @@
 
-from rpython.jit.metainterp.resumecode import NUMBERING
+from rpython.jit.metainterp.resumecode import NUMBERING, NULL_NUMBER
 from rpython.jit.metainterp.resumecode import create_numbering,\
-       unpack_numbering, copy_from_list_to_numb
+    unpack_numbering, copy_from_list_to_numb
 from rpython.rtyper.lltypesystem import lltype
 
 def test_pack_unpack():
-       examples = [
-               [1, 2, 3, 4, 257, 10000, 13, 15],
-               [1, 2, 3, 4],
-               range(1, 10, 2),
-               [13000, 12000, 10000, 256, 255, 254, 257]
-       ]
-       for l in examples:
-               lst = create_numbering(l)
-               n = lltype.malloc(NUMBERING, len(lst))
-               copy_from_list_to_numb(lst, n, 0)
-               assert unpack_numbering(n) == l
+    examples = [
+        [1, 2, 3, 4, 257, 10000, 13, 15],
+        [1, 2, 3, 4],
+        range(1, 10, 2),
+        [13000, 12000, 10000, 256, 255, 254, 257, -3, -1000]
+    ]
+    for l in examples:
+        n = create_numbering(l, NULL_NUMBER, 0)
+        assert unpack_numbering(n) == l
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to