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/