Author: fijal
Branch: vlen-resume
Changeset: r82387:8e1dbed9f261
Date: 2016-02-22 12:00 +0100
http://bitbucket.org/pypy/pypy/changeset/8e1dbed9f261/

Log:    finish the refactoring

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
@@ -134,7 +134,10 @@
                        snapshot_storage):
     n = len(framestack) - 1
     if virtualizable_boxes is not None:
-        virtualizable_boxes = virtualizable_boxes[:]
+        virtualizable_boxes = ([virtualizable_boxes[-1]] +
+                                virtualizable_boxes[:-1])
+    else:
+        virtualizable_boxes = []
     virtualref_boxes = virtualref_boxes[:]
     if n >= 0:
         top = framestack[n]
@@ -1131,49 +1134,42 @@
         self.boxes_f = boxes_f
         self._prepare_next_section(info)
 
-    def consume_virtualizable_boxes(self, vinfo):
+    def consume_virtualizable_boxes(self, vinfo, index):
         # we have to ignore the initial part of 'nums' (containing vrefs),
         # find the virtualizable from nums[-1], and use it to know how many
         # boxes of which type we have to return.  This does not write
         # anything into the virtualizable.
         numb = self.numb
-        first_snapshot_size = rffi.cast(lltype.Signed, 
numb.first_snapshot_size)
-        item, _ = resumecode.numb_next_item(numb, first_snapshot_size - 1)
+        item, index = resumecode.numb_next_item(numb, index)
         virtualizablebox = self.decode_ref(item)
-        index = first_snapshot_size - 
vinfo.get_total_size(virtualizablebox.getref_base()) - 1
         virtualizable = vinfo.unwrap_virtualizable_box(virtualizablebox)
         return vinfo.load_list_of_boxes(virtualizable, self, virtualizablebox,
             numb, index)
 
-    def consume_virtualref_boxes(self, end):
+    def consume_virtualref_boxes(self, index):
         # Returns a list of boxes, assumed to be all BoxPtrs.
         # We leave up to the caller to call vrefinfo.continue_tracing().
-        assert (end & 1) == 0
+        size, index = resumecode.numb_next_item(self.numb, index)
+        if size == 0:
+            return [], index
         lst = []
-        self.cur_index = 0
-        for i in range(end):
-            item, self.cur_index = resumecode.numb_next_item(self.numb,
-                self.cur_index)
+        for i in range(size * 2):
+            item, index = resumecode.numb_next_item(self.numb, index)
             lst.append(self.decode_ref(item))
-        return lst
+        return lst, index
 
     def consume_vref_and_vable_boxes(self, vinfo, ginfo):
-        first_snapshot_size = rffi.cast(lltype.Signed,
-                                        self.numb.first_snapshot_size)
+        vable_size, index = resumecode.numb_next_item(self.numb, 0)
         if vinfo is not None:
-            virtualizable_boxes = self.consume_virtualizable_boxes(vinfo)
-            end = first_snapshot_size - len(virtualizable_boxes)
+            virtualizable_boxes, index = 
self.consume_virtualizable_boxes(vinfo,
+                                                                          
index)
         elif ginfo is not None:
-            xxxxxx
-            item, self.cur_index = resumecode.numb_next_item(self.numb,
-                first_snapshot_size - 1)
+            item, index = resumecode.numb_next_item(self.numb, index)
             virtualizable_boxes = [self.decode_ref(item)]
-            end = first_snapshot_size - 1
         else:
-            end = first_snapshot_size
             virtualizable_boxes = None
-        virtualref_boxes = self.consume_virtualref_boxes(end)
-        self.cur_index = rffi.cast(lltype.Signed, 
self.numb.first_snapshot_size)
+        virtualref_boxes, index = self.consume_virtualref_boxes(index)
+        self.cur_index = index
         return virtualizable_boxes, virtualref_boxes
 
     def allocate_with_vtable(self, descr=None):
@@ -1452,37 +1448,32 @@
         # we have to decode a list of references containing pairs
         # [..., virtual, vref, ...] and returns the index at the end
         size, index = resumecode.numb_next_item(self.numb, index)
