[exerb-dev:0586] Re: 再帰的プログラムでの強制終了

Back to archive index

MURASE Masamitsu masam****@gmail*****
2012年 4月 22日 (日) 15:54:49 JST


村瀬と申します。
いつもお世話になっています。

以前に同じような現象に遭遇したときに調べた内容を共有させていただきます。

原因は、本家の Ruby との以下の違いだと思います。
  1. STACK_LEVEL_MAX 変数の初期化のされ方が異なる
  2. スタックサイズが異なる

そのため、おそらく以下のような変更をすればよいと思います。

1. STACK_LEVEL_MAX 変数の初期化:
添付のパッチを適用し、ruby_init_stack 関数を呼んで STACK_LEVEL_MAX を
初期化するようにします。
(これは、本家の Ruby 1.8.7 では main.c の main 関数で RUBY_INIT_STACK マクロを
 呼んで行われていることですが、exerb では抜けているようです。)

2. スタックサイズ:
ruby18c などのリンカオプションで、スタックサイズを 0x2000000 (33554432) に
設定し、本家 Ruby と同様に /STACK:0x2000000 を指定して、大きめのスタックを
確保しておくようにします。

1の変更をすれば、強制終了ではなく、SystemStackError で (適切に) 終了するようになりました。
2の変更も加えると、T1=697 程度であれば十分実行できるようになりました。

以上、ご参考まで。
-- 
Mail:     masam****@gmail*****
村瀬 昌満 (MURASE Masamitsu)
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: exerb.diff
型:         application/octet-stream
サイズ:     523 バイト
説明:       無し
下载 



exerb-developer メーリングリストの案内
Back to archive index