mruby-range-ext (range_size): raise TypeError if not iterable

According ruby/ruby#8663, `Range#size` behavior has changed.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2024-05-28 15:30:08 +09:00
parent f2dc44215c
commit f1dec3959f
2 changed files with 10 additions and 4 deletions
+10 -1
View File
@@ -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();
}
-3
View File
@@ -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