From: "shugo (Shugo Maeda)" Date: 2012-04-12T19:00:36+09:00 Subject: [ruby-dev:45511] [ruby-trunk - Bug #982] stack level too deep for long Array initialization Issue #982 has been updated by shugo (Shugo Maeda). 前田です。 ko1 (Koichi Sasada) wrote: > なおしました. > 命令をいじるのではなく,core メソッドを呼ぶようにしてみました. > ちょっと,余計な配列が増えちゃうのが良くないかも.... > 誰か性能評価してくれると助かります. 内容はぜんぜん追っていないのですが、r35306のcommitから以下のような警告が出るようになっているようです。 compile.c: 関数 ‘iseq_compile_each’ 内: compile.c:4363:8: 警告: 変数 ‘size’ が設定されましたが使用されていません [-Wunused-but-set-variable] たしかに使われなくなっているように見えるのですが、これはこういうものでしょうか。 ---------------------------------------- Bug #982: stack level too deep for long Array initialization https://bugs.ruby-lang.org/issues/982#change-25852 Author: duerst (Martin Dürst) Status: Closed Priority: Normal Assignee: ko1 (Koichi Sasada) Category: YARV Target version: 2.0.0 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://bugs.ruby-lang.org/