Author: Armin Rigo <[email protected]>
Branch:
Changeset: r69886:2ab068f12ff3
Date: 2014-03-12 08:23 +0100
http://bitbucket.org/pypy/pypy/changeset/2ab068f12ff3/
Log: Fix shown by test_streamio
diff --git a/rpython/rtyper/rtuple.py b/rpython/rtyper/rtuple.py
--- a/rpython/rtyper/rtuple.py
+++ b/rpython/rtyper/rtuple.py
@@ -290,14 +290,15 @@
if not s_tup.is_constant():
raise TyperError("contains() on non-const tuple")
t = s_tup.const
- if len(t) == 0:
- hop.exception_cannot_occur()
- return hop.inputconst(Bool, False)
+ s_item = hop.args_s[1]
r_item = hop.args_r[1]
v_arg = hop.inputarg(r_item, arg=1)
ll_eq = r_item.get_ll_eq_function() or _ll_equal
v_result = None
for x in t:
+ s_const_item = hop.rtyper.annotator.bookkeeper.immutablevalue(x)
+ if not s_item.contains(s_const_item):
+ continue # corner case, see test_constant_tuple_contains_bug
c_tuple_item = hop.inputconst(r_item, x)
v_equal = hop.gendirectcall(ll_eq, v_arg, c_tuple_item)
if v_result is None:
diff --git a/rpython/rtyper/test/test_rtuple.py
b/rpython/rtyper/test/test_rtuple.py
--- a/rpython/rtyper/test/test_rtuple.py
+++ b/rpython/rtyper/test/test_rtuple.py
@@ -95,6 +95,14 @@
res = self.interpret(f, [50])
assert res is False
+ def test_constant_tuple_contains_bug(self):
+ def f(i):
+ return chr(i) in ('1', '2', '34') # the '34' can never match
+ res = self.interpret(f, [ord('1')])
+ assert res is True
+ res = self.interpret(f, [ord('3')])
+ assert res is False
+
def test_conv(self):
def t0():
return (3, 2, None)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit