[pypy-commit] pypy default: Add the missing VRawSliceInfo, improve the test, fix.
arigo
noreply at buildbot.pypy.org
Sun Oct 6 14:42:19 CEST 2013
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r67166:1cd66e3ec8aa
Date: 2013-10-06 14:41 +0200
http://bitbucket.org/pypy/pypy/changeset/1cd66e3ec8aa/
Log: Add the missing VRawSliceInfo, improve the test, fix.
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -483,6 +483,15 @@
def getitem_raw(self, offset, length, descr):
return self.rawbuffer_value.getitem_raw(self.offset+offset, length, descr)
+ def _get_args_for_fail(self, modifier):
+ box = self.rawbuffer_value.get_key_box()
+ modifier.register_virtual_fields(self.keybox, [box])
+ self.rawbuffer_value.get_args_for_fail(modifier)
+
+ def _make_virtual(self, modifier):
+ return modifier.make_vrawslice(self.offset)
+
+
class OptVirtualize(optimizer.Optimization):
"Virtualize objects until they escape."
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
@@ -284,7 +284,10 @@
return VArrayStructInfo(arraydescr, fielddescrs)
def make_vrawbuffer(self, size, offsets, descrs):
- return VRawBufferStateInfo(size, offsets, descrs)
+ return VRawBufferInfo(size, offsets, descrs)
+
+ def make_vrawslice(self, offset):
+ return VRawSliceInfo(offset)
def make_vstrplain(self, is_unicode=False):
if is_unicode:
@@ -554,10 +557,13 @@
debug_print("\t\t", str(untag(i)))
-class VRawBufferStateInfo(AbstractVirtualInfo):
+class VAbstractRawInfo(AbstractVirtualInfo):
kind = INT
is_about_raw = True
+
+class VRawBufferInfo(VAbstractRawInfo):
+
def __init__(self, size, offsets, descrs):
self.size = size
self.offsets = offsets
@@ -580,6 +586,25 @@
debug_print("\t\t", str(untag(i)))
+class VRawSliceInfo(VAbstractRawInfo):
+
+ def __init__(self, offset):
+ self.offset = offset
+
+ @specialize.argtype(1)
+ def allocate_int(self, decoder, index):
+ assert len(self.fieldnums) == 1
+ base_buffer = decoder.decode_int(self.fieldnums[0])
+ buffer = decoder.int_add_const(base_buffer, self.offset)
+ decoder.virtuals_cache.set_int(index, buffer)
+ return buffer
+
+ def debug_prints(self):
+ debug_print("\tvrawsliceinfo", " at ", compute_unique_id(self))
+ for i in self.fieldnums:
+ debug_print("\t\t", str(untag(i)))
+
+
class VArrayStructInfo(AbstractVirtualInfo):
def __init__(self, arraydescr, fielddescrs):
self.arraydescr = arraydescr
@@ -784,7 +809,7 @@
if not v:
v = self.rd_virtuals[index]
ll_assert(bool(v), "resume.py: null rd_virtuals[index]")
- assert v.is_about_raw and isinstance(v, VRawBufferStateInfo)
+ assert v.is_about_raw and isinstance(v, VAbstractRawInfo)
v = v.allocate_int(self, index)
ll_assert(v == self.virtuals_cache.get_int(index), "resume.py: bad cache")
return v
@@ -1117,6 +1142,10 @@
def write_a_float(self, index, box):
self.boxes_f[index] = box
+ def int_add_const(self, intbox, offset):
+ return self.metainterp.execute_and_record(rop.INT_ADD, None, intbox,
+ ConstInt(offset))
+
# ---------- when resuming for blackholing, get direct values ----------
def blackhole_from_resumedata(blackholeinterpbuilder, jitdriver_sd, storage,
@@ -1408,6 +1437,9 @@
def write_a_float(self, index, float):
self.blackholeinterp.setarg_f(index, float)
+ def int_add_const(self, base, offset):
+ return base + offset
+
# ____________________________________________________________
def dump_storage(storage, liveboxes):
diff --git a/rpython/jit/metainterp/test/test_fficall.py b/rpython/jit/metainterp/test/test_fficall.py
--- a/rpython/jit/metainterp/test/test_fficall.py
+++ b/rpython/jit/metainterp/test/test_fficall.py
@@ -93,7 +93,7 @@
targetptr = rffi.ptradd(exbuf, 16)
for avalue in unroll_avalues:
TYPE = rffi.CArray(lltype.typeOf(avalue))
- if i == 9: # a guard that can fail
+ if i >= 9: # a guard that can fail
pass
rffi.cast(lltype.Ptr(TYPE), targetptr)[0] = avalue
targetptr = rffi.ptradd(targetptr, 16)
More information about the pypy-commit
mailing list