Author: Armin Rigo <[email protected]>
Branch:
Changeset: r79729:998686594ede
Date: 2015-09-21 08:45 +0200
http://bitbucket.org/pypy/pypy/changeset/998686594ede/
Log: Copy all tests about "no_nul" in strings to test "no_nul" in unicode
strings. Add a lot of corresponding missing cases in the code.
diff --git a/rpython/annotator/binaryop.py b/rpython/annotator/binaryop.py
--- a/rpython/annotator/binaryop.py
+++ b/rpython/annotator/binaryop.py
@@ -385,7 +385,8 @@
class __extend__(pairtype(SomeUnicodeCodePoint, SomeUnicodeCodePoint)):
def union((uchr1, uchr2)):
- return SomeUnicodeCodePoint()
+ no_nul = uchr1.no_nul and uchr2.no_nul
+ return SomeUnicodeCodePoint(no_nul=no_nul)
def add((chr1, chr2)):
return SomeUnicodeString()
@@ -598,32 +599,33 @@
class __extend__(pairtype(SomeUnicodeString, SomeInteger)):
def getitem((str1, int2)):
- return SomeUnicodeCodePoint()
+ return SomeUnicodeCodePoint(no_nul=str1.no_nul)
getitem.can_only_throw = []
def getitem_idx((str1, int2)):
- return SomeUnicodeCodePoint()
+ return SomeUnicodeCodePoint(no_nul=str1.no_nul)
getitem_idx.can_only_throw = [IndexError]
def mul((str1, int2)): # xxx do we want to support this
- return SomeUnicodeString()
+ return SomeUnicodeString(no_nul=str1.no_nul)
class __extend__(pairtype(SomeInteger, SomeString),
pairtype(SomeInteger, SomeUnicodeString)):
def mul((int1, str2)): # xxx do we want to support this
- return str2.basestringclass()
+ return str2.basestringclass(no_nul=str2.no_nul)
class __extend__(pairtype(SomeUnicodeCodePoint, SomeUnicodeString),
pairtype(SomeUnicodeString, SomeUnicodeCodePoint),
pairtype(SomeUnicodeString, SomeUnicodeString)):
def union((str1, str2)):
- return SomeUnicodeString(can_be_None=str1.can_be_none() or
- str2.can_be_none())
+ can_be_None = str1.can_be_None or str2.can_be_None
+ no_nul = str1.no_nul and str2.no_nul
+ return SomeUnicodeString(can_be_None=can_be_None, no_nul=no_nul)
def add((str1, str2)):
# propagate const-ness to help getattr(obj, 'prefix' + const_name)
- result = SomeUnicodeString()
+ result = SomeUnicodeString(no_nul=str1.no_nul and str2.no_nul)
if str1.is_immutable_constant() and str2.is_immutable_constant():
result.const = str1.const + str2.const
return result
diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py
--- a/rpython/annotator/bookkeeper.py
+++ b/rpython/annotator/bookkeeper.py
@@ -237,10 +237,11 @@
else:
result = SomeString(no_nul=no_nul)
elif tp is unicode:
+ no_nul = not u'\x00' in x
if len(x) == 1:
- result = SomeUnicodeCodePoint()
+ result = SomeUnicodeCodePoint(no_nul=no_nul)
else:
- result = SomeUnicodeString()
+ result = SomeUnicodeString(no_nul=no_nul)
elif tp is bytearray:
result = SomeByteArray()
elif tp is tuple:
diff --git a/rpython/annotator/test/test_annrpython.py
b/rpython/annotator/test/test_annrpython.py
--- a/rpython/annotator/test/test_annrpython.py
+++ b/rpython/annotator/test/test_annrpython.py
@@ -438,6 +438,18 @@
assert s.knowntype == str
assert s.no_nul
+ def test_unicode_join(self):
+ a = self.RPythonAnnotator()
+ def g(n):
+ if n:
+ return [u"foo", u"bar"]
+ def f(n):
+ g(0)
+ return u''.join(g(n))
+ s = a.build_types(f, [int])
+ assert s.knowntype == unicode
+ assert s.no_nul
+
def test_str_split(self):
a = self.RPythonAnnotator()
def g(n):
@@ -451,6 +463,19 @@
s_item = s.listdef.listitem.s_value
assert s_item.no_nul
+ def test_unicode_split(self):
+ a = self.RPythonAnnotator()
+ def g(n):
+ if n:
+ return u"test string"
+ def f(n):
+ if n:
+ return g(n).split(u' ')
+ s = a.build_types(f, [int])
+ assert isinstance(s, annmodel.SomeList)
+ s_item = s.listdef.listitem.s_value
+ assert s_item.no_nul
+
def test_str_split_nul(self):
def f(n):
return n.split('\0')[0]
@@ -470,6 +495,27 @@
assert not s.can_be_None
assert not s.no_nul
+ def test_unicode_split_nul(self):
+ def f(n):
+ return n.split(u'\0')[0]
+ a = self.RPythonAnnotator()
+ a.translator.config.translation.check_str_without_nul = True
+ s = a.build_types(f, [annmodel.SomeUnicodeString(
+ no_nul=False, can_be_None=False)])
+ assert isinstance(s, annmodel.SomeUnicodeString)
+ assert not s.can_be_None
+ assert s.no_nul
+
+ def g(n):
+ return n.split(u'\0', 1)[0]
+ a = self.RPythonAnnotator()
+ a.translator.config.translation.check_str_without_nul = True
+ s = a.build_types(g, [annmodel.SomeUnicodeString(
+ no_nul=False, can_be_None=False)])
+ assert isinstance(s, annmodel.SomeUnicodeString)
+ assert not s.can_be_None
+ assert not s.no_nul
+
def test_str_splitlines(self):
a = self.RPythonAnnotator()
def f(a_str):
@@ -490,6 +536,18 @@
s = a.build_types(f, [int, annmodel.SomeString(no_nul=True)])
assert s.no_nul
+ def test_unicode_strip(self):
+ a = self.RPythonAnnotator()
+ def f(n, a_str):
+ if n == 0:
+ return a_str.strip(u' ')
+ elif n == 1:
+ return a_str.rstrip(u' ')
+ else:
+ return a_str.lstrip(u' ')
+ s = a.build_types(f, [int, annmodel.SomeUnicodeString(no_nul=True)])
+ assert s.no_nul
+
def test_str_mul(self):
a = self.RPythonAnnotator()
def f(a_str):
@@ -2042,6 +2100,17 @@
assert s.can_be_None
assert s.no_nul
+ def test_unicode_noNUL_canbeNone(self):
+ def f(a):
+ if a:
+ return u"abc"
+ else:
+ return None
+ a = self.RPythonAnnotator()
+ s = a.build_types(f, [int])
+ assert s.can_be_None
+ assert s.no_nul
+
def test_str_or_None(self):
def f(a):
if a:
@@ -2058,6 +2127,22 @@
assert s.can_be_None
assert s.no_nul
+ def test_unicode_or_None(self):
+ def f(a):
+ if a:
+ return u"abc"
+ else:
+ return None
+ def g(a):
+ x = f(a)
+ if x is None:
+ return u"abcd"
+ return x
+ a = self.RPythonAnnotator()
+ s = a.build_types(f, [int])
+ assert s.can_be_None
+ assert s.no_nul
+
def test_emulated_pbc_call_simple(self):
def f(a,b):
return a + b
@@ -2124,6 +2209,19 @@
assert isinstance(s, annmodel.SomeString)
assert s.no_nul
+ def test_iteritems_unicode0(self):
+ def it(d):
+ return d.iteritems()
+ def f():
+ d0 = {u'1a': u'2a', u'3': u'4'}
+ for item in it(d0):
+ return u"%s=%s" % item
+ raise ValueError
+ a = self.RPythonAnnotator()
+ s = a.build_types(f, [])
+ assert isinstance(s, annmodel.SomeUnicodeString)
+ assert s.no_nul
+
def test_no_nul_mod(self):
def f(x):
s = "%d" % x
@@ -2133,6 +2231,14 @@
assert isinstance(s, annmodel.SomeString)
assert s.no_nul
+ def test_no_nul_mod_unicode(self):
+ def f(x):
+ s = u"%d" % x
+ return s
+ a = self.RPythonAnnotator()
+ s = a.build_types(f, [int])
+ assert isinstance(s, annmodel.SomeUnicodeString)
+ assert s.no_nul
def test_mul_str0(self):
def f(s):
@@ -2142,6 +2248,24 @@
assert isinstance(s, annmodel.SomeString)
assert s.no_nul
+ a = self.RPythonAnnotator()
+ s = a.build_types(f, [annmodel.SomeUnicodeString(no_nul=True)])
+ assert isinstance(s, annmodel.SomeUnicodeString)
+ assert s.no_nul
+
+ def test_reverse_mul_str0(self):
+ def f(s):
+ return 10*s
+ a = self.RPythonAnnotator()
+ s = a.build_types(f, [annmodel.SomeString(no_nul=True)])
+ assert isinstance(s, annmodel.SomeString)
+ assert s.no_nul
+
+ a = self.RPythonAnnotator()
+ s = a.build_types(f, [annmodel.SomeUnicodeString(no_nul=True)])
+ assert isinstance(s, annmodel.SomeUnicodeString)
+ assert s.no_nul
+
def test_getitem_str0(self):
def f(s, n):
if n == 1:
@@ -2153,12 +2277,18 @@
return s
a = self.RPythonAnnotator()
a.translator.config.translation.check_str_without_nul = True
-
s = a.build_types(f, [annmodel.SomeString(no_nul=True),
annmodel.SomeInteger()])
assert isinstance(s, annmodel.SomeString)
assert s.no_nul
+ a = self.RPythonAnnotator()
+ a.translator.config.translation.check_str_without_nul = True
+ s = a.build_types(f, [annmodel.SomeUnicodeString(no_nul=True),
+ annmodel.SomeInteger()])
+ assert isinstance(s, annmodel.SomeUnicodeString)
+ assert s.no_nul
+
def test_non_none_and_none_with_isinstance(self):
class A(object):
pass
@@ -3411,6 +3541,7 @@
a = self.RPythonAnnotator()
s = a.build_types(f, [unicode])
assert isinstance(s, annmodel.SomeUnicodeString)
+ assert s.no_nul
def test_unicode_char(self):
def f(x, i):
@@ -3916,6 +4047,19 @@
assert s.can_be_None
assert s.no_nul
+ def test_contains_no_nul_unicode(self):
+ def f(i):
+ if u"\0" in i:
+ return None
+ else:
+ return i
+ a = self.RPythonAnnotator()
+ a.translator.config.translation.check_str_without_nul = True
+ s = a.build_types(f, [annmodel.SomeUnicodeString(no_nul=False)])
+ assert isinstance(s, annmodel.SomeUnicodeString)
+ assert s.can_be_None
+ assert s.no_nul
+
def test_no___call__(self):
class X(object):
def __call__(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit