diff --git a/ChangeLog b/ChangeLog index 2041d21972..1e8f1d9626 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Mon Jan 28 13:29:41 2002 K.Kosako + + * eval.c (is_defined): defined?(Foo::Baz) should check constants + only, no methods. + + * eval.c (is_defined): should not dump core on defined?(a::b) + where a is not a class nor a module. + Fri Jan 25 17:48:43 2002 WATANABE Hirofumi * configure.in (solaris): add '-shared' only for GNU ld. diff --git a/class.c b/class.c index f906390246..b4d8c935ae 100644 --- a/class.c +++ b/class.c @@ -304,7 +304,7 @@ void rb_include_module(klass, module) VALUE klass, module; { - VALUE p; + VALUE p, c; int changed = 0; rb_frozen_class_p(klass); @@ -323,18 +323,19 @@ rb_include_module(klass, module) Check_Type(module, T_MODULE); } + c = klass; while (module) { if (RCLASS(klass)->m_tbl == RCLASS(module)->m_tbl) rb_raise(rb_eArgError, "cyclic include detected"); /* ignore if the module included already in superclasses */ for (p = RCLASS(klass)->super; p; p = RCLASS(p)->super) { - if (BUILTIN_TYPE(p) == T_ICLASS && - RCLASS(p)->m_tbl == RCLASS(module)->m_tbl) { - goto skip; + if (BUILTIN_TYPE(p) == T_ICLASS) { + if (RCLASS(p)->m_tbl == RCLASS(module)->m_tbl) + goto skip; } } - RCLASS(klass)->super = include_class_new(module, RCLASS(klass)->super); - klass = RCLASS(klass)->super; + RCLASS(c)->super = include_class_new(module, RCLASS(c)->super); + c = RCLASS(c)->super; changed = 1; skip: module = RCLASS(module)->super; diff --git a/eval.c b/eval.c index 79bc1c6703..e6e5ab6753 100644 --- a/eval.c +++ b/eval.c @@ -1871,8 +1871,9 @@ is_defined(self, node, buf) case T_MODULE: if (rb_const_defined_at(val, node->nd_mid)) return "constant"; + break; default: - if (rb_method_boundp(val, node->nd_mid, 1)) { + if (rb_method_boundp(CLASS_OF(val), node->nd_mid, 1)) { return "method"; } } @@ -6783,6 +6784,7 @@ umethod_bind(method, recv) method = Data_Make_Struct(rb_cMethod,struct METHOD,bm_mark,free,bound); *bound = *data; bound->recv = recv; + bound->rklass = CLASS_OF(recv); return method; } diff --git a/ext/pty/pty.c b/ext/pty/pty.c index 15f3b5caa8..5adb0992e0 100644 --- a/ext/pty/pty.c +++ b/ext/pty/pty.c @@ -452,7 +452,7 @@ pty_getpty(self, command) rfptr->f = fdopen(info.fd, "r"); rfptr->path = strdup(RSTRING(command)->ptr); - wfptr->mode = rb_io_mode_flags("w"); + wfptr->mode = rb_io_mode_flags("w") | FMODE_SYNC; wfptr->f = fdopen(dup(info.fd), "w"); wfptr->path = strdup(RSTRING(command)->ptr); diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index 681b673ff8..144569b339 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -1317,7 +1317,7 @@ class TkVariable opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('') idx = -1 newopts = '' - @trace_var.each_with_index{|i,e| + @trace_var.each_with_index{|e,i| if idx < 0 && e[0] == opts && e[1] == cmd idx = i next @@ -1351,7 +1351,7 @@ class TkVariable return unless @trace_elem[elem].kind_of? Array opts = ['r','w','u'].find_all{|c| opts.index(c)}.join('') idx = -1 - @trace_elem[elem].each_with_index{|i,e| + @trace_elem[elem].each_with_index{|e,i| if idx < 0 && e[0] == opts && e[1] == cmd idx = i next diff --git a/ext/tk/lib/tkfont.rb b/ext/tk/lib/tkfont.rb index c44b215ee9..c1e45cbe54 100644 --- a/ext/tk/lib/tkfont.rb +++ b/ext/tk/lib/tkfont.rb @@ -173,8 +173,8 @@ class TkFont TkFont.new(nil, nil).call_font_configure(path, *(args + [{}])) else begin - compound = Hash[*list(tk_call('font', 'configure', - fnt))].collect{|key,value| + compound = Hash[*tk_split_simplelist(tk_call('font', 'configure', + fnt))].collect{|key,value| [key[1..-1], value] }.assoc('compound')[1] rescue diff --git a/ext/tk/lib/tktext.rb b/ext/tk/lib/tktext.rb index 6ec738edb0..f7d93618f9 100644 --- a/ext/tk/lib/tktext.rb +++ b/ext/tk/lib/tktext.rb @@ -813,12 +813,20 @@ class TkTextMark