Author: Tim Felgentreff <[email protected]>
Branch:
Changeset: r62314:391735663777
Date: 2013-03-12 14:45 +0100
http://bitbucket.org/pypy/pypy/changeset/391735663777/
Log: (cfbolz, timfel) annotate strings with no_nul=True if '\0' in str is
true
diff --git a/rpython/annotator/model.py b/rpython/annotator/model.py
--- a/rpython/annotator/model.py
+++ b/rpython/annotator/model.py
@@ -233,6 +233,9 @@
def nonnoneify(self):
return self.__class__(can_be_None=False, no_nul=self.no_nul)
+ def nonnulify(self):
+ return self.__class__(can_be_None=self.can_be_None, no_nul=True)
+
class SomeString(SomeStringOrUnicode):
"Stands for an object which is known to be a string."
knowntype = str
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
@@ -3762,6 +3762,19 @@
assert isinstance(s, annmodel.SomeString)
assert not s.can_be_None
+ def test_contains_no_nul(self):
+ def f(i):
+ if "\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.SomeString(no_nul=False)])
+ assert isinstance(s, annmodel.SomeString)
+ assert s.can_be_None
+ assert s.no_nul
+
def test_no___call__(self):
class X(object):
def __call__(self):
diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -512,6 +512,20 @@
result = str.basestringclass(no_nul=str.no_nul)
return result
+ def op_contains(str, s_element):
+ if s_element.is_constant() and s_element.const == "\0":
+ r = SomeBool()
+ bk = getbookkeeper()
+ op = bk._find_current_op(opname="contains", arity=2, pos=0,
s_type=str)
+ knowntypedata = {}
+ add_knowntypedata(knowntypedata, False, [op.args[0]],
str.nonnulify())
+ r.set_knowntypedata(knowntypedata)
+ return r
+ else:
+ return SomeObject.op_contains(str, s_element)
+ op_contains.can_only_throw = []
+
+
class __extend__(SomeUnicodeString):
def method_encode(uni, s_enc):
if not s_enc.is_constant():
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit