diff options
author | Kouhei Yanagita <[email protected]> | 2022-01-27 14:37:48 +0900 |
---|---|---|
committer | Yusuke Endoh <[email protected]> | 2023-11-28 15:10:42 +0900 |
commit | 1a16b6ffc2d48b93c730cd6e57fac6a68fa05737 (patch) | |
tree | 145e78e425d318cabe919d26a9e09a95269cab9e | |
parent | 0164da68c170c7f1e36dd70965b67c8c63523391 (diff) |
Make Range#reverse_each raise TypeError if endless
-rw-r--r-- | range.c | 5 | ||||
-rw-r--r-- | test/ruby/test_range.rb | 8 |
2 files changed, 13 insertions, 0 deletions
@@ -1133,6 +1133,11 @@ range_reverse_each(VALUE range) VALUE end = RANGE_END(range); int excl = EXCL(range); + if (NIL_P(end)) { + rb_raise(rb_eTypeError, "can't iterate from %s", + rb_obj_classname(end)); + } + if (FIXNUM_P(beg) && FIXNUM_P(end)) { if (excl) { if (end == LONG2FIX(FIXNUM_MIN)) return range; diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index 5e3dbb349e..bda206d766 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -582,6 +582,14 @@ class TestRange < Test::Unit::TestCase assert_equal([fmin-2, fmin-3], a) end + def test_reverse_each_for_endless_range + assert_raise(TypeError) { (1..).reverse_each {} } + + enum = nil + assert_nothing_raised { enum = (1..).reverse_each } + assert_raise(TypeError) { enum.each {} } + end + def test_reverse_each_for_single_point_range fmin = RbConfig::LIMITS['FIXNUM_MIN'] fmax = RbConfig::LIMITS['FIXNUM_MAX'] |