[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