[pypy-commit] pypy wrap-bytes: hg merge SomeString-charclass

amauryfa noreply at buildbot.pypy.org
Tue Jul 15 15:43:56 CEST 2014


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: wrap-bytes
Changeset: r72446:a160002e8499
Date: 2014-07-13 23:02 +0200
http://bitbucket.org/pypy/pypy/changeset/a160002e8499/

Log:	hg merge SomeString-charclass

diff --git a/rpython/annotator/binaryop.py b/rpython/annotator/binaryop.py
--- a/rpython/annotator/binaryop.py
+++ b/rpython/annotator/binaryop.py
@@ -376,6 +376,16 @@
         return SomeString(can_be_None=can_be_None,
                           charkind=charkind)
 
+    def improve((obj, improvement)):
+        if obj.charkind.union(improvement.charkind) is obj.charkind:
+            charkind = improvement.charkind
+        else:
+            charkind = obj.charkind
+        if type(obj) is SomeString:
+            return type(improvement)(charkind=charkind)
+        else:
+            return type(obj)(charkind=charkind)
+
     def add((str1, str2)):
         # propagate const-ness to help getattr(obj, 'prefix' + const_name)
         charkind = str1.charkind.union(str2.charkind)
@@ -458,8 +468,15 @@
 class __extend__(pairtype(SomeString, SomeObject),
                  pairtype(SomeUnicodeString, SomeObject)):
 
-    def mod((s_string, args)):
-        return s_string.__class__()
+    def mod((s_string, s_item)):
+        charkind = s_string.charkind
+        if isinstance(s_item, SomeFloat):  # or a subclass, like SomeInteger
+            charkind = charkind.union(AsciiChar())
+        elif isinstance(s_item, (SomeString, SomeUnicodeString)):
+            charkind = charkind.union(s_item.charkind)
+        else:
+            charkind = AnyChar()  # Be conservative
+        return s_string.__class__(charkind=charkind)
 
 class __extend__(pairtype(SomeFloat, SomeFloat)):
 
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
@@ -3875,11 +3875,15 @@
             if i in chars:
                 return i
             else:
-                return None
+                return 'z'
         a = self.RPythonAnnotator()
         s = a.build_types(f, [annmodel.SomeString(charkind=annmodel.AnyChar())])
         assert isinstance(s, annmodel.SomeString)
-        assert s.can_be_None
+        assert s.charkind.is_ascii
+        #
+        a = self.RPythonAnnotator()
+        s = a.build_types(f, [annmodel.SomeChar(charkind=annmodel.AnyChar())])
+        assert isinstance(s, annmodel.SomeString)
         assert s.charkind.is_ascii
 
     def test_no___call__(self):
diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -9,7 +9,7 @@
     SomeString, SomeChar, SomeList, SomeDict, SomeTuple, SomeImpossibleValue,
     SomeUnicodeCodePoint, SomeInstance, SomeBuiltin, SomeBuiltinMethod,
     SomeFloat, SomeIterator, SomePBC, SomeNone, SomeType, s_ImpossibleValue,
-    s_Bool, s_None, unionof, add_knowntypedata, NoNulChar, AsciiChar,
+    s_Bool, s_None, unionof, add_knowntypedata, NoNulChar, AsciiChar, AnyChar,
     HarmlesslyBlocked, SomeWeakRef, SomeUnicodeString, SomeByteArray)
 from rpython.annotator.bookkeeper import getbookkeeper, immutablevalue
 from rpython.annotator import builtin
@@ -178,6 +178,9 @@
             return getbookkeeper().immutablevalue(bool(self.const))
         return s_Bool
 
+    def str(self):
+        return SomeString(charkind=AsciiChar)
+
 class __extend__(SomeInteger):
 
     def invert(self):
@@ -506,26 +509,20 @@
         return self.basestringclass(charkind=self.charkind)
 
     def op_contains(self, s_element):
-        if self.is_constant() and self.const.isalnum():
-            r = SomeBool()
+        r = SomeBool()
+        knowntypedata = {}
+        if self.charkind != AnyChar():
             bk = getbookkeeper()
             op = bk._find_current_op(opname="contains", arity=2, pos=0, s_type=self)
-            # raise TypeError(op.args)
-            knowntypedata = {}
             add_knowntypedata(knowntypedata, True, [op.args[1]],
-                              SomeString(charkind=AsciiChar()))
-            r.set_knowntypedata(knowntypedata)
-            return r
-        elif s_element.is_constant() and s_element.const == "\0":
-            r = SomeBool()
+                              s_element.basestringclass(charkind=self.charkind))
+        if s_element.is_constant() and s_element.const == "\0":
             bk = getbookkeeper()
             op = bk._find_current_op(opname="contains", arity=2, pos=0, s_type=self)
-            knowntypedata = {}
             add_knowntypedata(knowntypedata, False, [op.args[0]], self.nonnulify())
+        if knowntypedata:
             r.set_knowntypedata(knowntypedata)
-            return r
-        else:
-            return SomeObject.op_contains(self, s_element)
+        return r
     op_contains.can_only_throw = []
 
     def method_format(self, *args):


More information about the pypy-commit mailing list