From: Yusuke ENDOH Date: 2010-03-31T22:29:15+09:00 Subject: [ruby-dev:40878] Re: [Feature #2674] RubyVM::InstructionSequence to accept IOs 遠藤です。 2010年3月31日14:38 Urabe Shyouhei : > _ wanabe さんは書きました: > >> ありがとうございます。 >> NG なケースを見つけてしまったので報告します。これで SEGV します。 > > それはrb_compile_fileのバグでは... rb_compile_file は T_FILE を受け取るという仕様だったのでしょう。 卜部さんのパッチをあてると、メソッド呼び出し分の速度劣化が…… はともかく、IO#gets を再定義することでパース中に任意のコードが 実行できるようになりますが、大丈夫でしょうか。 # ripper がすでにやってるわけですが、ripper は動作実績なさそう # なので信用できません…… とりあえず continuation を使うと落ちました。 $ ./ruby -e ' require "continuation" $code = "p :foo" class IO def gets callcc {|c| $c = c } code, $code = $code, nil code end end load "foo.rb" $c.call ' :foo -e:11: [BUG] Segmentation fault (略) continuation は自己責任としても、何か妙な影響はないですかね。 load/require 命令を乗っ取れるようになるとか気になります。 $ cat foo.rb p :innocent $ ./ruby.new -e ' $code = "p :evil" class IO def gets code, $code = $code, nil code end end load "foo.rb" ' :evil IO#gets が再定義できる状況ならなんでもやり放題ではあるのですが。 wanabe さんと同じく、T_FILE かどうかで判断するのが無難だと思い ました。 -- Yusuke ENDOH