diff options
author | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-02-11 19:33:46 +0000 |
---|---|---|
committer | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-02-11 19:33:46 +0000 |
commit | a1992e25b91d77866cd32f4b16fb666f5e89adf5 (patch) | |
tree | 01aaa9f1441d20e8b742ffa3fe41438837058835 | |
parent | ecbc694f4458fd6a434dab299bcf3bc5f2499fc9 (diff) | |
download | ruby-a1992e25b91d77866cd32f4b16fb666f5e89adf5.tar.gz |
* compar.c (cmp_equal): no more error hiding for Comparable#==.
It now behaves as other Comparable methods. See #7688.
* test/ruby/test_comparable.rb: update related test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49570 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | compar.c | 28 | ||||
-rw-r--r-- | test/ruby/test_comparable.rb | 14 |
3 files changed, 23 insertions, 26 deletions
@@ -1,3 +1,10 @@ +Thu Feb 12 04:33:02 2015 Benoit Daloze <eregontp@gmail.com> + + * compar.c (cmp_equal): no more error hiding for Comparable#==. + It now behaves as other Comparable methods. See #7688. + + * test/ruby/test_comparable.rb: update related test. + Thu Feb 12 03:28:05 2015 Eric Wong <e@80x24.org> * lib/set.rb (initialize): internal hash defaults to false @@ -57,24 +57,6 @@ cmp_eq_recursive(VALUE arg1, VALUE arg2, int recursive) return rb_funcallv(arg1, cmp, 1, &arg2); } -static VALUE -cmp_eq(VALUE *a) -{ - VALUE c = rb_exec_recursive_paired_outer(cmp_eq_recursive, a[0], a[1], a[1]); - - if (NIL_P(c)) return Qfalse; - if (rb_cmpint(c, a[0], a[1]) == 0) return Qtrue; - return Qfalse; -} - -static VALUE -cmp_failed(void) -{ - rb_warn("Comparable#== will no more rescue exceptions of #<=> in the next release."); - rb_warn("Return nil in #<=> if the comparison is inappropriate or avoid such comparison."); - return Qfalse; -} - /* * call-seq: * obj == other -> true or false @@ -90,12 +72,14 @@ cmp_failed(void) static VALUE cmp_equal(VALUE x, VALUE y) { - VALUE a[2]; - + VALUE c; if (x == y) return Qtrue; - a[0] = x; a[1] = y; - return rb_rescue(cmp_eq, (VALUE)a, cmp_failed, 0); + c = rb_exec_recursive_paired_outer(cmp_eq_recursive, x, y, y); + + if (NIL_P(c)) return Qfalse; + if (rb_cmpint(c, x, y) == 0) return Qtrue; + return Qfalse; } /* diff --git a/test/ruby/test_comparable.rb b/test/ruby/test_comparable.rb index efa630f8d9..dab6be5b27 100644 --- a/test/ruby/test_comparable.rb +++ b/test/ruby/test_comparable.rb @@ -17,12 +17,18 @@ class TestComparable < Test::Unit::TestCase assert_equal(true, @o == nil) cmp->(x) do 1; end assert_equal(false, @o == nil) + cmp->(x) do nil; end + assert_equal(false, @o == nil) + cmp->(x) do raise NotImplementedError, "Not a RuntimeError" end assert_raise(NotImplementedError) { @o == nil } - bug7688 = '[ruby-core:51389] [Bug #7688]' - cmp->(x) do raise StandardError, "A standard error should be rescued"; end - warn = /Comparable#== will no more rescue exceptions .+ in the next release/ - assert_warn(warn, bug7688) { @o == nil } + + bug7688 = 'Comparable#== should not silently rescue' \ + 'any Exception [ruby-core:51389] [Bug #7688]' + cmp->(x) do raise StandardError end + assert_raise(StandardError, bug7688) { @o == nil } + cmp->(x) do "bad value"; end + assert_raise(ArgumentError, bug7688) { @o == nil } end def test_gt |