[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