From d43facd1ba1fd927f7f74e9acba18c5205bc7e3d Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Mon, 4 Feb 2013 22:22:03 +0100 Subject: [PATCH] disable incorrect optimisation for set.discard() --- Cython/Compiler/Builtin.py | 5 ++-- tests/run/set_discard_remove.py | 66 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 tests/run/set_discard_remove.py diff --git a/Cython/Compiler/Builtin.py b/Cython/Compiler/Builtin.py index d9f8943..085c8b2 100644 --- a/Cython/Compiler/Builtin.py +++ b/Cython/Compiler/Builtin.py @@ -380,8 +380,9 @@ builtin_types_table = [ ("set", "PySet_Type", [BuiltinMethod("clear", "T", "r", "PySet_Clear", utility_code = py_set_utility_code), - BuiltinMethod("discard", "TO", "r", "PySet_Discard", - utility_code = py_set_utility_code), + # discard() and remove() have a special treatment for unhashable values +# BuiltinMethod("discard", "TO", "r", "PySet_Discard", +# utility_code = py_set_utility_code), BuiltinMethod("add", "TO", "r", "PySet_Add", utility_code = py_set_utility_code), BuiltinMethod("pop", "T", "O", "PySet_Pop", diff --git a/tests/run/set_discard_remove.py b/tests/run/set_discard_remove.py new file mode 100644 index 0000000..2313191 --- /dev/null +++ b/tests/run/set_discard_remove.py @@ -0,0 +1,66 @@ + +def set_discard(): + """ + >>> sorted(set_discard()) + [1, 2] + """ + s = set([1,2,3]) + s.discard(3) + return s + + +def set_discard_missing(): + """ + >>> sorted(set_discard_missing()) + [1, 2, 3] + """ + s = set([1,2,3]) + s.discard(4) + return s + + +def set_discard_set(): + """ + >>> s = set_discard_set() + >>> len(s) + 1 + >>> sorted(s.pop()) + [1, 2] + """ + s = set([frozenset([1,2]), frozenset([2,3])]) + s.discard(set([2,3])) + return s + + +def set_remove(): + """ + >>> sorted(set_remove()) + [1, 2] + """ + s = set([1,2,3]) + s.remove(3) + return s + + +def set_remove_missing(): + """ + >>> sorted(set_remove_missing()) + Traceback (most recent call last): + KeyError: 4 + """ + s = set([1,2,3]) + s.remove(4) + return s + + +def set_remove_set(): + """ + >>> s = set_remove_set() + >>> len(s) + 1 + >>> sorted(s.pop()) + [1, 2] + """ + s = set([frozenset([1,2]), frozenset([2,3])]) + s.remove(set([2,3])) + return s -- 2.7.4