From 1a16b6ffc2d48b93c730cd6e57fac6a68fa05737 Mon Sep 17 00:00:00 2001 From: Kouhei Yanagita Date: Thu, 27 Jan 2022 14:37:48 +0900 Subject: [PATCH] Make Range#reverse_each raise TypeError if endless --- range.c | 5 +++++ test/ruby/test_range.rb | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/range.c b/range.c index 91c0d2783c..9e55e89c5f 100644 --- a/range.c +++ b/range.c @@ -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']