Project

General

Profile

Bug #982

stack level too deep for long Array initialization

Added by duerst (Martin Dürst) over 11 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
-
Backport:
[ruby-dev:37701]

Description

=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


Related issues

Related to Ruby master - Bug #4040: SystemStackError with Hash[*a] for Large _a_Assignedko1 (Koichi Sasada)Actions

Also available in: Atom PDF