[pypy-commit] pypy store-sink-array: Resume data support for array items.
arigo
noreply at buildbot.pypy.org
Sun Jun 19 19:52:38 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: store-sink-array
Changeset: r45012:6eb3c5a87266
Date: 2011-06-19 17:59 +0200
http://bitbucket.org/pypy/pypy/changeset/6eb3c5a87266/
Log: Resume data support for array items.
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -87,7 +87,8 @@
PENDINGFIELDSTRUCT = lltype.Struct('PendingField',
('lldescr', annlowlevel.base_ptr_lltype()),
('num', rffi.SHORT),
- ('fieldnum', rffi.SHORT))
+ ('fieldnum', rffi.SHORT),
+ ('itemindex', rffi.INT))
PENDINGFIELDSP = lltype.Ptr(lltype.GcArray(PENDINGFIELDSTRUCT))
TAGMASK = 3
@@ -418,13 +419,20 @@
n = len(pending_setfields)
rd_pendingfields = lltype.malloc(PENDINGFIELDSP.TO, n)
for i in range(n):
- descr, box, fieldbox = pending_setfields[i]
+ descr, box, fieldbox, itemindex = pending_setfields[i]
lldescr = annlowlevel.cast_instance_to_base_ptr(descr)
num = self._gettagged(box)
fieldnum = self._gettagged(fieldbox)
+ # the index is limited to 2147483647 (64-bit machines only)
+ if itemindex > 2147483647:
+ from pypy.jit.metainterp import compile
+ compile.giveup()
+ itemindex = rffi.cast(rffi.INT, itemindex)
+ #
rd_pendingfields[i].lldescr = lldescr
rd_pendingfields[i].num = num
rd_pendingfields[i].fieldnum = fieldnum
+ rd_pendingfields[i].itemindex= itemindex
self.storage.rd_pendingfields = rd_pendingfields
def _gettagged(self, box):
@@ -745,10 +753,23 @@
lldescr = pendingfields[i].lldescr
num = pendingfields[i].num
fieldnum = pendingfields[i].fieldnum
+ itemindex= pendingfields[i].itemindex
descr = annlowlevel.cast_base_ptr_to_instance(AbstractDescr,
lldescr)
struct = self.decode_ref(num)
- self.setfield(descr, struct, fieldnum)
+ itemindex = rffi.cast(lltype.Signed, itemindex)
+ if itemindex < 0:
+ self.setfield(descr, struct, fieldnum)
+ else:
+ self.setarrayitem(descr, struct, itemindex, fieldnum)
+
+ def setarrayitem(self, arraydescr, array, index, fieldnum):
+ if arraydescr.is_array_of_pointers():
+ self.setarrayitem_ref(arraydescr, array, index, fieldnum)
+ elif arraydescr.is_array_of_floats():
+ self.setarrayitem_float(arraydescr, array, index, fieldnum)
+ else:
+ self.setarrayitem_int(arraydescr, array, index, fieldnum)
def _prepare_next_section(self, info):
# Use info.enumerate_vars(), normally dispatching to
@@ -921,15 +942,15 @@
structbox, fieldbox)
def setarrayitem_int(self, arraydescr, arraybox, index, fieldnum):
- self.setarrayitem(arraydescr, arraybox, index, fieldnum, INT)
+ self._setarrayitem(arraydescr, arraybox, index, fieldnum, INT)
def setarrayitem_ref(self, arraydescr, arraybox, index, fieldnum):
- self.setarrayitem(arraydescr, arraybox, index, fieldnum, REF)
+ self._setarrayitem(arraydescr, arraybox, index, fieldnum, REF)
def setarrayitem_float(self, arraydescr, arraybox, index, fieldnum):
- self.setarrayitem(arraydescr, arraybox, index, fieldnum, FLOAT)
+ self._setarrayitem(arraydescr, arraybox, index, fieldnum, FLOAT)
- def setarrayitem(self, arraydescr, arraybox, index, fieldnum, kind):
+ def _setarrayitem(self, arraydescr, arraybox, index, fieldnum, kind):
itembox = self.decode_box(fieldnum, kind)
self.metainterp.execute_and_record(rop.SETARRAYITEM_GC,
arraydescr, arraybox,
diff --git a/pypy/jit/metainterp/test/test_resume.py b/pypy/jit/metainterp/test/test_resume.py
--- a/pypy/jit/metainterp/test/test_resume.py
+++ b/pypy/jit/metainterp/test/test_resume.py
@@ -1238,7 +1238,7 @@
liveboxes = []
modifier._number_virtuals(liveboxes, values, 0)
assert liveboxes == [b2s, b4s] or liveboxes == [b4s, b2s]
- modifier._add_pending_fields([(LLtypeMixin.nextdescr, b2s, b4s)])
+ modifier._add_pending_fields([(LLtypeMixin.nextdescr, b2s, b4s, -1)])
storage.rd_consts = memo.consts[:]
storage.rd_numb = None
# resume
@@ -1259,7 +1259,7 @@
assert len(expected) == len(trace)
assert demo55.next == demo66
-def test_virtual_adder_pending_fields_2():
+def test_virtual_adder_pending_fields_and_arrayitems():
class Storage(object):
pass
storage = Storage()
@@ -1274,23 +1274,57 @@
modifier = ResumeDataVirtualAdder(storage, None)
modifier.liveboxes_from_env = {42: rffi.cast(rffi.SHORT, 1042),
61: rffi.cast(rffi.SHORT, 1061)}
- modifier._add_pending_fields([(field_a, 42, 61)])
+ modifier._add_pending_fields([(field_a, 42, 61, -1)])
pf = storage.rd_pendingfields
assert len(pf) == 1
assert (annlowlevel.cast_base_ptr_to_instance(FieldDescr, pf[0].lldescr)
is field_a)
assert rffi.cast(lltype.Signed, pf[0].num) == 1042
assert rffi.cast(lltype.Signed, pf[0].fieldnum) == 1061
+ assert rffi.cast(lltype.Signed, pf[0].itemindex) == -1
+ #
+ array_a = FieldDescr()
+ storage = Storage()
+ modifier = ResumeDataVirtualAdder(storage, None)
+ modifier.liveboxes_from_env = {42: rffi.cast(rffi.SHORT, 1042),
+ 61: rffi.cast(rffi.SHORT, 1061),
+ 62: rffi.cast(rffi.SHORT, 1062),
+ 63: rffi.cast(rffi.SHORT, 1063)}
+ modifier._add_pending_fields([(array_a, 42, 61, 0),
+ (array_a, 42, 62, 2147483647)])
+ pf = storage.rd_pendingfields
+ assert len(pf) == 2
+ assert (annlowlevel.cast_base_ptr_to_instance(FieldDescr, pf[0].lldescr)
+ is array_a)
+ assert rffi.cast(lltype.Signed, pf[0].num) == 1042
+ assert rffi.cast(lltype.Signed, pf[0].fieldnum) == 1061
+ assert rffi.cast(lltype.Signed, pf[0].itemindex) == 0
+ assert (annlowlevel.cast_base_ptr_to_instance(FieldDescr, pf[1].lldescr)
+ is array_a)
+ assert rffi.cast(lltype.Signed, pf[1].num) == 1042
+ assert rffi.cast(lltype.Signed, pf[1].fieldnum) == 1062
+ assert rffi.cast(lltype.Signed, pf[1].itemindex) == 2147483647
+ #
+ from pypy.jit.metainterp.pyjitpl import SwitchToBlackhole
+ py.test.raises(SwitchToBlackhole, modifier._add_pending_fields,
+ [(array_a, 42, 63, 2147483648)])
-def test_resume_reader_fields_2():
+def test_resume_reader_fields_and_arrayitems():
class ResumeReader(AbstractResumeDataReader):
- def __init__(self, got):
+ def __init__(self, got=None, got_array=None):
self.got = got
+ self.got_array = got_array
def setfield(self, descr, struct, fieldnum):
assert lltype.typeOf(struct) is lltype.Signed
assert lltype.typeOf(fieldnum) is rffi.SHORT
fieldnum = rffi.cast(lltype.Signed, fieldnum)
self.got.append((descr, struct, fieldnum))
+ def setarrayitem(self, arraydescr, array, index, fieldnum):
+ assert lltype.typeOf(array) is lltype.Signed
+ assert lltype.typeOf(index) is lltype.Signed
+ assert lltype.typeOf(fieldnum) is rffi.SHORT
+ fieldnum = rffi.cast(lltype.Signed, fieldnum)
+ self.got_array.append((arraydescr, array, index, fieldnum))
def decode_ref(self, num):
return rffi.cast(lltype.Signed, num) * 100
got = []
@@ -1306,12 +1340,24 @@
pf[0].lldescr = annlowlevel.cast_instance_to_base_ptr(field_a)
pf[0].num = rffi.cast(rffi.SHORT, 1042)
pf[0].fieldnum = rffi.cast(rffi.SHORT, 1061)
+ pf[0].itemindex = rffi.cast(rffi.INT, -1)
pf[1].lldescr = annlowlevel.cast_instance_to_base_ptr(field_b)
pf[1].num = rffi.cast(rffi.SHORT, 2042)
pf[1].fieldnum = rffi.cast(rffi.SHORT, 2061)
+ pf[1].itemindex = rffi.cast(rffi.INT, -1)
got = []
ResumeReader(got)._prepare_pendingfields(pf)
assert got == [(field_a, 104200, 1061), (field_b, 204200, 2061)]
+ #
+ array_a = FieldDescr()
+ pf = lltype.malloc(PENDINGFIELDSP.TO, 1)
+ pf[0].lldescr = annlowlevel.cast_instance_to_base_ptr(array_a)
+ pf[0].num = rffi.cast(rffi.SHORT, 1042)
+ pf[0].fieldnum = rffi.cast(rffi.SHORT, 1063)
+ pf[0].itemindex = rffi.cast(rffi.INT, 123)
+ got_array = []
+ ResumeReader(got_array=got_array)._prepare_pendingfields(pf)
+ assert got_array == [(array_a, 104200, 123, 1063)]
def test_invalidation_needed():
More information about the pypy-commit
mailing list