ruby-changes:18150
From: nagai <ko1@a...>
Date: Sat, 11 Dec 2010 06:02:30 +0900 (JST)
Subject: [ruby-changes:18150] Ruby:r30171 (ruby_1_8): * ext/tk/lib/multi-tk.rb: infinite loop on method_missing at loading.
nagai 2010-12-11 06:02:18 +0900 (Sat, 11 Dec 2010) New Revision: 30171 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30171 Log: * ext/tk/lib/multi-tk.rb: infinite loop on method_missing at loading. (backport from Ruby 1.9). * ext/tk/lib/multi-tk.rb: when no eventloop is running, ruby freezes at exit. Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/ext/tk/lib/multi-tk.rb Index: ruby_1_8/ext/tk/lib/multi-tk.rb =================================================================== --- ruby_1_8/ext/tk/lib/multi-tk.rb (revision 30170) +++ ruby_1_8/ext/tk/lib/multi-tk.rb (revision 30171) @@ -40,64 +40,6 @@ ################################################ -# use pseudo-toplevel feature of MultiTkIp ? -if (!defined?(Use_PseudoToplevel_Feature_of_MultiTkIp) || - Use_PseudoToplevel_Feature_of_MultiTkIp) - module MultiTkIp_PseudoToplevel_Evaluable - #def pseudo_toplevel_eval(body = Proc.new) - # Thread.current[:TOPLEVEL] = self - # begin - # body.call - # ensure - # Thread.current[:TOPLEVEL] = nil - # end - #end - - def pseudo_toplevel_evaluable? - @pseudo_toplevel_evaluable - end - - def pseudo_toplevel_evaluable=(mode) - @pseudo_toplevel_evaluable = (mode)? true: false - end - - def self.extended(mod) - mod.__send__(:extend_object, mod) - mod.instance_variable_set('@pseudo_toplevel_evaluable', true) - end - end - - class Object - alias __method_missing_alias_for_MultiTkIp__ method_missing - private :__method_missing_alias_for_MultiTkIp__ - - def method_missing(id, *args) - begin - has_top = (top = MultiTkIp.__getip.__pseudo_toplevel) && - top.respond_to?(:pseudo_toplevel_evaluable?) && - top.pseudo_toplevel_evaluable? && - top.respond_to?(id) - rescue Exception => e - has_top = false - end - - if has_top - top.__send__(id, *args) - else - __method_missing_alias_for_MultiTkIp__(id, *args) - end - end - end -else - # dummy - module MultiTkIp_PseudoToplevel_Evaluable - def pseudo_toplevel_evaluable? - false - end - end -end - -################################################ # exceptiopn to treat the return value from IP class MultiTkIp_OK < Exception def self.send(thread, ret=nil) @@ -841,8 +783,19 @@ Thread.pass end # INTERP_THREAD.run + raise @interp_thread[:interp] if @interp_thread[:interp].kind_of? Exception @interp = @interp_thread[:interp] + # delete the interpreter and kill the eventloop thread at exit + interp = @interp + interp_thread = @interp_thread + END{ + if interp_thread.alive? + interp.delete + interp_thread.kill + end + } + def self.mainloop(check_root = true) begin TclTkLib.set_eventloop_window_mode(true) @@ -2086,6 +2039,67 @@ end end + +################################################ +# use pseudo-toplevel feature of MultiTkIp ? +if (!defined?(Use_PseudoToplevel_Feature_of_MultiTkIp) || + Use_PseudoToplevel_Feature_of_MultiTkIp) + module MultiTkIp_PseudoToplevel_Evaluable + #def pseudo_toplevel_eval(body = Proc.new) + # Thread.current[:TOPLEVEL] = self + # begin + # body.call + # ensure + # Thread.current[:TOPLEVEL] = nil + # end + #end + + def pseudo_toplevel_evaluable? + @pseudo_toplevel_evaluable + end + + def pseudo_toplevel_evaluable=(mode) + @pseudo_toplevel_evaluable = (mode)? true: false + end + + def self.extended(mod) + mod.__send__(:extend_object, mod) + mod.instance_variable_set('@pseudo_toplevel_evaluable', true) + end + end + + class Object + alias __method_missing_alias_for_MultiTkIp__ method_missing + private :__method_missing_alias_for_MultiTkIp__ + + def method_missing(id, *args) + begin + has_top = (top = MultiTkIp.__getip.__pseudo_toplevel) && + top.respond_to?(:pseudo_toplevel_evaluable?) && + top.pseudo_toplevel_evaluable? && + top.respond_to?(id) + rescue Exception => e + has_top = false + end + + if has_top + top.__send__(id, *args) + else + __method_missing_alias_for_MultiTkIp__(id, *args) + end + end + end +else + # dummy + module MultiTkIp_PseudoToplevel_Evaluable + def pseudo_toplevel_evaluable? + false + end + end +end + + +################################################ # evaluate a procedure on the proper interpreter class MultiTkIp # instance & class method Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 30170) +++ ruby_1_8/ChangeLog (revision 30171) @@ -1,3 +1,10 @@ +Sat Dec 11 05:48:28 2010 Hidetoshi NAGAI <nagai@a...> + + * ext/tk/lib/multi-tk.rb: infinite loop on method_missing at loading + (backport from Ruby 1.9). + + * ext/tk/lib/multi-tk.rb: when no eventloop is running, ruby freezes at exit. + Fri Dec 3 19:48:11 2010 Nobuyoshi Nakada <nobu@r...> * lib/mkmf.rb (check_sizeof): should return integer always. -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/