[pypy-commit] pypy optresult: str equality does not mean args are non-null

fijal noreply at buildbot.pypy.org
Wed May 27 09:22:38 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77606:7c139bdd1ea2
Date: 2015-05-27 09:16 +0200
http://bitbucket.org/pypy/pypy/changeset/7c139bdd1ea2/

Log:	str equality does not mean args are non-null

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
@@ -867,13 +867,17 @@
     def opt_call_stroruni_STR_EQUAL(self, op, mode):
         arg1 = self.get_box_replacement(op.getarg(1))
         arg2 = self.get_box_replacement(op.getarg(2))
-        self.make_nonnull_str(arg1, mode)
-        self.make_nonnull_str(arg2, mode)
         i1 = self.getptrinfo(arg1)
         i2 = self.getptrinfo(arg2)
         #
-        l1box = i1.getstrlen(arg1, self, mode, create_ops=False)
-        l2box = i2.getstrlen(arg2, self, mode, create_ops=False)
+        if i1:
+            l1box = i1.getstrlen(arg1, self, mode, create_ops=False)
+        else:
+            l1box = None
+        if i2:
+            l2box = i2.getstrlen(arg2, self, mode, create_ops=False)
+        else:
+            l2box = None
         if (l1box is not None and l2box is not None and
             isinstance(l1box, ConstInt) and
             isinstance(l2box, ConstInt) and
@@ -903,7 +907,10 @@
     def handle_str_equal_level1(self, arg1, arg2, resultop, mode):
         i1 = self.getptrinfo(arg1)
         i2 = self.getptrinfo(arg2)
-        l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
+        l2box = None
+        l1box = None
+        if i2:
+            l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
         if isinstance(l2box, ConstInt):
             if l2box.value == 0:
                 lengthbox = v1.getstrlen(self, mode, None)
@@ -914,7 +921,8 @@
                 seo(op)
                 return True
             if l2box.value == 1:
-                l1box = i1.getstrlen(arg1, self, mode, False)
+                if i1:
+                    l1box = i1.getstrlen(arg1, self, mode, False)
                 if isinstance(l1box, ConstInt) and l1box.value == 1:
                     # comparing two single chars
                     vchar1 = self.strgetitem(resultop, arg1, optimizer.CONST_0, mode)
@@ -924,7 +932,7 @@
                                 [vchar1, vchar2], descr=DONT_CHANGE)
                     seo(op)
                     return True
-                if isinstance(v1, VStringSliceValue):
+                if isinstance(i1, VStringSliceInfo):
                     vchar = self.strgetitem(v2, optimizer.CVAL_ZERO, mode)
                     do = EffectInfo.OS_STREQ_SLICE_CHAR
                     self.generate_modified_call(do, [v1.vstr.force_box(self),
@@ -934,7 +942,7 @@
                                                      resultop, mode)
                     return True
         #
-        if i2.is_null():
+        if i2 and i2.is_null():
             if i1.is_nonnull():
                 self.make_constant(resultop, CONST_0)
                 return True
@@ -952,19 +960,20 @@
     def handle_str_equal_level2(self, arg1, arg2, resultbox, mode):
         i1 = self.getptrinfo(arg1)
         i2 = self.getptrinfo(arg2)
-        l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
+        l2box = None
+        if i2:
+            l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
         if l2box:
             l2info = self.getintbound(l2box)
             if l2info.is_constant():
                 if l2info.getint() == 1:
-                    vchar = self.strgetitem(v2, optimizer.CVAL_ZERO, mode)
-                    if v1.is_nonnull():
+                    vchar = self.strgetitem(None, arg2, optimizer.CONST_0, mode)
+                    if i1 and i1.is_nonnull():
                         do = EffectInfo.OS_STREQ_NONNULL_CHAR
                     else:
                         do = EffectInfo.OS_STREQ_CHECKNULL_CHAR
-                    self.generate_modified_call(do, [v1.force_box(self),
-                                                     vchar.force_box(self)], resultbox,
-                                                mode)
+                    self.generate_modified_call(do, [arg1, vchar],
+                                                resultbox, mode)
                     return True
             #
         if i1.is_virtual() and isinstance(i1, VStringSliceInfo):


More information about the pypy-commit mailing list