[pypy-svn] r74835 - pypy/branch/blackhole-improvement/pypy/jit/metainterp

arigo at codespeak.net arigo at codespeak.net
Fri May 28 10:25:00 CEST 2010


Author: arigo
Date: Fri May 28 10:24:59 2010
New Revision: 74835

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/virtualizable.py
Log:
Progress, maybe.


Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Fri May 28 10:24:59 2010
@@ -1886,7 +1886,7 @@
         #
         # virtualizable: synchronize the real virtualizable and the local
         # boxes, in whichever direction is appropriate
-        if expect_virtualizable:
+        if vinfo is not None:
             self.virtualizable_boxes = virtualizable_boxes
             # just jumped away from assembler (case 4 in the comment in
             # virtualizable.py) into tracing (case 2); check that vable_token

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py	Fri May 28 10:24:59 2010
@@ -552,10 +552,8 @@
 
 def rebuild_from_resumedata(metainterp, storage, virtualizable_info):
     resumereader = ResumeDataBoxReader(storage, metainterp)
-    virtualizable_boxes = None
-    if virtualizable_info:
-        XXX # virtualizable_boxes = resumereader.consume_boxes()
-    virtualref_boxes = resumereader.consume_virtualref_boxes()
+    boxes = resumereader.consume_vref_and_vable_boxes(virtualizable_info)
+    virtualizable_boxes, virtualref_boxes = boxes
     frameinfo = storage.rd_frame_info_list
     while True:
         f = metainterp.newframe(frameinfo.jitcode)
@@ -567,7 +565,7 @@
             break
     metainterp.framestack.reverse()
     resumereader.done()
-    return resumereader.liveboxes, None, virtualref_boxes
+    return resumereader.liveboxes, virtualizable_boxes, virtualref_boxes
 
 class ResumeDataBoxReader(AbstractResumeDataReader):
 
@@ -583,12 +581,32 @@
         self.boxes_f = boxes_f
         self._prepare_next_section(info)
 
-    def consume_virtualref_boxes(self):
+    def consume_virtualizable_boxes(self, vinfo, nums):
+        # 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.
+        virtualizablebox = self.decode_ref(nums[-1])
+        virtualizable = vinfo.unwrap_virtualizable_box(virtualizablebox)
+        return vinfo.load_list_of_boxes(virtualizable, self, nums)
+
+    def consume_virtualref_boxes(self, nums, end):
         # 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
+        return [self.decode_ref(nums[i]) for i in range(end)]
+
+    def consume_vref_and_vable_boxes(self, vinfo):
         nums = self.cur_numb.nums
         self.cur_numb = self.cur_numb.prev
-        return [self.decode_ref(num) for num in nums]
+        if vinfo is None:
+            virtualizable_boxes = None
+            end = len(nums)
+        else:
+            virtualizable_boxes = self.consume_virtualizable_boxes(vinfo, nums)
+            end = len(nums) - len(virtualizable_boxes)
+        virtualref_boxes = self.consume_virtualref_boxes(nums, end)
+        return virtualizable_boxes, virtualref_boxes
 
     def allocate_with_vtable(self, known_class):
         return self.metainterp.execute_and_record(rop.NEW_WITH_VTABLE,
@@ -670,6 +688,15 @@
         self.liveboxes[num] = box
         return box
 
+    def decode_box_of_type(self, TYPE, tagged):
+        kind = getkind(TYPE)
+        if kind == 'int':     kind = INT
+        elif kind == 'ref':   kind = REF
+        elif kind == 'float': kind = FLOAT
+        else: raise AssertionError(kind)
+        return self.decode_box(tagged, kind)
+    decode_box_of_type._annspecialcase_ = 'specialize:arg(1)'
+
     def write_an_int(self, index, box):
         self.boxes_i[index] = box
     def write_a_ref(self, index, box):
@@ -717,10 +744,9 @@
 
 def force_from_resumedata(metainterp_sd, storage):
     resumereader = ResumeDataDirectReader(metainterp_sd.cpu, storage)
-    if expects_virtualizables:
-        XXX
+    vinfo = metainterp_sd.virtualizable_info
     vrefinfo = metainterp_sd.virtualref_info
-    resumereader.consume_virtualref_info(vrefinfo)
+    resumereader.consume_vref_and_vable(vrefinfo, vinfo)
     return resumereader.virtuals
 
 class ResumeDataDirectReader(AbstractResumeDataReader):
@@ -764,7 +790,7 @@
         # is and stays 0.  Note the call to reset_vable_token() in
         # warmstate.py.
         assert not virtualizable.vable_token
-        return vinfo.write_from_resume_data(virtualizable, self, nums)
+        return vinfo.write_from_resume_data_partial(virtualizable, self, nums)
 
     def load_value_of_type(self, TYPE, tagged):
         kind = getkind(TYPE)

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/virtualizable.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/virtualizable.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/virtualizable.py	Fri May 28 10:24:59 2010
@@ -104,21 +104,52 @@
                     i = i + 1
             assert len(boxes) == i + 1
         #
-        def write_from_resume_data(virtualizable, reader, nums):
-            # similar to write_boxes(), but works from the end instead
+        def write_from_resume_data_partial(virtualizable, reader, nums):
+            # Load values from the reader (see resume.py) described by
+            # the list of numbers 'nums', and write them in their proper
+            # place in the 'virtualizable'.  This works from the end of
+            # the list and returns the index in 'nums' of the start of
+            # the virtualizable data found, allowing the caller to do
+            # further processing with the start of the list.
             i = len(nums) - 1
+            assert i >= 0
             for ARRAYITEMTYPE, fieldname in unroll_array_fields_rev:
                 lst = getattr(virtualizable, fieldname)
                 for j in range(getlength(lst)-1, -1, -1):
                     i -= 1
+                    assert i >= 0
                     x = reader.load_value_of_type(ARRAYITEMTYPE, nums[i])
                     setarrayitem(lst, j, x)
             for FIELDTYPE, fieldname in unroll_static_fields_rev:
                 i -= 1
+                assert i >= 0
                 x = reader.load_value_of_type(FIELDTYPE, nums[i])
                 setattr(virtualizable, fieldname, x)
             return i
         #
+        def load_list_of_boxes(virtualizable, reader, nums):
+            # 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(nums) - 1
+            assert i >= 0
+            boxes = [reader.decode_box_of_type(self.VTYPEPTR, nums[i])]
+            for ARRAYITEMTYPE, fieldname in unroll_array_fields_rev:
+                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, 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, nums[i])
+                boxes.append(box)
+            boxes.reverse()
+            return boxes
+        #
         def check_boxes(virtualizable, boxes):
             # for debugging
             i = 0
@@ -164,7 +195,8 @@
                                           reversed(list(unroll_array_fields)))
         self.read_boxes = read_boxes
         self.write_boxes = write_boxes
-        self.write_from_resume_data = write_from_resume_data
+        self.write_from_resume_data_partial = write_from_resume_data_partial
+        self.load_list_of_boxes = load_list_of_boxes
         self.check_boxes = check_boxes
         self.get_index_in_array = get_index_in_array
         self.get_array_length = get_array_length



More information about the Pypy-commit mailing list