Revert the override of Enumerator#to_set that performed size checks

[Bug #21780]
This commit is contained in:
Akinori Musha 2025-12-17 17:30:24 +09:00
parent 54d3945ee5
commit 79f36c544a
4 changed files with 8 additions and 30 deletions

View File

@ -188,8 +188,8 @@ Note: We're only listing outstanding class updates.
* Range
* `Range#to_set` and `Enumerator#to_set` now perform size checks to prevent
issues with endless ranges. [[Bug #21654]]
* `Range#to_set` now performs size checks to prevent issues with
endless ranges. [[Bug #21654]]
* `Range#overlap?` now correctly handles infinite (unbounded) ranges.
[[Bug #21185]]

View File

@ -3366,24 +3366,6 @@ enumerator_plus(VALUE obj, VALUE eobj)
return new_enum_chain(rb_ary_new_from_args(2, obj, eobj));
}
/*
* call-seq:
* e.to_set -> set
*
* Returns a set generated from this enumerator.
*
* e = Enumerator.new { |y| y << 1 << 1 << 2 << 3 << 5 }
* e.to_set #=> #<Set: {1, 2, 3, 5}>
*/
static VALUE enumerator_to_set(int argc, VALUE *argv, VALUE obj)
{
VALUE size = rb_funcall(obj, id_size, 0);
if (RB_TYPE_P(size, T_FLOAT) && RFLOAT_VALUE(size) == INFINITY) {
rb_raise(rb_eArgError, "cannot convert an infinite enumerator to a set");
}
return rb_call_super(argc, argv);
}
/*
* Document-class: Enumerator::Product
*
@ -4540,7 +4522,6 @@ InitVM_Enumerator(void)
rb_define_method(rb_cEnumerator, "rewind", enumerator_rewind, 0);
rb_define_method(rb_cEnumerator, "inspect", enumerator_inspect, 0);
rb_define_method(rb_cEnumerator, "size", enumerator_size, 0);
rb_define_method(rb_cEnumerator, "to_set", enumerator_to_set, -1);
rb_define_method(rb_cEnumerator, "+", enumerator_plus, 1);
rb_define_method(rb_mEnumerable, "chain", enum_chain, -1);

View File

@ -1070,13 +1070,4 @@ class TestEnumerator < Test::Unit::TestCase
enum = ary.each
assert_equal(35.0, enum.sum)
end
def test_to_set
e = Enumerator.new { it << 1 << 1 << 2 << 3 << 5 }
set = e.to_set
assert_equal(Set[1, 2, 3, 5], set)
ei = Enumerator.new(Float::INFINITY) { it << 1 << 1 << 2 << 3 << 5 }
assert_raise(ArgumentError) { ei.to_set }
end
end

View File

@ -1003,6 +1003,12 @@ class TC_Enumerable < Test::Unit::TestCase
set = assert_nothing_raised { enum.to_set }
assert(set.is_a?(Set))
assert_equal(Set[1,2,3], set)
enumerator = enum.to_enum
set = assert_nothing_raised { enumerator.to_set }
assert(set.is_a?(Set))
assert_equal(Set[1,2,3], set)
end
end