遠藤です。 VM::InstructionSequence.compile したものを to_a したものを load して eval すると落ちることがあります。 $ ./ruby -e ' VM::InstructionSequence.load( VM::InstructionSequence.compile(<<-SRC).to_a def foo begin raise return rescue end begin rescue end end SRC ).eval foo ' <compiled>:7: [BUG] Stack consistency error (sp: 10, bp: 9) ruby 1.9.0 (2008-06-25 revision 17573) [i686-linux] -- control frame ---------- c:0004 p:0016 s:0010 b:0009 l:000008 d:000008 METHOD <compiled>:7 c:0003 p:0052 s:0006 b:0006 l:000005 d:000005 TOP -e:16 c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH :private_class_method c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP <dummy toplevel>:17 --------------------------- DBG> : "<compiled>:7:in `foo'" DBG> : "-e:16:in `<main>'" -- backtrace of native function call (Use addr2line) -- 0x8101525 0x812822e 0x812828b 0x80fc09d 0x80fcb0b 0x80fcd00 0x805a03f 0x805b94e 0x8058a01 0xb7e0eea8 0x8058911 ------------------------------------------------------- アボートしました compile 時に ADD_ADJUST_RESTORE があったのが to_a の時点で 消えているため、load する時にスタックの深さの推論に失敗し、 CATCH_TYPE_RESCUE の sp が変になるのが原因です。 アドホックな修正としては、ADD_ADJUST_RESTORE を ADD_ADJUST に するとか、推論に頼らずバイトコード上の CATCH_TYPE_RESCUE の sp を採用するとかが考えられますが、iseq_set_sequence の推論を 賢くするのがいいかと思います。 # ささださんには IRC で何回か言った気がしますが、記録に残す # ためにメールします。 -- Yusuke ENDOH <mame / tsg.ne.jp>