diff --git a/ChangeLog b/ChangeLog index 2bb33c88be..e06efbe692 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Jan 22 00:37:47 1998 Yukihiro Matsumoto + + * class.c (rb_define_method): `initialize' should always be + private, even if it defined by C extensions. + + * eval.c (rb_eval): `initialize' should always be private. + Thu Jan 22 16:21:08 1998 Yukihiro Matsumoto * eval.c (rb_eval): some singleton class def cause SEGV. @@ -10,7 +17,8 @@ Wed Jan 21 01:43:42 1998 Yukihiro Matsumoto * eval.c (PUSH_FRAME): do not use ALLOCA_N(). crash on some platforms that use missing/alloca.c. - * regex.c (re_compile_pattern): too many pops for non register subexpr. + * regex.c (re_compile_pattern): too many pops for non register + subexpr. * parse.y (yylex): open parentheses after identifiers are argument list, even if whitespaces have seen. diff --git a/class.c b/class.c index 13c9298c1c..6f6a9bc5b8 100644 --- a/class.c +++ b/class.c @@ -419,15 +419,11 @@ rb_define_method(klass, name, func, argc) VALUE (*func)(); int argc; { - rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc), NOEX_PUBLIC); -} + ID id = rb_intern(name); -void -rb_undef_method(klass, name) - VALUE klass; - char *name; -{ - rb_add_method(klass, rb_intern(name), 0, NOEX_PUBLIC); + rb_add_method(klass, id, NEW_CFUNC(func, argc), + (name[0] == 'i' && id == rb_intern("initialize"))? + NOEX_PRIVATE:NOEX_PUBLIC); } void @@ -440,6 +436,14 @@ rb_define_private_method(klass, name, func, argc) rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc), NOEX_PRIVATE); } +void +rb_undef_method(klass, name) + VALUE klass; + char *name; +{ + rb_add_method(klass, rb_intern(name), 0, NOEX_PUBLIC); +} + VALUE rb_singleton_class(obj) VALUE obj; diff --git a/eval.c b/eval.c index e6901c69ae..c33078ee95 100644 --- a/eval.c +++ b/eval.c @@ -2117,7 +2117,7 @@ rb_eval(self, node) rb_clear_cache_by_id(node->nd_mid); } - if (FL_TEST(the_scope,SCOPE_PRIVATE)) { + if (FL_TEST(the_scope,SCOPE_PRIVATE) || node->nd_mid == init) { noex = NOEX_PRIVATE; } else { @@ -2127,9 +2127,6 @@ rb_eval(self, node) if (FL_TEST(the_scope,SCOPE_MODFUNC)) { rb_add_method(rb_singleton_class(the_class), node->nd_mid, node->nd_defn, NOEX_PUBLIC); - } - - if (FL_TEST(the_scope, SCOPE_MODFUNC)) { rb_funcall(the_class, rb_intern("singleton_method_added"), 1, INT2FIX(node->nd_mid)); } diff --git a/ext/Setup b/ext/Setup index 867d88cfda..9e3a2474c3 100644 --- a/ext/Setup +++ b/ext/Setup @@ -10,4 +10,4 @@ #socket #tkutil #tcltklib -gtk +#gtk diff --git a/ext/gtk/gtk.c b/ext/gtk/gtk.c index a0f922796c..137590da5a 100644 --- a/ext/gtk/gtk.c +++ b/ext/gtk/gtk.c @@ -5246,7 +5246,6 @@ Init_gtk() /* GtkObject */ rb_define_method(gObject, "initialize", gobj_initialize, -1); - rb_define_method(gObject, "initialize", gobj_initialize, -1); rb_define_method(gObject, "set_flags", gobj_set_flags, 1); rb_define_method(gObject, "unset_flags", gobj_unset_flags, 1); rb_define_method(gObject, "destroy", gobj_destroy, 0);