[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]