Author: Armin Rigo <ar...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit