From: Yusuke ENDOH Date: 2007-12-29T17:20:56+09:00 Subject: [ruby-dev:32891] Re: emptstack dumps core 遠藤です。 07/12/29 に SASADA Koichi さんは書きました: > Yusuke ENDOH wrote: >  どうもありがとうございます。これは、こないだ IRC にいっていたよう > に、抜本的な改造が必要だと思っています(explicit に sp を調べる方法)。 > > 今あるアイデアは、 > > - while の先頭など、あわせなければならない場所にラベルを置く (L) > - emptstack の代わりに adjuststack L のような命令を置く > adjuststack は仮想的な命令 > - 最後のコンパイル時、L の sp を見て、adjuststack を pop > を続ける命令に置き換える > > ただし、これだと sp の計算のために 1 pass 増えてしまうという欠点が > あります。 n 回分 pop をする命令 (popn?) を追加すれば iseq_set_sequence でできる 気がします。 > 先日遠藤さんが言っていたように、compile_each 実行中に sp > を計算するのが一番シンプルですよね。ADD_INSN 等等で sp を計算するの > がいいのかもしれませんが、真剣に考えてみないとちょっと自信がありませ > ん。もしこれが現実的に可能だとすると、上記 adjuststack を挿入する部 > 分はそのまま pop 命令に置き換えられますね。 実は今それをやってみてます。まだ make test で大量にエラーが出る状態 ですけど。compile_data に int sp を持たせて、new_insn_core でその sp を insn_stack_increase をする感じです。 しかしこのアプローチだと ADD_INSN が副作用を持つことになるので、 やっぱりコードの可読性・メンテナンス性が下がりそうな感触です。 いっそ insn_stack_increase を使わずに、各 NODE のコンパイル部分で 明示的に sp を計算するコードを挿入していった方がいいのかも。 そっちの方が ADD_INSN 毎に sp 計算をしなくていい分速そうでもあります。 -- Yusuke ENDOH