aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--compar.c28
-rw-r--r--test/ruby/test_comparable.rb14
3 files changed, 23 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog
index 7849662b2a..bb65b00fbc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/compar.c b/compar.c
index 3d0a3e81dc..6eb34ed794 100644
--- a/compar.c
+++ b/compar.c
@@ -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