[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