From: Hiroshi I. <ig...@ru...> - 2003-08-10 11:33:47
|
いがらしです。 リリース作業お疲れ様でした。 At Sun, 10 Aug 2003 17:07:26 +0900, Masao Mutoh <mu...@hi...> wrote: > > この件ですが、0.3.1をSF.jpにあげてみました。 > 大丈夫なはずですがちと心配なので、確認して > いただけないでしょうか。 > #自分が信じられないらしい(^^;) > > いがらしさんのOKが出たらruby-list/talkの方に報告します。 わがまま言ってすみません^_^; singleton_methodsの問題はOKになりました。 ただ、もう1つ問題を見つけてしまいました:-< ruby 1.6でかつRBBR::Doc::RIが使用可能なとき、 ::RI#findClassに未知のクラス名が渡るとNameErrorに なってしまい、rescueで捕捉されずに落ちてしまいます。 /home/iga/test/ruby/lib/ruby/site_ruby/ri/outputstream.rb:11:in `puts': undefined method `<<' for nil (NameError) from /home/iga/test/ruby/lib/ruby/site_ruby/ri/outputstream.rb:10:in `each' from /home/iga/test/ruby/lib/ruby/site_ruby/ri/outputstream.rb:10:in `puts' from /home/iga/test/ruby/lib/ruby/site_ruby/ri/op/Plain.rb:18:in `error' from /home/iga/test/ruby/lib/ruby/site_ruby/ri/ri.rb:191:in `findClass' from /home/iga/test/ruby/lib/ruby/site_ruby/1.8//rbbr/doc/ri.rb:34:in `lookup_class' from lib/rbbr/doc.rb:95:in `lookup_class' from lib/rbbr/doc.rb:93:in `each' from lib/rbbr/doc.rb:93:in `lookup_class' ... 6 levels... from lib/rbbr/ui/gtk/moduleindex.rb:96:in `call' from lib/rbbr/ui/gtk.rb:58:in `main' from lib/rbbr/ui/gtk.rb:58:in `main' from bin/rbbr:22 おそらく原因は以下のあたりかと思います。 * ruby1.6と1.8で、例外クラス指定なしのrescueでNameErrorを 捕捉できるかが異なる。 * ::RI#setOutputFormatterにPlain.new(nil, 10)を与えているが nilだとri内部でエラー(ex. 未知のクラス名)が起こったとき、 メッセージを書き込めずNameError(1.6) or NoMehtodError(1.8)が発生。 1.8では捕捉できるので表面化しない。 * 上の問題を解決してもri内部でエラー時にthrow :exitしており、 catchしてやらないとまずいのでは? というわけで、末尾のパッチを適用して欲しいです。 # エンバグしてなきゃいいんですが... > あ、そうそう、ただ修正するだけだとしゃくなので、 > 表示内容を若干改善しました。 > #それでデグったりして。良くあるパターンだ(^^;) ^_^;) -- 五十嵐 宏 (Hiroshi IGARASHI) --- lib/rbbr/doc/ri.rb.orig Sun Aug 10 19:35:14 2003 +++ lib/rbbr/doc/ri.rb Sun Aug 10 20:31:44 2003 @@ -25,13 +25,19 @@ def initialize @ri = ::RI.new - @ri.setOutputFormatter(Plain.new(nil, 10)) + @output = "" + @ri.setOutputFormatter(Plain.new(@output, 10)) super() end def lookup_class( klass ) begin - cl = @ri.findClass(klass) + cl = nil + val = catch(:exit) do + cl = @ri.findClass(klass) + 0 # normal exit + end + raise LookupError if val > 0 fragments(cl) rescue raise LookupError @@ -49,7 +55,12 @@ def lookup_method( method ) begin ary = /^(#{::RI::CN_PATTERN})(\.|\#|::)(.+)/.match(method).to_a - method_list = @ri.methods_matching(ary[1], ary[2], ary[3]) + method_list = nil + val = catch(:exit) do + method_list = @ri.methods_matching(ary[1], ary[2], ary[3]) + 0 # normal exit + end + raise LookupError if val > 0 case method_list.size when 0 raise LookupError |