From: "tarui (Masaya Tarui)" Date: 2013-11-13T10:50:11+09:00 Subject: [ruby-dev:47803] [ruby-trunk - Bug #9105][Open] callcc による不整合(例:Hash) Issue #9105 has been reported by tarui (Masaya Tarui). ---------------------------------------- Bug #9105: callcc による不整合(例:Hash) https://bugs.ruby-lang.org/issues/9105 Author: tarui (Masaya Tarui) Status: Open Priority: Normal Assignee: Category: core Target version: current: 2.1.0 ruby -v: ruby 2.1.0dev (2013-11-11 trunk 43647) [x86_64-linux] Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN =begin 以下のコードを実行すると、 equire 'continuation' h = {1=>2,3=>4} c = nil f = false h.each { callcc {|c2| c = c2 } } unless f f = true c.call end h.each {|i| h.delete(1); p i} 以下のような結果になります。 [1, 2] [false, false] test.rb:10:in `each': hash modified during iteration (RuntimeError) from test.rb:10:in `
' [false, false]自体はst_foreach_checkで全く機能していない /* call func with error notice */ retval = (*func)(0, 0, arg, 1); を消せばいいのですが、 RuntimeErrorが発生するのはcallccによりhash_foreach_ensureの実行が2重に行われて、 RHASH_ITER_LEV(hash)の管理が破綻してしまっている為です。 他の所でも容易に起こりうると思うのですが、未調査です。 &そもそもどう対処すべきでしょう? =end -- http://bugs.ruby-lang.org/