mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/tcltklib/tcltklib.c: fix SEGV bug when deleting Tk interp
* ext/tk/lib/multi-tk.rb: ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7667 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
8768030bb6
commit
53c584d35d
4 changed files with 59 additions and 27 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Mon Dec 27 20:02:14 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||||
|
|
||||||
|
* ext/tcltklib/tcltklib.c: fix SEGV bug when deleting Tk interp
|
||||||
|
|
||||||
|
* ext/tk/lib/multi-tk.rb: ditto
|
||||||
|
|
||||||
Mon Dec 27 16:54:05 2004 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
Mon Dec 27 16:54:05 2004 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
||||||
|
|
||||||
* ext/openssl/ossl_x509name.c (Init_ossl_x509name): should use
|
* ext/openssl/ossl_x509name.c (Init_ossl_x509name): should use
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* Oct. 24, 1997 Y. Matsumoto
|
* Oct. 24, 1997 Y. Matsumoto
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define TCLTKLIB_RELEASE_DATE "2004-12-23"
|
#define TCLTKLIB_RELEASE_DATE "2004-12-27"
|
||||||
|
|
||||||
#include "ruby.h"
|
#include "ruby.h"
|
||||||
#include "rubysig.h"
|
#include "rubysig.h"
|
||||||
|
@ -70,9 +70,13 @@ fprintf(stderr, ARG1, ARG2); fprintf(stderr, "\n"); fflush(stderr); }
|
||||||
/* release date */
|
/* release date */
|
||||||
const char tcltklib_release_date[] = TCLTKLIB_RELEASE_DATE;
|
const char tcltklib_release_date[] = TCLTKLIB_RELEASE_DATE;
|
||||||
|
|
||||||
/*finalize_proc_name */
|
/* finalize_proc_name */
|
||||||
static char *finalize_hook_name = "INTERP_FINALIZE_HOOK";
|
static char *finalize_hook_name = "INTERP_FINALIZE_HOOK";
|
||||||
|
|
||||||
|
/* to cancel remained after-scripts when deleting IP */
|
||||||
|
#define REMAINED_AFTER_IDS_VAR "__ruby_tcltklib_remained_after_script_list__"
|
||||||
|
#define CANCEL_REMAINED_AFTER_IDS "foreach id $__ruby_tcltklib_remained_after_script_list__ {after cancel $id}"
|
||||||
|
|
||||||
/* for callback break & continue */
|
/* for callback break & continue */
|
||||||
static VALUE eTkCallbackReturn;
|
static VALUE eTkCallbackReturn;
|
||||||
static VALUE eTkCallbackBreak;
|
static VALUE eTkCallbackBreak;
|
||||||
|
@ -3312,12 +3316,16 @@ delete_slaves(ip)
|
||||||
|
|
||||||
Tcl_Preserve(slave);
|
Tcl_Preserve(slave);
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION < 8 || ( TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION < 4)
|
|
||||||
#else
|
|
||||||
if (!Tcl_InterpDeleted(slave)) {
|
if (!Tcl_InterpDeleted(slave)) {
|
||||||
Tcl_Eval(slave, "foreach i [after info] { after cancel $i }");
|
if (Tcl_Eval(slave, "after info") == TCL_OK
|
||||||
|
&& Tcl_SetVar(slave,
|
||||||
|
REMAINED_AFTER_IDS_VAR,
|
||||||
|
Tcl_GetStringResult(slave),
|
||||||
|
TCL_GLOBAL_ONLY) != (char *)NULL) {
|
||||||
|
DUMP1("cancel after scripts");
|
||||||
|
Tcl_Eval(slave, CANCEL_REMAINED_AFTER_IDS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* delete slaves of slave */
|
/* delete slaves of slave */
|
||||||
delete_slaves(slave);
|
delete_slaves(slave);
|
||||||
|
@ -3360,18 +3368,20 @@ ip_free(ptr)
|
||||||
|
|
||||||
Tcl_ResetResult(ptr->ip);
|
Tcl_ResetResult(ptr->ip);
|
||||||
|
|
||||||
|
if (Tcl_Eval(ptr->ip, "after info") == TCL_OK
|
||||||
|
&& Tcl_SetVar(ptr->ip,
|
||||||
|
REMAINED_AFTER_IDS_VAR,
|
||||||
|
Tcl_GetStringResult(ptr->ip),
|
||||||
|
TCL_GLOBAL_ONLY) != (char *)NULL) {
|
||||||
|
DUMP1("cancel after scripts");
|
||||||
|
Tcl_Eval(ptr->ip, CANCEL_REMAINED_AFTER_IDS);
|
||||||
|
}
|
||||||
|
|
||||||
if (Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) {
|
if (Tcl_GetCommandInfo(ptr->ip, finalize_hook_name, &info)) {
|
||||||
DUMP2("call finalize hook proc '%s'", finalize_hook_name);
|
DUMP2("call finalize hook proc '%s'", finalize_hook_name);
|
||||||
Tcl_Eval(ptr->ip, finalize_hook_name);
|
Tcl_Eval(ptr->ip, finalize_hook_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION < 8 || ( TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION < 4)
|
|
||||||
#else
|
|
||||||
if (!Tcl_InterpDeleted(ptr->ip)) {
|
|
||||||
Tcl_Eval(ptr->ip, "foreach i [after info] {after cancel $i}");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
del_root(ptr->ip);
|
del_root(ptr->ip);
|
||||||
|
|
||||||
DUMP1("delete interp");
|
DUMP1("delete interp");
|
||||||
|
@ -3838,12 +3848,14 @@ ip_delete(self)
|
||||||
/* Tcl_Preserve(ptr->ip); */
|
/* Tcl_Preserve(ptr->ip); */
|
||||||
rbtk_preserve_ip(ptr);
|
rbtk_preserve_ip(ptr);
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION < 8 || ( TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION < 4)
|
if (Tcl_Eval(ptr->ip, "after info") == TCL_OK
|
||||||
#else
|
&& Tcl_SetVar(ptr->ip,
|
||||||
if (!Tcl_InterpDeleted(ptr->ip)) {
|
REMAINED_AFTER_IDS_VAR,
|
||||||
Tcl_Eval(ptr->ip, "foreach i [after info] { after cancel $i }");
|
Tcl_GetStringResult(ptr->ip),
|
||||||
|
TCL_GLOBAL_ONLY) != (char *)NULL) {
|
||||||
|
DUMP1("cancel after scripts");
|
||||||
|
Tcl_Eval(ptr->ip, CANCEL_REMAINED_AFTER_IDS);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
del_root(ptr->ip);
|
del_root(ptr->ip);
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,9 @@ class MultiTkIp
|
||||||
unless ip.deleted?
|
unless ip.deleted?
|
||||||
ip._split_tklist(ip._invoke('interp', 'slaves')).each{|name|
|
ip._split_tklist(ip._invoke('interp', 'slaves')).each{|name|
|
||||||
begin
|
begin
|
||||||
ip._eval_without_enc("#{name} eval {foreach i [after info] {after cancel $i}}")
|
# ip._eval_without_enc("#{name} eval {foreach i [after info] {after cancel $i}}")
|
||||||
|
after_ids = ip._eval_without_enc("#{name} eval {after info}")
|
||||||
|
ip._eval_without_enc("#{name} eval {foreach i {#{after_ids}} {after cancel $i}}")
|
||||||
rescue Exception
|
rescue Exception
|
||||||
end
|
end
|
||||||
begin
|
begin
|
||||||
|
@ -236,7 +238,9 @@ class MultiTkIp
|
||||||
@slave_ip_tbl.each{|name, subip|
|
@slave_ip_tbl.each{|name, subip|
|
||||||
_destroy_slaves_of_slaveIP(subip)
|
_destroy_slaves_of_slaveIP(subip)
|
||||||
begin
|
begin
|
||||||
subip._eval_without_enc("foreach i [after info] {after cancel $i}")
|
# subip._eval_without_enc("foreach i [after info] {after cancel $i}")
|
||||||
|
after_ids = subip._eval_without_enc("after info")
|
||||||
|
subip._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
|
||||||
rescue Exception
|
rescue Exception
|
||||||
end
|
end
|
||||||
=begin
|
=begin
|
||||||
|
@ -270,7 +274,9 @@ class MultiTkIp
|
||||||
}
|
}
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@interp._eval_without_enc("foreach i [after info] {after cancel $i}")
|
# @interp._eval_without_enc("foreach i [after info] {after cancel $i}")
|
||||||
|
after_ids = @interp._eval_without_enc("after info")
|
||||||
|
@interp._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
|
||||||
rescue Exception
|
rescue Exception
|
||||||
end
|
end
|
||||||
begin
|
begin
|
||||||
|
@ -310,7 +316,9 @@ class MultiTkIp
|
||||||
@slave_ip_tbl.each{|name, subip|
|
@slave_ip_tbl.each{|name, subip|
|
||||||
_destroy_slaves_of_slaveIP(subip)
|
_destroy_slaves_of_slaveIP(subip)
|
||||||
begin
|
begin
|
||||||
subip._eval_without_enc("foreach i [after info] {after cancel $i}")
|
# subip._eval_without_enc("foreach i [after info] {after cancel $i}")
|
||||||
|
after_ids = subip._eval_without_enc("after info")
|
||||||
|
subip._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
|
||||||
rescue Exception
|
rescue Exception
|
||||||
end
|
end
|
||||||
=begin
|
=begin
|
||||||
|
@ -344,7 +352,9 @@ class MultiTkIp
|
||||||
}
|
}
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@interp._eval_without_enc("foreach i [after info] {after cancel $i}")
|
# @interp._eval_without_enc("foreach i [after info] {after cancel $i}")
|
||||||
|
after_ids = @interp._eval_without_enc("after info")
|
||||||
|
@interp._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
|
||||||
rescue Exception
|
rescue Exception
|
||||||
end
|
end
|
||||||
=begin
|
=begin
|
||||||
|
@ -1315,7 +1325,7 @@ class MultiTkIp
|
||||||
@cmd_queue.enq([nil, cmd, *args])
|
@cmd_queue.enq([nil, cmd, *args])
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
# ignore
|
# ignore
|
||||||
if $DEBUG || true
|
if $DEBUG
|
||||||
warn("Warning: " + e.class.inspect +
|
warn("Warning: " + e.class.inspect +
|
||||||
((e.message.length > 0)? ' "' + e.message + '"': '') +
|
((e.message.length > 0)? ' "' + e.message + '"': '') +
|
||||||
" on " + self.inspect)
|
" on " + self.inspect)
|
||||||
|
@ -1821,7 +1831,9 @@ class MultiTkIp
|
||||||
end
|
end
|
||||||
=end
|
=end
|
||||||
begin
|
begin
|
||||||
subip._eval_without_enc("foreach i [after info] {after cancel $i}")
|
# subip._eval_without_enc("foreach i [after info] {after cancel $i}")
|
||||||
|
after_ids = subip._eval_without_enc("after info")
|
||||||
|
subip._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
|
||||||
rescue Exception
|
rescue Exception
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1850,7 +1862,9 @@ class MultiTkIp
|
||||||
}
|
}
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@interp._eval_without_enc("foreach i [after info] {after cancel $i}")
|
# @interp._eval_without_enc("foreach i [after info] {after cancel $i}")
|
||||||
|
after_ids = @interp._eval_without_enc("after info")
|
||||||
|
@interp._eval_without_enc("foreach i {#{after_ids}} {after cancel $i}")
|
||||||
rescue Exception
|
rescue Exception
|
||||||
end
|
end
|
||||||
=begin
|
=begin
|
||||||
|
|
|
@ -3940,7 +3940,7 @@ end
|
||||||
#Tk.freeze
|
#Tk.freeze
|
||||||
|
|
||||||
module Tk
|
module Tk
|
||||||
RELEASE_DATE = '2004-12-24'.freeze
|
RELEASE_DATE = '2004-12-27'.freeze
|
||||||
|
|
||||||
autoload :AUTO_PATH, 'tk/variable'
|
autoload :AUTO_PATH, 'tk/variable'
|
||||||
autoload :TCL_PACKAGE_PATH, 'tk/variable'
|
autoload :TCL_PACKAGE_PATH, 'tk/variable'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue