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