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/