aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--range.c17
-rw-r--r--test/ruby/test_range.rb8
3 files changed, 16 insertions, 15 deletions
diff --git a/NEWS b/NEWS
index 9c805927f6..399f1fe010 100644
--- a/NEWS
+++ b/NEWS
@@ -46,6 +46,12 @@ with all sufficient information, see the ChangeLog file or Redmine
of #coerce. Return nil in #coerce if the coercion is impossible.
[Feature #7688]
+* Range
+ * Range#initialize no longer rescue exceptions when comparing begin and
+ end with #<=> and raise a "bad value for range" ArgumentError
+ but instead let the exception from the #<=> call go through.
+ [Feature #7688]
+
* Regexp
* Update Onigmo 6.1.1.
* Support absent operator https://github.com/k-takata/Onigmo/issues/82
diff --git a/range.c b/range.c
index 422ed29f15..837fdb5d9c 100644
--- a/range.c
+++ b/range.c
@@ -34,19 +34,6 @@ static VALUE r_cover_p(VALUE, VALUE, VALUE, VALUE);
#define EXCL(r) RTEST(RANGE_EXCL(r))
-static VALUE
-range_failed(void)
-{
- rb_raise(rb_eArgError, "bad value for range");
- return Qnil; /* dummy */
-}
-
-static VALUE
-range_check(VALUE *args)
-{
- return rb_funcall(args[0], id_cmp, 1, args[1]);
-}
-
static void
range_init(VALUE range, VALUE beg, VALUE end, VALUE exclude_end)
{
@@ -58,9 +45,9 @@ range_init(VALUE range, VALUE beg, VALUE end, VALUE exclude_end)
if (!FIXNUM_P(beg) || !FIXNUM_P(end)) {
VALUE v;
- v = rb_rescue(range_check, (VALUE)args, range_failed, 0);
+ v = rb_funcall(beg, id_cmp, 1, end);
if (NIL_P(v))
- range_failed();
+ rb_raise(rb_eArgError, "bad value for range");
}
RANGE_SET_EXCL(range, exclude_end);
diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb
index 3743e9dda6..66c4682d8d 100644
--- a/test/ruby/test_range.rb
+++ b/test/ruby/test_range.rb
@@ -9,6 +9,14 @@ class TestRange < Test::Unit::TestCase
assert_equal((0..2), Range.new(0, 2))
assert_equal((0..2), Range.new(0, 2, false))
assert_equal((0...2), Range.new(0, 2, true))
+
+ assert_raise(ArgumentError) { (1.."3") }
+
+ obj = Object.new
+ def obj.<=>(other)
+ raise RuntimeError, "cmp"
+ end
+ assert_raise_with_message(RuntimeError, "cmp") { (obj..3) }
end
def test_frozen_initialize