From 3e64cf60b5162bb5dad772f300b7f6346e5f83f9 Mon Sep 17 00:00:00 2001 From: Hiroya Fujinami Date: Wed, 25 Oct 2023 16:32:25 +0900 Subject: Fix [Bug #19632]: Disable external iterator for frozen enumerator (#7791) * Fix [Bug #19632]: Disable external iterator for frozen enumerator Currently, methods to manipulate an external iterator like `#next` and `#feed` can be called even if a receiver of an enumerator is frozen. However, these methods change the state of an external iterator in an enumerator. Therefore, it seems a BUG to me, and these methods should raise FrozenError if the receiver is frozen. This fixed the following methods to raise FrozenError if the receiver is frozen. - `Enumerator#next` - `Enumerator#next_values` - `Enumerator#peek` - `Enumerator#peek_values` - `Enumerator#feed` - `Enumerator#rewind` * Fix a typo in the document Thanks @Maumagnaguagno. --- test/ruby/test_enumerator.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'test/ruby') diff --git a/test/ruby/test_enumerator.rb b/test/ruby/test_enumerator.rb index bbaa91b703..d0dc3a8bc4 100644 --- a/test/ruby/test_enumerator.rb +++ b/test/ruby/test_enumerator.rb @@ -1008,4 +1008,14 @@ class TestEnumerator < Test::Unit::TestCase Enumerator.product(1..3, foo: 1, bar: 2) } end + + def test_freeze + e = 3.times.freeze + assert_raise(FrozenError) { e.next } + assert_raise(FrozenError) { e.next_values } + assert_raise(FrozenError) { e.peek } + assert_raise(FrozenError) { e.peek_values } + assert_raise(FrozenError) { e.feed 1 } + assert_raise(FrozenError) { e.rewind } + end end -- cgit v1.2.3