def timeout(sec) bl = proc do y = Thread.start { sleep sec } result = yield(sec) y.kill y.join return result end bl.call caller(0) end timeout(100) do foo.bar end ところが、実際にはbl.callでVMを起動する時のISeqがfoo.barのあるブロックになってしまい、そこでfoo.barを呼び出した後普通に次の行に抜け、本来大域脱出により到達しないはずのcaller(0)の呼び出しに到達してしまいました。 gdbで見てみるとbl.callからvm_call_opt_call経由でinvoke_blockにより積まれているcfpのiseqには正しいiseqがセットされ、実行され始めていた。なので上記の引用の内容は間違っていた。 一