From: SASADA Koichi Date: 2007-08-14T20:09:49+09:00 Subject: [ruby-dev:31411] Re: jump in ensure dumps core  ささだです。 Yusuke ENDOH wrote: > 1.9 で ensure の中で illigal でない next や redo をすると落ちます。 ... > next の場合のバイトコードを見たところ以下のようになっていました > (注釈は私の解釈) 。 > > 0000 putnil -- begin 節の結果 > 0001 putnil -- next の引数 > 0002 jump 4 -- next のジャンプ > 0004 leave > > つまり、ensure 節内の next が、begin 節の結果がスタックに詰まれて > いることを無視してジャンプするため、Stack consistency error になる > んだと思います。  はい。 > ensure 節内の next や redo で poped が真の時は、next や redo の前に > pop 命令を挿入すれば直るかもしれません (compile_data に ensure 節内 > かどうか判断できるフラグなどがみつからなかったので試してません) 。  ensure の中の next/redo の前に emptstack を入れるのがよさそうなき がしてきました。そもそも、next/redo の前には必ず入れるようにしようか なぁ。  って、これをいうなら先日の stack consistency error もなんとでもな りそうですね。 > redo の方はちゃんと追っていないので別の原因かもしれません。 > とりあえずバイトコードは以下のようになっていました。 > > 0000 putnil > 0001 jump 0 > 0003 leave  どんどん積んでいってスタックがあふれちゃってるんですね。 > # 蛇足ですが、VM::InstructionSequence がやっぱり長すぎて不幸です。  ISeq とかにするかなぁ。  自分は、$(srcdir)/test.rb というファイルにプログラムを書いて make parse とするとディスアセンブルする、という仕組みを使っているのでめっ たに使わないんですよね。  ついでに、make run とすると、$(srcdir)/test.rb を miniruby で実行 します。 > # あと、バイトコードの実行トレースを出すコンパイル時オプションとか > # ないですか?  VMDEBUG というマクロが vm.h にあります。1 以上にすると、実行時にい ろいろと情報を吐くようになります。が、長いことメンテしていなかったの でどれくらい使いものになるかわかりません。 -- // SASADA Koichi at atdot dot net