[pypy-commit] pypy compress-numbering: start fighting with virtualizables

fijal noreply at buildbot.pypy.org
Wed Nov 25 10:47:25 EST 2015


Author: fijal
Branch: compress-numbering
Changeset: r80947:f07b8c5974d3
Date: 2015-11-25 17:47 +0200
http://bitbucket.org/pypy/pypy/changeset/f07b8c5974d3/

Log:	start fighting with virtualizables

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
@@ -1147,15 +1147,19 @@
         self.boxes_f = boxes_f
         self._prepare_next_section(info)
 
-    def consume_virtualizable_boxes(self, vinfo, numb):
+    def consume_virtualizable_boxes(self, vinfo):
         # 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.
-        index = len(numb.nums) - 1
-        virtualizablebox = self.decode_ref(numb.nums[index])
+        numb = self.numb
+        first_snapshot_size = rffi.cast(lltype.Signed, numb.first_snapshot_size)
+        item, _ = resumecode.numb_next_item(numb, first_snapshot_size - 1)
+        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, numb)
+        return vinfo.load_list_of_boxes(virtualizable, self, virtualizablebox,
+            numb, index)
 
     def consume_virtualref_boxes(self, end):
         # Returns a list of boxes, assumed to be all BoxPtrs.
@@ -1171,18 +1175,18 @@
     def consume_vref_and_vable_boxes(self, vinfo, ginfo):
         first_snapshot_size = rffi.cast(lltype.Signed,
                                         self.numb.first_snapshot_size)
-        end = first_snapshot_size & (~1) # if it's odd, it's -1
-        virtualref_boxes = self.consume_virtualref_boxes(end)
         if vinfo is not None:
             virtualizable_boxes = self.consume_virtualizable_boxes(vinfo)
-            xxxx
-            end = len(numb.nums) - len(virtualizable_boxes)
+            end = first_snapshot_size - len(virtualizable_boxes)
         elif ginfo is not None:
             item, self.cur_index = resumecode.numb_next_item(self.numb,
-                self.cur_index)
+                first_snapshot_size - 1)
             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)
         return virtualizable_boxes, virtualref_boxes
 
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
@@ -145,29 +145,26 @@
                     x = reader.load_value_of_type(ARRAYITEMTYPE, numb.nums[i])
                     setarrayitem(lst, j, x)
 
-        def load_list_of_boxes(virtualizable, reader, numb):
-            xxx
+        def load_list_of_boxes(virtualizable, reader, vable_box, numb, index):
             virtualizable = cast_gcref_to_vtype(virtualizable)
             # Uses 'virtualizable' only to know the length of the arrays;
             # does not write anything into it.  The returned list is in
             # the format expected of virtualizable_boxes, so it ends in
             # the virtualizable itself.
-            i = len(numb.nums) - 1
-            assert i >= 0
-            boxes = [reader.decode_box_of_type(self.VTYPEPTR, numb.nums[i])]
+            boxes = []
+            for FIELDTYPE, fieldname in unroll_static_fields:
+                item, index = numb_next_item(numb, index)
+                box = reader.decode_box_of_type(FIELDTYPE, item)
+                boxes.append(box)
             for ARRAYITEMTYPE, fieldname in unroll_array_fields_rev:
+                xxx
                 lst = getattr(virtualizable, fieldname)
                 for j in range(getlength(lst) - 1, -1, -1):
                     i -= 1
                     assert i >= 0
                     box = reader.decode_box_of_type(ARRAYITEMTYPE, numb.nums[i])
                     boxes.append(box)
-            for FIELDTYPE, fieldname in unroll_static_fields_rev:
-                i -= 1
-                assert i >= 0
-                box = reader.decode_box_of_type(FIELDTYPE, numb.nums[i])
-                boxes.append(box)
-            boxes.reverse()
+            boxes.append(vable_box)
             return boxes
 
         def check_boxes(virtualizable, boxes):


More information about the pypy-commit mailing list