From: Hiroshi NAKAMURA Date: 2011-06-26T17:31:01+09:00 Subject: [ruby-dev:43924] [Ruby 1.9 - Bug #982] stack level too deep for long Array initialization Issue #982 has been updated by Hiroshi NAKAMURA. Target version changed from 1.9.x to 1.9.3 ---------------------------------------- Bug #982: stack level too deep for long Array initialization http://redmine.ruby-lang.org/issues/982 Author: Martin Dürst Status: Assigned Priority: Normal Assignee: Koichi Sasada Category: YARV Target version: 1.9.3 ruby -v: - =begin 次のスクリプトが stack level too deep (SystemStackError) で終わります。 ruby -e 'puts "A=["; 0.upto(1000000) { puts " [22, 55]," }; puts "]"' | ruby これは Bug #943 [ruby-dev:37646] のコピーで、長期的にどうするのか を考えるとめのバグです。 ruby -e 'puts "A=[]"; 0.upto(1000000) { puts "A<<[22, 55]" }' | ruby で意図のものができるが、どうしてもデータの初期化を宣言的でできなく、 手続的にしないといけないのはよくないと思っています。ユーザから見ると メゾドの深い呼び出しなどがスタックオーバフローになるのは分かるはず ですが、データの初期化だけでそういう問題になるのはビックリする でしょう。 笹田さんによりますと、 > 上記例のように,空の配列を作って,それに push するように変更することも >可能ですが,それを出来るようにしたほうがいいですかねぇ.するにしても, >1.9.2 で命令追加ってことになると思いますが.そう変更したら,ちょっと速度 >が遅くなるってくらいかなぁ. もう一つのやり方は stack level too deep になったときに、スタックにある 配列の要素を一気に配列に追加し、次の要素からまだスタックに載せること が考えられる。でも、こういうのを実装するのはどのぐらい難しいでしょうか。 よろしくお願いします。 Martin. =end -- http://redmine.ruby-lang.org