From f1dec3959f11675399d159be34150d5b405b9f97 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 28 May 2024 15:30:08 +0900 Subject: [PATCH] mruby-range-ext (range_size): raise TypeError if not iterable According ruby/ruby#8663, `Range#size` behavior has changed. --- mrbgems/mruby-range-ext/src/range.c | 11 ++++++++++- mrbgems/mruby-range-ext/test/range.rb | 3 --- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/mrbgems/mruby-range-ext/src/range.c b/mrbgems/mruby-range-ext/src/range.c index babc0d931..b8fec473b 100644 --- a/mrbgems/mruby-range-ext/src/range.c +++ b/mrbgems/mruby-range-ext/src/range.c @@ -111,7 +111,13 @@ range_size(mrb_state *mrb, mrb_value range) mrb_value beg = RANGE_BEG(r); mrb_value end = RANGE_END(r); - if ((mrb_integer_p(beg) || mrb_float_p(beg)) && mrb_nil_p(end)) { + if (mrb_float_p(beg)) { + mrb_raise(mrb, E_TYPE_ERROR, "can't iterate from Float"); + } + if (mrb_nil_p(beg)) { + mrb_raise(mrb, E_TYPE_ERROR, "can't iterate from nil"); + } + if (mrb_integer_p(beg) && mrb_nil_p(end)) { return mrb_float_value(mrb, INFINITY); } @@ -167,6 +173,9 @@ range_size(mrb_state *mrb, mrb_value range) mrb_value beg = RANGE_BEG(r); mrb_value end = RANGE_END(r); + if (mrb_nil_p(beg)) { + mrb_raise(mrb, E_TYPE_ERROR, "can't iterate from nil"); + } if (mrb_integer_p(beg) && mrb_nil_p(end)) { return mrb_nil_value(); } diff --git a/mrbgems/mruby-range-ext/test/range.rb b/mrbgems/mruby-range-ext/test/range.rb index d37712926..96ced593e 100644 --- a/mrbgems/mruby-range-ext/test/range.rb +++ b/mrbgems/mruby-range-ext/test/range.rb @@ -55,13 +55,10 @@ assert('Range#size') do skip unless Object.const_defined?(:Float) assert_equal 6, (1...6.3).size assert_equal 5, (1...6.0).size - assert_equal 5, (1.1...6).size - assert_equal 15, (1.0..15.9).size assert_equal Float::INFINITY, (0..Float::INFINITY).size assert_equal Float::INFINITY, (1..).size assert_equal Float::INFINITY, (1...).size - assert_equal Float::INFINITY, (1.0..).size end assert('Range#max') do