Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: optinfo-into-bridges
Changeset: r87809:e1832b3ddde9
Date: 2016-10-14 17:28 +0200
http://bitbucket.org/pypy/pypy/changeset/e1832b3ddde9/

Log:    also add a Writer class

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
@@ -256,7 +256,7 @@
     def number(self, optimizer, position, trace):
         snapshot_iter = trace.get_snapshot_iter(position)
         numb_state = NumberingState(snapshot_iter.size)
-        numb_state.append_int(-1) # patch later
+        numb_state.append_int(0) # patch later
 
         arr = snapshot_iter.vable_array
 
@@ -1407,8 +1407,7 @@
         virtualizable = self.next_ref()
         # just reset the token, we'll force it later
         vinfo.reset_token_gcref(virtualizable)
-        index = vinfo.write_from_resume_data_partial(virtualizable, self,
-            index, numb)
+        vinfo.write_from_resume_data_partial(virtualizable, self)
         return index
 
     def load_next_value_of_type(self, TYPE):
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
@@ -30,33 +30,24 @@
 NUMBERINGP.TO.become(NUMBERING)
 NULL_NUMBER = lltype.nullptr(NUMBERING)
 
-def create_numbering(lst, total=-1):
-    if total == -1:
-        total = len(lst)
-    result = []
-    for i in range(total):
-        item = lst[i]
-        item = rffi.cast(lltype.Signed, item)
-        item *= 2
-        if item < 0:
-            item = -1 - item
+def append_numbering(lst, item):
+    item = rffi.cast(lltype.Signed, item)
+    item *= 2
+    if item < 0:
+        item = -1 - item
 
-        assert item >= 0
-        if item < 2**7:
-            result.append(rffi.cast(rffi.UCHAR, item))
-        elif item < 2**14:
-            result.append(rffi.cast(rffi.UCHAR, item | 0x80))
-            result.append(rffi.cast(rffi.UCHAR, item >> 7))
-        else:
-            assert item < 2**16
-            result.append(rffi.cast(rffi.UCHAR, item | 0x80))
-            result.append(rffi.cast(rffi.UCHAR, (item >> 7) | 0x80))
-            result.append(rffi.cast(rffi.UCHAR, item >> 14))
+    assert item >= 0
+    if item < 2**7:
+        lst.append(rffi.cast(rffi.UCHAR, item))
+    elif item < 2**14:
+        lst.append(rffi.cast(rffi.UCHAR, item | 0x80))
+        lst.append(rffi.cast(rffi.UCHAR, item >> 7))
+    else:
+        assert item < 2**16
+        lst.append(rffi.cast(rffi.UCHAR, item | 0x80))
+        lst.append(rffi.cast(rffi.UCHAR, (item >> 7) | 0x80))
+        lst.append(rffi.cast(rffi.UCHAR, item >> 14))
 
-    numb = lltype.malloc(NUMBERING, len(result))
-    for i in range(len(result)):
-        numb.code[i] = result[i]
-    return numb
 
 def numb_next_item(numb, index):
     value = rffi.cast(lltype.Signed, numb.code[index])
@@ -90,11 +81,13 @@
 
 class Writer(object):
     def __init__(self, size):
-        self.current = objectmodel.newlist_hint(size)
+        self.current = objectmodel.newlist_hint(3 * size)
         self.grow(size)
+        self.items = 0
 
     def append_short(self, item):
-        self.current.append(item)
+        self.items += 1
+        append_numbering(self.current, item)
 
     def append_int(self, item):
         short = rffi.cast(rffi.SHORT, item)
@@ -102,16 +95,21 @@
         return self.append_short(short)
 
     def create_numbering(self):
-        return create_numbering(self.current)
+        numb = lltype.malloc(NUMBERING, len(self.current))
+        for i, elt in enumerate(self.current):
+            numb.code[i] = elt
+        return numb
 
     def grow(self, size):
         pass
 
     def patch_current_size(self, index):
-        item = len(self.current)
-        short = rffi.cast(rffi.SHORT, item)
-        assert rffi.cast(lltype.Signed, short) == item
-        self.current[index] = short
+        # mess :-(
+        assert rffi.cast(lltype.Signed, self.current[index]) == 0
+        l = []
+        append_numbering(l, self.items)
+        self.current = l + self.current[1:]
+
 
 class Reader(object):
     def __init__(self, code):
diff --git a/rpython/jit/metainterp/test/test_bridgeopt.py 
b/rpython/jit/metainterp/test/test_bridgeopt.py
--- a/rpython/jit/metainterp/test/test_bridgeopt.py
+++ b/rpython/jit/metainterp/test/test_bridgeopt.py
@@ -7,6 +7,7 @@
 from rpython.jit.metainterp.optimizeopt.bridgeopt import 
deserialize_optimizer_knowledge
 from rpython.jit.metainterp.resoperation import InputArgRef, InputArgInt
 from rpython.jit.metainterp.resume import NumberingState
+from rpython.jit.metainterp.resumecode import unpack_numbering
 from rpython.jit.metainterp.optimizeopt.info import InstancePtrInfo
 
 from hypothesis import strategies, given
@@ -60,7 +61,7 @@
 
     serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, {}, None)
 
-    assert numb_state.current[:numb_state._pos] == [1, 0b010000, 0]
+    assert unpack_numbering(numb_state.create_numbering()) == [1, 0b010000, 0]
 
     rbox1 = InputArgRef()
     rbox2 = InputArgRef()
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
@@ -37,10 +37,26 @@
         assert elt == item
 
 @hypothesis_and_examples
-def test_reader(l):
+def test_writer(l):
     for size in [len(l), 0]:
         w = Writer(len(l))
         for num in l:
             w.append_int(num)
         n = w.create_numbering()
         assert unpack_numbering(n) == l
+
+@hypothesis_and_examples
+def test_patch(l):
+    for middle in range(len(l)):
+        l1 = l[:middle]
+        l2 = l[middle:]
+        w = Writer(len(l))
+        w.append_int(0)
+        for num in l1:
+            w.append_int(num)
+        w.patch_current_size(0)
+        for num in l2:
+            w.append_int(num)
+        n = w.create_numbering()
+        assert unpack_numbering(n)[1:] == l
+        assert unpack_numbering(n)[0] == middle + 1
diff --git a/rpython/jit/metainterp/virtualizable.py 
b/rpython/jit/metainterp/virtualizable.py
--- a/rpython/jit/metainterp/virtualizable.py
+++ b/rpython/jit/metainterp/virtualizable.py
@@ -139,7 +139,6 @@
                 for j in range(getlength(lst)):
                     x = reader.load_next_value_of_type(ARRAYITEMTYPE)
                     setarrayitem(lst, j, x)
-            return index
 
         def load_list_of_boxes(virtualizable, reader, vable_box):
             virtualizable = cast_gcref_to_vtype(virtualizable)
@@ -157,7 +156,7 @@
                     box = reader.next_box_of_type(ARRAYITEMTYPE)
                     boxes.append(box)
             boxes.append(vable_box)
-            return boxes, index
+            return boxes
 
         def check_boxes(virtualizable, boxes):
             virtualizable = cast_gcref_to_vtype(virtualizable)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to