[pypy-commit] pypy optresult: two more tests

fijal noreply at buildbot.pypy.org
Tue May 26 22:36:14 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77602:f7237d5099a4
Date: 2015-05-26 22:36 +0200
http://bitbucket.org/pypy/pypy/changeset/f7237d5099a4/

Log:	two more tests

diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -827,15 +827,15 @@
         self.emit_operation(op)
 
     def optimize_STRGETITEM(self, op):
-        indexvalue = self.getvalue(op.getarg(1))
-        if indexvalue.is_constant():
+        indexb = self.getintbound(op.getarg(1))
+        if indexb.is_constant():
             arrayvalue = self.getvalue(op.getarg(0))
             arrayvalue.make_len_gt(MODE_STR, op.getdescr(), indexvalue.box.getint())
         self.optimize_default(op)
 
     def optimize_UNICODEGETITEM(self, op):
-        indexvalue = self.getvalue(op.getarg(1))
-        if indexvalue.is_constant():
+        indexb = self.getintbound(op.getarg(1))
+        if indexb.is_constant():
             arrayvalue = self.getvalue(op.getarg(0))
             arrayvalue.make_len_gt(MODE_UNICODE, op.getdescr(), indexvalue.box.getint())
         self.optimize_default(op)
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -133,16 +133,22 @@
 
 class VStringPlainInfo(StrPtrInfo):
     _attrs_ = ('mode', '_is_virtual')
+
+    _chars = None
     
     def __init__(self, mode, is_virtual, length):
-        if is_virtual:
-            assert length != -1
+        if length != -1:
             self._chars = [None] * length
         StrPtrInfo.__init__(self, mode, is_virtual, length)
 
     def setitem(self, index, item):
         self._chars[index] = item
 
+    def setup_slice(self, longerlist, start, stop):
+        assert 0 <= start <= stop <= len(longerlist)
+        self._chars = longerlist[start:stop]
+        # slice the 'longerlist', which may also contain Nones
+
     def getitem(self, index):
         return self._chars[index]
 
@@ -160,10 +166,10 @@
             return VAbstractStringValue.string_copy_parts(
                 self, string_optimizer, targetbox, offsetbox, mode)
         else:
-            return self.initialize_forced_string(string_optimizer, targetbox,
-                                                 offsetbox, mode)
+            return self.initialize_forced_string(op, string_optimizer,
+                                                 targetbox, offsetbox, mode)
 
-    def initialize_forced_string(self, string_optimizer, targetbox,
+    def initialize_forced_string(self, op, string_optimizer, targetbox,
                                  offsetbox, mode):
         for i in range(len(self._chars)):
             assert not isinstance(targetbox, Const) # ConstPtr never makes sense
@@ -177,7 +183,39 @@
         return offsetbox
 
 class VStringSliceInfo(StrPtrInfo):
-    pass
+    def __init__(self, s, start, length, mode):
+        self.s = s
+        self.start = start
+        self.lgtop = length
+        self.mode = mode
+        self._is_virtual = True
+
+    def is_virtual(self):
+        return self._is_virtual
+
+    def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox,
+                          mode):
+        return copy_str_content(string_optimizer, self.s, targetbox,
+                                self.start, offsetbox, self.lgtop, mode)
+
+    @specialize.arg(1)
+    def get_constant_string_spec(self, string_optimizer, mode):
+        vstart = string_optimizer.getintbound(self.start)
+        vlength = string_optimizer.getintbound(self.lgtop)
+        if vstart.is_constant() and vlength.is_constant():
+            xxx
+            s1 = self.vstr.get_constant_string_spec(mode)
+            if s1 is None:
+                return None
+            start = self.vstart.box.getint()
+            length = self.vlength.box.getint()
+            assert start >= 0
+            assert length >= 0
+            return s1[start : start + length]
+        return None
+
+    def getstrlen(self, op, string_optimizer, mode, create_ops=True):
+        return self.lgtop
 
 class VStringConcatInfo(StrPtrInfo):
     _attrs_ = ('mode', 'vleft', 'vright', '_is_virtual')
@@ -583,9 +621,9 @@
         self.make_equal_to(op, vvalue)
         return vvalue
 
-    def make_vstring_slice(self, source_op, mode):
-        vvalue = VStringSliceValue(source_op, mode)
-        self.make_equal_to(source_op, vvalue)
+    def make_vstring_slice(self, op, strbox, startbox, mode, lengthbox):
+        vvalue = VStringSliceInfo(strbox, startbox, lengthbox, mode)
+        self.make_equal_to(op, vvalue)
         return vvalue
 
     def optimize_NEWSTR(self, op):
@@ -631,46 +669,41 @@
         self._optimize_STRGETITEM(op, mode_unicode)
 
     def _optimize_STRGETITEM(self, op, mode):
-        strinfo = self.getptrinfo(op.getarg(0))
-        vindex = self.getintbound(op.getarg(1))
-        res = self.strgetitem(op, strinfo, vindex, mode, op)
+        res = self.strgetitem(op, op.getarg(0), op.getarg(1), mode)
         if res is not None:
             self.make_equal_to(op, res)
 