-        if vrefinfo is None:
+        if vrefinfo is None or size == 0:
             assert size == 0
             return index
-        xxxx
-        assert (end & 1) == 0
-        self.cur_index = 0
-        for i in range(0, end, 2):
-            virtual_item, self.cur_index = resumecode.numb_next_item(
-                self.numb, self.cur_index)
-            vref_item, self.cur_index = resumecode.numb_next_item(
-                self.numb, self.cur_index)
+        for i in range(size):
+            virtual_item, index = resumecode.numb_next_item(
+                self.numb, index)
+            vref_item, index = resumecode.numb_next_item(
+                self.numb, index)
             virtual = self.decode_ref(virtual_item)
             vref = self.decode_ref(vref_item)
             # For each pair, we store the virtual inside the vref.
             vrefinfo.continue_tracing(vref, virtual)
+        return index
 
-    def consume_vable_info(self, vinfo):
+    def consume_vable_info(self, vinfo, index):
         # we have to ignore the initial part of 'nums' (containing vrefs),
         # find the virtualizable from nums[-1], load all other values
         # from the CPU stack, and copy them into the virtualizable
         numb = self.numb
-        first_snapshot_size = rffi.cast(lltype.Signed, 
numb.first_snapshot_size)
-        item, _ = resumecode.numb_next_item(self.numb,
-            first_snapshot_size - 1)
+        item, index = resumecode.numb_next_item(self.numb, index)
         virtualizable = self.decode_ref(item)
-        start_index = first_snapshot_size - 1 - 
vinfo.get_total_size(virtualizable)
         # just reset the token, we'll force it later
         vinfo.reset_token_gcref(virtualizable)
-        vinfo.write_from_resume_data_partial(virtualizable, self, start_index,
-            numb)
-        return start_index
+        index = vinfo.write_from_resume_data_partial(virtualizable, self,
+            index, numb)
+        return index
 
     def load_value_of_type(self, TYPE, tagged):
         from rpython.jit.metainterp.warmstate import specialize_value
@@ -1504,12 +1495,12 @@
             if vinfo is not None:
                 index = self.consume_vable_info(vinfo, index)
             if ginfo is not None:
-                end_vref -= 1
-                xxxxxxxxxxxxxxx
+                _, index = resumecode.numb_next_item(self.numb, index)
             index = self.consume_virtualref_info(vrefinfo, index)
         else:
             index = resumecode.numb_next_n_items(self.numb, vable_size, index)
-            xxxx
+            vref_size, index = resumecode.numb_next_item(self.numb, index)
+            index = resumecode.numb_next_n_items(self.numb, vref_size * 2, 
index)
         self.cur_index = index 
 
     def allocate_with_vtable(self, descr=None):
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
@@ -65,6 +65,11 @@
     value >>= 1
     return value, index
 
+def numb_next_n_items(numb, size, index):
+    for i in range(size):
+        _, index = numb_next_item(numb, index)
+    return index
+
 def unpack_numbering(numb):
     l = []
     i = 0
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
@@ -612,7 +612,7 @@
     
     snapshot = storage.rd_snapshot
     assert snapshot.boxes == vrs
-    assert snapshot.vable_boxes == vbs
+    assert snapshot.vable_boxes == [b2, b1]
 
     snapshot = snapshot.prev
     assert snapshot.prev is fs[2].parent_resumedata_snapshot
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
@@ -142,6 +142,7 @@
                     item, index = numb_next_item(numb, index)                  
  
                     x = reader.load_value_of_type(ARRAYITEMTYPE, item)
                     setarrayitem(lst, j, x)
+            return index
 
         def load_list_of_boxes(virtualizable, reader, vable_box, numb, index):
             virtualizable = cast_gcref_to_vtype(virtualizable)
@@ -161,7 +162,7 @@
                     box = reader.decode_box_of_type(ARRAYITEMTYPE, item)
                     boxes.append(box)
             boxes.append(vable_box)
-            return boxes
+            return boxes, index
 
         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