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

ruby-changes:4935

From: ko1@a...
Date: Fri, 16 May 2008 08:22:30 +0900 (JST)
Subject: [ruby-changes:4935] nagai - Ruby:r16428 (ruby_1_8): * ext/tk/lib/tk.rb: fix memory (object) leak bug.

nagai	2008-05-16 08:22:17 +0900 (Fri, 16 May 2008)

  New Revision: 16428

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/ext/tk/lib/tk.rb
    branches/ruby_1_8/ext/tk/sample/demos-en/aniwave.rb
    branches/ruby_1_8/ext/tk/sample/demos-jp/aniwave.rb

  Log:
    * ext/tk/lib/tk.rb: fix memory (object) leak bug.
    
    * ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
      bug fix.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ext/tk/sample/demos-en/aniwave.rb?r1=16428&r2=16427&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16428&r2=16427&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ext/tk/sample/demos-jp/aniwave.rb?r1=16428&r2=16427&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ext/tk/lib/tk.rb?r1=16428&r2=16427&diff_format=u

Index: ruby_1_8/ext/tk/sample/demos-jp/aniwave.rb
===================================================================
--- ruby_1_8/ext/tk/sample/demos-jp/aniwave.rb	(revision 16427)
+++ ruby_1_8/ext/tk/sample/demos-jp/aniwave.rb	(revision 16428)
@@ -60,6 +60,7 @@
     @backupCoords = []
     n = 0
     (-10..300).step(5){|n| @waveCoords << [n, 100]; @backupCoords << [n, 100] }
+    n = 305
     @waveCoords << [n, 0]; @backupCoords << [n, 0]
     @waveCoords << [n+5, 200]; @backupCoords << [n+5, 200]
     @coordsLen = @waveCoords.length
Index: ruby_1_8/ext/tk/sample/demos-en/aniwave.rb
===================================================================
--- ruby_1_8/ext/tk/sample/demos-en/aniwave.rb	(revision 16427)
+++ ruby_1_8/ext/tk/sample/demos-en/aniwave.rb	(revision 16428)
@@ -58,6 +58,7 @@
     @backupCoords = []
     n = 0
     (-10..300).step(5){|n| @waveCoords << [n, 100]; @backupCoords << [n, 100] }
+    n = 305
     @waveCoords << [n, 0]; @backupCoords << [n, 0]
     @waveCoords << [n+5, 200]; @backupCoords << [n+5, 200]
     @coordsLen = @waveCoords.length
Index: ruby_1_8/ext/tk/lib/tk.rb
===================================================================
--- ruby_1_8/ext/tk/lib/tk.rb	(revision 16427)
+++ ruby_1_8/ext/tk/lib/tk.rb	(revision 16428)
@@ -775,7 +775,7 @@
   private :_curr_cmd_id, :_next_cmd_id
   module_function :_curr_cmd_id, :_next_cmd_id
 
-  def TkComm.install_cmd(cmd)
+  def TkComm.install_cmd(cmd, local_cmdtbl=nil)
     return '' if cmd == ''
     begin
       ns = TkCore::INTERP._invoke_without_enc('namespace', 'current')
@@ -794,6 +794,15 @@
     @cmdtbl = [] unless defined? @cmdtbl
     @cmdtbl.taint unless @cmdtbl.tainted?
     @cmdtbl.push id
+
+    if local_cmdtbl && local_cmdtbl.kind_of?(Array)
+      begin
+        local_cmdtbl << id
+      rescue Exception
+        # ignore
+      end
+    end
+
     #return Kernel.format("rb_out %s", id);
     if ns
       'rb_out' << TkCore::INTERP._ip_id_ << ' ' << ns << ' ' << id
@@ -801,19 +810,29 @@
       'rb_out' << TkCore::INTERP._ip_id_ << ' ' << id
     end
   end
-  def TkComm.uninstall_cmd(id)
+  def TkComm.uninstall_cmd(id, local_cmdtbl=nil)
     #id = $1 if /rb_out\S* (c(_\d+_)?\d+)/ =~ id
     id = $4 if id =~ /rb_out\S*(?:\s+(::\S*|[{](::.*)[}]|["](::.*)["]))? (c(_\d+_)?(\d+))/
+
+    if local_cmdtbl && local_cmdtbl.kind_of?(Array)
+      begin
+        local_cmdtbl.delete(id)
+      rescue Exception
+        # ignore
+      end
+    end
+    @cmdtbl.delete(id)
+
     #Tk_CMDTBL.delete(id)
     TkCore::INTERP.tk_cmd_tbl.delete(id)
   end
   # private :install_cmd, :uninstall_cmd
   # module_function :install_cmd, :uninstall_cmd
   def install_cmd(cmd)
-    TkComm.install_cmd(cmd)
+    TkComm.install_cmd(cmd, @cmdtbl)
   end
   def uninstall_cmd(id)
-    TkComm.uninstall_cmd(id)
+    TkComm.uninstall_cmd(id, @cmdtbl)
   end
 
 =begin
@@ -1447,7 +1466,9 @@
 
   def after(ms, cmd=Proc.new)
     cmdid = install_cmd(proc{ret = cmd.call;uninstall_cmd(cmdid); ret})
-    tk_call_without_enc("after",ms,cmdid)  # return id
+    after_id = tk_call_without_enc("after",ms,cmdid)
+    after_id.instance_variable_set('@cmdid', cmdid)
+    after_id
   end
 =begin
   def after(ms, cmd=Proc.new)
@@ -1477,7 +1498,9 @@
 
   def after_idle(cmd=Proc.new)
     cmdid = install_cmd(proc{ret = cmd.call;uninstall_cmd(cmdid); ret})
-    tk_call_without_enc('after','idle',cmdid)
+    after_id = tk_call_without_enc('after','idle',cmdid)
+    after_id.instance_variable_set('@cmdid', cmdid)
+    after_id
   end
 =begin
   def after_idle(cmd=Proc.new)
@@ -1495,6 +1518,11 @@
 
   def after_cancel(afterId)
     tk_call_without_enc('after','cancel',afterId)
+    if (cmdid = afterId.instance_variable_get('@cmdid'))
+      afterId.instance_variable_set('@cmdid', nil)
+      uninstall_cmd(cmdid)
+    end
+    afterId
   end
 
   def windowingsystem
@@ -5237,11 +5265,13 @@
     end
 
     children.each{|path, obj|
-      if defined?(@cmdtbl)
-        for id in @cmdtbl
-          uninstall_cmd id
+      obj.instance_eval{
+        if defined?(@cmdtbl)
+          for id in @cmdtbl
+            uninstall_cmd id
+          end
         end
-      end
+      }
       TkCore::INTERP.tk_windows.delete(path)
     }
 
@@ -5359,7 +5389,7 @@
 #Tk.freeze
 
 module Tk
-  RELEASE_DATE = '2008-05-14'.freeze
+  RELEASE_DATE = '2008-05-16'.freeze
 
   autoload :AUTO_PATH,        'tk/variable'
   autoload :TCL_PACKAGE_PATH, 'tk/variable'
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 16427)
+++ ruby_1_8/ChangeLog	(revision 16428)
@@ -1,3 +1,10 @@
+Fri May 16 08:15:52 2008  Hidetoshi NAGAI  <nagai@a...>
+
+	* ext/tk/lib/tk.rb: fix memory (object) leak bug.
+
+	* ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
+	  bug fix.
+
 Thu May 15 17:00:22 2008  Akinori MUSHA  <knu@i...>
 
 	* string.c (Init_String): Define #bytesize as an alias for #size

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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