-    def strgetitem(self, op, sinfo, vindex, mode, resbox=None):
-        self.make_nonnull(op.getarg(0))
+    def strgetitem(self, op, s, index, mode):
+        self.make_nonnull_str(s, mode)
+        sinfo = self.getptrinfo(s)
         #
         if isinstance(sinfo, VStringSliceInfo) and sinfo.is_virtual(): # slice
-            xxx
-            fullindexbox = _int_add(self,
-                                    value.vstart.force_box(self),
-                                    vindex.force_box(self))
-            value = value.vstr
-            vindex = self.getvalue(fullindexbox)
+            index = _int_add(self.optimizer, sinfo.start, index)
+            s = sinfo.s
+            sinfo = self.getptrinfo(sinfo.s)
         #
         if isinstance(sinfo, VStringPlainInfo):
             # even if no longer virtual
+            vindex = self.getintbound(index)
             if vindex.is_constant():
                 result = sinfo.getitem(vindex.getint())
                 if result is not None:
                     return result
         #
+        vindex = self.getintbound(index)
         if isinstance(sinfo, VStringConcatInfo) and vindex.is_constant():
             leftinfo = self.getptrinfo(sinfo.vleft)
             len1box = leftinfo.getstrlen(sinfo.vleft, self, mode)
             if isinstance(len1box, ConstInt):
-                index = vindex.getint()
+                raw_index = vindex.getint()
                 len1 = len1box.getint()
-                if index < len1:
-                    return self.strgetitem(sinfo.vleft, leftinfo, vindex, mode)
+                if raw_index < len1:
+                    return self.strgetitem(op, sinfo.vleft, index, mode)
                 else:
-                    vindex = ConstInt(index - len1)
-                    rightinf = self.getptrinfo(sinfo.vright)
-                    return self.strgetitem(sinfo.vright, rightinf, vindex, mode)
+                    index = ConstInt(raw_index - len1)
+                    return self.strgetitem(op, sinfo.vright, index, mode)
         #
-        xxx
-        resbox = _strgetitem(self, value.force_box(self), vindex.force_box(self), mode, resbox)
-        return self.getvalue(resbox)
+        _strgetitem(self, s, index, mode, op)
 
     def optimize_STRLEN(self, op):
         self._optimize_STRLEN(op, mode_string)
@@ -799,32 +832,28 @@
         return True
 
     def opt_call_stroruni_STR_SLICE(self, op, mode):
-        vstr = self.getvalue(op.getarg(1))
-        vstart = self.getvalue(op.getarg(2))
-        vstop = self.getvalue(op.getarg(3))
+        self.make_nonnull_str(op.getarg(1), mode)
+        vstr = self.getptrinfo(op.getarg(1))
+        vstart = self.getintbound(op.getarg(2))
+        vstop = self.getintbound(op.getarg(3))
         #
-        #if (isinstance(vstr, VStringPlainValue) and vstart.is_constant()
-        #    and vstop.is_constant()):
-        #    value = self.make_vstring_plain(op.result, op, mode)
-        #    value.setup_slice(vstr._chars, vstart.box.getint(),
-        #                      vstop.box.getint())
-        #    return True
+        if (isinstance(vstr, VStringPlainInfo) and vstart.is_constant()
+            and vstop.is_constant()):
+            value = self.make_vstring_plain(op, mode, -1)
+            value.setup_slice(vstr._chars, vstart.getint(),
+                              vstop.getint())
+            return True
         #
-        vstr.ensure_nonnull()
-        lengthbox = _int_sub(self, vstop.force_box(self),
-                                   vstart.force_box(self))
+        startbox = op.getarg(2)
+        strbox = op.getarg(1)
+        lengthbox = _int_sub(self.optimizer, op.getarg(3), op.getarg(2))
         #
-        if isinstance(vstr, VStringSliceValue):
+        if isinstance(vstr, VStringSliceInfo):
             # double slicing  s[i:j][k:l]
-            vintermediate = vstr
-            vstr = vintermediate.vstr
-            startbox = _int_add(self,
-                                vintermediate.vstart.force_box(self),
-                                vstart.force_box(self))
-            vstart = self.getvalue(startbox)
+            strbox = vstr.s
+            startbox = _int_add(self.optimizer, vstr.start, startbox)
         #
-        value = self.make_vstring_slice(op, mode)
-        value.setup(vstr, vstart, self.getvalue(lengthbox))
+        self.make_vstring_slice(op, strbox, startbox, mode, lengthbox)
         return True
 
     def opt_call_stroruni_STR_EQUAL(self, op, mode):
@@ -879,8 +908,8 @@
                 l1box = i1.getstrlen(arg1, self, mode, False)
                 if isinstance(l1box, ConstInt) and l1box.value == 1:
                     # comparing two single chars
-                    vchar1 = self.strgetitem(arg1, i1, optimizer.CONST_0, mode)
-                    vchar2 = self.strgetitem(arg2, i2, optimizer.CONST_0, mode)
+                    vchar1 = self.strgetitem(resultop, arg1, optimizer.CONST_0, mode)
+                    vchar2 = self.strgetitem(resultop, arg2, optimizer.CONST_0, mode)
                     seo = self.optimizer.send_extra_operation
                     op = self.optimizer.replace_op_with(resultop, rop.INT_EQ,
                                 [vchar1, vchar2], descr=DONT_CHANGE)


More information about the pypy-commit mailing list