From: Yusuke ENDOH Date: 2008-06-25T23:37:37+09:00 Subject: [ruby-dev:35229] VM::InstructionSequence.load may dump core 遠藤です。 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 ' :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 :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 :17 --------------------------- DBG> : ":7:in `foo'" DBG> : "-e:16:in `
'" -- 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