From: Nobuyoshi Nakada Date: 2009-11-02T17:36:42+09:00 Subject: [ruby-dev:39605] Re: infinite recursive call to C function なかだです。 At Mon, 2 Nov 2009 16:00:53 +0900, Yukihiro Matsumoto wrote in [ruby-dev:39603]: > |> それよりもむしろrb_longjmp でのbacktraceの割り当てをlazyにす > |> べきなのかなあ。でも、バックとレース情報を記録する場所はいず > |> れにせよ必要なわけだし...。 > | > |「バックトレース情報を記録する場所」というのは? > > 現在はbacktrace情報を文字列の配列としてrb_longjmpの中で生成し > ていますが、これはかならずしも必要とは限りません。たとえば、 > 例外をrecueでハンドルした場合には、このオブジェクトは使われず > に終わります。ので、「どのファイル」、「何行目」、「どのメソッ > ド」の情報(×呼び出しネスト数)だけどこかに保存しておければ、 > 無駄なオブジェクト割り当てが削れるはずなんですが。「どこに保 > 存するか」について良いアイディアがないんですよねえ。 専用のスタックにメソッドの呼び出しごとに積んでいくとかですか。 > |とりあえずJUMP_TAGのときにチェックさせるようにしてみました。 > > これを当てると、r23720をrevertしなくてもよい、というわけでは > ないんでしょうね。 if (ruby_threadptr_stack_check(th)) return; と、ruby_threadptr_handle_critical_exception()でスタックにある程 度余裕ができるまで待っています。単純にr23720をrevertするだけでも、 バックトレースが出なくなるだけでSEGVはしないようですが。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