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

Reply via email to