Issue #982 has been updated by ko1 (Koichi Sasada).

Status changed from Assigned to Closed

なおしました.
命令をいじるのではなく,core メソッドを呼ぶようにしてみました.
ちょっと,余計な配列が増えちゃうのが良くないかも....
誰か性能評価してくれると助かります.

----------------------------------------
Bug #982: stack level too deep for long Array initialization
https://bugs.ruby-lang.org/issues/982#change-25845

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/