[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