From 8ba823c485d481979600000a111b3b108f98ad6f Mon Sep 17 00:00:00 2001 From: nagai Date: Wed, 5 Apr 2006 16:08:45 +0000 Subject: * ext/tk/tcltklib.c: fix SEGV when embedding to an application. [ruby-core:7600] * ext/tk/tcltklib.c: fix SEGV at exit. [ruby-talk:186489] * ext/tk/tkutil/tkutil.c: follow to changing specification of instance_eval on ruby-1.9.x. * ext/tk/lib/tk.rb: ditto. * ext/tk/lib/multi-tk.rb: ditto. * ext/tk/lib/tk.rb: remove warning about redefinition of methods. * ext/tk/lib/tk/variable.rb: remove warning about unseting Tcl variables. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10078 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/tk/lib/multi-tk.rb | 2 +- ext/tk/lib/tk.rb | 20 +++++++++------ ext/tk/lib/tk/variable.rb | 12 ++++----- ext/tk/tcltklib.c | 62 +++++++++++++++++++++++++++++++---------------- ext/tk/tkutil/tkutil.c | 11 +++++++-- 5 files changed, 68 insertions(+), 39 deletions(-) (limited to 'ext') diff --git a/ext/tk/lib/multi-tk.rb b/ext/tk/lib/multi-tk.rb index 6581ff8da7..84c2322d56 100644 --- a/ext/tk/lib/multi-tk.rb +++ b/ext/tk/lib/multi-tk.rb @@ -142,7 +142,7 @@ class MultiTkIp ###################################### - @@CB_ENTRY_CLASS = Class.new(TkCallbackEntry){|c| + @@CB_ENTRY_CLASS = Class.new(TkCallbackEntry){ def initialize(ip, cmd) @ip = ip @cmd = cmd diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index 55408dda2f..bf053058da 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -1121,8 +1121,8 @@ module TkCore @init_ip_env = [].taint # table of Procs @add_tk_procs = [].taint # table of [name, args, body] - @cb_entry_class = Class.new(TkCallbackEntry){|c| - class << c + @cb_entry_class = Class.new(TkCallbackEntry){ + class << self def inspect sprintf("#", self.__id__) end @@ -2310,11 +2310,15 @@ if (/^(8\.[1-9]|9\.|[1-9][0-9])/ =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK) end module TclTkLib - def self.encoding=(name) - TkCore::INTERP.encoding = name - end - def self.encoding - TkCore::INTERP.encoding + class << self + alias _encoding encoding + alias _encoding= encoding= + def encoding=(name) + TkCore::INTERP.encoding = name + end + def encoding + TkCore::INTERP.encoding + end end end @@ -4555,7 +4559,7 @@ end #Tk.freeze module Tk - RELEASE_DATE = '2005-12-07'.freeze + RELEASE_DATE = '2006-04-06'.freeze autoload :AUTO_PATH, 'tk/variable' autoload :TCL_PACKAGE_PATH, 'tk/variable' diff --git a/ext/tk/lib/tk/variable.rb b/ext/tk/lib/tk/variable.rb index 1ea41b729b..e5cacadc1a 100644 --- a/ext/tk/lib/tk/variable.rb +++ b/ext/tk/lib/tk/variable.rb @@ -266,8 +266,11 @@ TkCore::INTERP.add_tk_procs('rb_var', 'args', <<-'EOL') def initialize(val="", type=nil) # @id = Tk_VARIABLE_ID.join('') - @id = Tk_VARIABLE_ID.join(TkCore::INTERP._ip_id_) - Tk_VARIABLE_ID[1].succ! + begin + @id = Tk_VARIABLE_ID.join(TkCore::INTERP._ip_id_) + Tk_VARIABLE_ID[1].succ! + end until INTERP._invoke_without_enc('info', 'globals', @id).empty? + TkVar_ID_TBL[@id] = self @var = @id @@ -286,11 +289,6 @@ TkCore::INTERP.add_tk_procs('rb_var', 'args', <<-'EOL') self.default_value_type = type - begin - INTERP._unset_global_var(@id) - rescue - end - # teach Tk-ip that @id is global var INTERP._invoke_without_enc('global', @id) #INTERP._invoke('global', @id) diff --git a/ext/tk/tcltklib.c b/ext/tk/tcltklib.c index ac5d4fe7be..ecb73e6743 100644 --- a/ext/tk/tcltklib.c +++ b/ext/tk/tcltklib.c @@ -4,7 +4,7 @@ * Oct. 24, 1997 Y. Matsumoto */ -#define TCLTKLIB_RELEASE_DATE "2005-12-07" +#define TCLTKLIB_RELEASE_DATE "2006-04-06" #include "ruby.h" #include "rubysig.h" @@ -1140,8 +1140,11 @@ set_max_block_time(self, time) tcl_time.usec = (long)(NUM2DBL(RARRAY(divmod)->ptr[1]) * 1000000); default: - rb_raise(rb_eArgError, "invalid value for time: '%s'", - RSTRING(rb_funcall(time, ID_inspect, 0, 0))->ptr); + { + VALUE tmp = rb_funcall(time, ID_inspect, 0, 0); + rb_raise(rb_eArgError, "invalid value for time: '%s'", + StringValuePtr(tmp)); + } } Tcl_SetMaxBlockTime(&tcl_time); @@ -2132,6 +2135,7 @@ ip_set_exc_message(interp, exc) rb_thread_critical = Qtrue; msg = rb_funcall(exc, ID_message, 0, 0); + StringValue(msg); #if TCL_MAJOR_VERSION > 8 || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) enc = rb_attr_get(exc, ID_at_enc); @@ -4355,13 +4359,14 @@ ip_finalize(ip) { Tcl_CmdInfo info; int thr_crit_bup; - int rb_debug_bup; /* When ruby is exiting, printing debug messages in - some callback operations from Tcl-IP sometimes - cause SEGV. I don't know the reason. But I got - SEGV when calling "rb_io_write(rb_stdout, ...)". - So, in some part of this function, debug mode is - disabled. If you know the reason, please fix it. - -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) */ + + VALUE rb_debug_bup, rb_verbose_bup; + /* When ruby is exiting, printing debug messages in some callback + operations from Tcl-IP sometimes cause SEGV. I don't know the + reason. But I got SEGV when calling "rb_io_write(rb_stdout, ...)". + So, in some part of this function, debug mode and verbose mode + are disabled. If you know the reason, please fix it. + -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) */ DUMP1("start ip_finalize"); @@ -4370,6 +4375,11 @@ ip_finalize(ip) return; } + if (Tcl_InterpDeleted(ip)) { + DUMP2("ip(%lx) is already deleted", ip); + return; + } + #if TCL_NAMESPACE_DEBUG if (ip_null_namespace(ip)) { DUMP2("ip(%lx) has null namespace", ip); @@ -4380,7 +4390,8 @@ ip_finalize(ip) thr_crit_bup = rb_thread_critical; rb_thread_critical = Qtrue; - rb_debug_bup = ruby_debug; + rb_debug_bup = ruby_debug; + rb_verbose_bup = ruby_verbose; Tcl_Preserve(ip); @@ -4399,9 +4410,11 @@ ip_finalize(ip) DUMP1("destroy root widget"); if (tk_stubs_init_p() && Tk_MainWindow(ip) != (Tk_Window)NULL) { DUMP1("call Tk_DestroyWindow"); - ruby_debug = 0; + ruby_debug = Qfalse; + ruby_verbose = Qnil; Tk_DestroyWindow(Tk_MainWindow(ip)); - ruby_debug = rb_debug_bup; + ruby_debug = rb_debug_bup; + ruby_verbose = rb_verbose_bup; } #endif @@ -4409,24 +4422,29 @@ ip_finalize(ip) DUMP1("check `finalize-hook-proc'"); if (Tcl_GetCommandInfo(ip, finalize_hook_name, &info)) { DUMP2("call finalize hook proc '%s'", finalize_hook_name); - ruby_debug = 0; + ruby_debug = Qfalse; + ruby_verbose = Qnil; Tcl_GlobalEval(ip, finalize_hook_name); - ruby_debug = rb_debug_bup; + ruby_debug = rb_debug_bup; + ruby_verbose = rb_verbose_bup; } DUMP1("check `foreach' & `after'"); if ( Tcl_GetCommandInfo(ip, "foreach", &info) && Tcl_GetCommandInfo(ip, "after", &info) ) { DUMP1("cancel after callbacks"); - ruby_debug = 0; + ruby_debug = Qfalse; + ruby_verbose = Qnil; Tcl_GlobalEval(ip, "foreach id [after info] {after cancel $id}"); - ruby_debug = rb_debug_bup; + ruby_debug = rb_debug_bup; + ruby_verbose = rb_verbose_bup; } Tcl_Release(ip); DUMP1("finish ip_finalize"); - ruby_debug = rb_debug_bup; + ruby_debug = rb_debug_bup; + ruby_verbose = rb_verbose_bup; rb_thread_critical = thr_crit_bup; } @@ -4467,6 +4485,7 @@ ip_free(ptr) Tcl_DeleteInterp(ptr->ip); Tcl_Release(ptr->ip); + ptr->ip = (Tcl_Interp*)NULL; free(ptr); rb_thread_critical = thr_crit_bup; @@ -4910,7 +4929,7 @@ ip_create_slave_core(interp, argc, argv) slave->allow_ruby_exit = 0; slave->return_value = 0; - slave->ip = Tcl_CreateSlave(master->ip, RSTRING(name)->ptr, safe); + slave->ip = Tcl_CreateSlave(master->ip, StringValuePtr(name), safe); if (slave->ip == NULL) { rb_thread_critical = thr_crit_bup; return rb_exc_new2(rb_eRuntimeError, @@ -6192,6 +6211,7 @@ lib_fromUTF8_core(ip_obj, src, encodename) char *s; int len; + StringValue(str); s = Tcl_GetByteArrayFromObj(Tcl_NewStringObj(RSTRING(str)->ptr, RSTRING(str)->len), &len); @@ -6371,7 +6391,7 @@ lib_set_system_encoding(self, enc_name) enc_name = rb_funcall(enc_name, ID_to_s, 0, 0); if (Tcl_SetSystemEncoding((Tcl_Interp *)NULL, - RSTRING(enc_name)->ptr) != TCL_OK) { + StringValuePtr(enc_name)) != TCL_OK) { rb_raise(rb_eArgError, "unknown encoding name '%s'", RSTRING(enc_name)->ptr); } @@ -7929,7 +7949,7 @@ Init_tcltklib() /* --------------------------------------------------------------- */ - ret = ruby_open_tcl_dll(RSTRING(rb_argv0)->ptr); + ret = ruby_open_tcl_dll(rb_argv0 ? RSTRING(rb_argv0)->ptr : 0); switch(ret) { case TCLTK_STUBS_OK: break; diff --git a/ext/tk/tkutil/tkutil.c b/ext/tk/tkutil/tkutil.c index 620ac36c1f..f4271a724c 100644 --- a/ext/tk/tkutil/tkutil.c +++ b/ext/tk/tkutil/tkutil.c @@ -8,10 +8,11 @@ ************************************************/ -#define TKUTIL_RELEASE_DATE "2005-11-07" +#define TKUTIL_RELEASE_DATE "2006-04-06" #include "ruby.h" #include "rubysig.h" +#include "version.h" #include "st.h" static VALUE cMethod; @@ -57,7 +58,13 @@ tk_s_new(argc, argv, klass) { VALUE obj = rb_class_new_instance(argc, argv, klass); - if (rb_block_given_p()) rb_obj_instance_eval(0, 0, obj); + if (rb_block_given_p()) { +#if RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR <= 8 /* ruby 1.8.x */ + rb_obj_instance_eval(0, 0, obj); +#else + rb_obj_instance_exec(1, &obj, obj); +#endif + } return obj; } -- cgit v1.2.3