summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKouhei Yanagita <[email protected]>2022-01-27 14:37:48 +0900
committerYusuke Endoh <[email protected]>2023-11-28 15:10:42 +0900
commit1a16b6ffc2d48b93c730cd6e57fac6a68fa05737 (patch)
tree145e78e425d318cabe919d26a9e09a95269cab9e
parent0164da68c170c7f1e36dd70965b67c8c63523391 (diff)
Make Range#reverse_each raise TypeError if endless
-rw-r--r--range.c5
-rw-r--r--test/ruby/test_range.rb8
2 files changed, 13 insertions, 0 deletions
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']