mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
no longer rescue exceptions of #<=> when initializing a Range
* range.c (range_init): no longer hide the user exception with a ArgumentError, just let the user exception go through. * test/ruby/test_range.rb (test_new): add tests. [Feature #7688] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58476 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
413cece5c9
commit
ead61f4ac8
3 changed files with 16 additions and 15 deletions
6
NEWS
6
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.
|
of #coerce. Return nil in #coerce if the coercion is impossible.
|
||||||
[Feature #7688]
|
[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
|
* Regexp
|
||||||
* Update Onigmo 6.1.1.
|
* Update Onigmo 6.1.1.
|
||||||
* Support absent operator https://github.com/k-takata/Onigmo/issues/82
|
* Support absent operator https://github.com/k-takata/Onigmo/issues/82
|
||||||
|
|
17
range.c
17
range.c
|
@ -34,19 +34,6 @@ static VALUE r_cover_p(VALUE, VALUE, VALUE, VALUE);
|
||||||
|
|
||||||
#define EXCL(r) RTEST(RANGE_EXCL(r))
|
#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
|
static void
|
||||||
range_init(VALUE range, VALUE beg, VALUE end, VALUE exclude_end)
|
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)) {
|
if (!FIXNUM_P(beg) || !FIXNUM_P(end)) {
|
||||||
VALUE v;
|
VALUE v;
|
||||||
|
|
||||||
v = rb_rescue(range_check, (VALUE)args, range_failed, 0);
|
v = rb_funcall(beg, id_cmp, 1, end);
|
||||||
if (NIL_P(v))
|
if (NIL_P(v))
|
||||||
range_failed();
|
rb_raise(rb_eArgError, "bad value for range");
|
||||||
}
|
}
|
||||||
|
|
||||||
RANGE_SET_EXCL(range, exclude_end);
|
RANGE_SET_EXCL(range, exclude_end);
|
||||||
|
|
|
@ -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))
|
||||||
assert_equal((0..2), Range.new(0, 2, false))
|
assert_equal((0..2), Range.new(0, 2, false))
|
||||||
assert_equal((0...2), Range.new(0, 2, true))
|
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
|
end
|
||||||
|
|
||||||
def test_frozen_initialize
|
def test_frozen_initialize
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue