From: Yukihiro Matsumoto Date: 2009-11-02T16:00:53+09:00 Subject: [ruby-dev:39603] Re: infinite recursive call to C function まつもと ゆきひろです In message "Re: [ruby-dev:39602] Re: infinite recursive call to C function" on Mon, 2 Nov 2009 15:36:51 +0900, Nobuyoshi Nakada writes: |> * 代替スタック中ではRubyコードを実行しない(r23720をリバー |> トする) |> * 代替スタック使用中はスタック先頭アドレスも書き換える |> |> のいずれかが必要ということですか。 | |前者のほうがいいんじゃないでしょうか。代替スタック使用中のGCでス |タックオーバフローしたりとか考えると。 とすると、[ruby-core:23813]が再発するんじゃないかが心配なの ですが。 |> それよりもむしろrb_longjmp でのbacktraceの割り当てをlazyにす |> べきなのかなあ。でも、バックとレース情報を記録する場所はいず |> れにせよ必要なわけだし...。 | |「バックトレース情報を記録する場所」というのは? 現在はbacktrace情報を文字列の配列としてrb_longjmpの中で生成し ていますが、これはかならずしも必要とは限りません。たとえば、 例外をrecueでハンドルした場合には、このオブジェクトは使われず に終わります。ので、「どのファイル」、「何行目」、「どのメソッ ド」の情報(×呼び出しネスト数)だけどこかに保存しておければ、 無駄なオブジェクト割り当てが削れるはずなんですが。「どこに保 存するか」について良いアイディアがないんですよねえ。 |とりあえずJUMP_TAGのときにチェックさせるようにしてみました。 これを当てると、r23720をrevertしなくてもよい、というわけでは ないんでしょうね。