1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
eregon 2015-02-11 19:33:46 +00:00
parent ecbc694f44
commit a1992e25b9
3 changed files with 23 additions and 26 deletions

View file

@ -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

View file

@ -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;
}
/*

View file

@ -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