[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