遠藤です。

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>