diff --git a/ChangeLog b/ChangeLog index a90498f695..ef2bfb6531 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Mon Jan 7 21:40:36 2013 Shugo Maeda + + * vm_method.c (Init_eval_method): main.public and main.private + should be private. + + * proc.c (Init_Proc): main.define_method should be private. + + * test/ruby/test_module.rb: related test. + Mon Jan 7 20:48:47 2013 Shugo Maeda * eval.c (Init_eval): main.include should be private. diff --git a/proc.c b/proc.c index c5122daed6..07592c12dd 100644 --- a/proc.c +++ b/proc.c @@ -2286,7 +2286,8 @@ Init_Proc(void) /* Kernel */ rb_define_method(rb_mKernel, "define_singleton_method", rb_obj_define_method, -1); - rb_define_singleton_method(rb_vm_top_self(), "define_method", top_define_method, -1); + rb_define_private_method(rb_singleton_class(rb_vm_top_self()), + "define_method", top_define_method, -1); } /* diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb index 185c445091..340c37762a 100644 --- a/test/ruby/test_module.rb +++ b/test/ruby/test_module.rb @@ -1597,22 +1597,22 @@ class TestModule < Test::Unit::TestCase assert_raise(NameError){ m.instance_eval { remove_const(:__FOO__) } } end - def test_top_include_is_private - main = eval("self", TOPLEVEL_BINDING) - methods = main.singleton_class.private_instance_methods(false) - assert(methods.include?(:include)) + def test_private_top_methods + assert_top_method_is_private(:include) + assert_top_method_is_private(:public) + assert_top_method_is_private(:private) + assert_top_method_is_private(:define_method) + end - assert_in_out_err([], <<-INPUT, ["true"], []) - module M - end - include M - p singleton_class < M - INPUT + private - assert_in_out_err([], <<-INPUT, [], /private method `include' called for main:Object \(NoMethodError\)/) - module M - end - self.include M + def assert_top_method_is_private(method) + top = eval("self", TOPLEVEL_BINDING) + methods = top.singleton_class.private_instance_methods(false) + assert(methods.include?(method), "#{method} should be private") + + assert_in_out_err([], <<-INPUT, [], /private method `#{method}' called for main:Object \(NoMethodError\)/) + self.#{method} INPUT end end diff --git a/vm_method.c b/vm_method.c index f219d7cb43..cfeb012bde 100644 --- a/vm_method.c +++ b/vm_method.c @@ -1610,8 +1610,10 @@ Init_eval_method(void) rb_define_method(rb_cModule, "public_class_method", rb_mod_public_method, -1); rb_define_method(rb_cModule, "private_class_method", rb_mod_private_method, -1); - rb_define_singleton_method(rb_vm_top_self(), "public", top_public, -1); - rb_define_singleton_method(rb_vm_top_self(), "private", top_private, -1); + rb_define_private_method(rb_singleton_class(rb_vm_top_self()), + "public", top_public, -1); + rb_define_private_method(rb_singleton_class(rb_vm_top_self()), + "private", top_private, -1); object_id = rb_intern("object_id"); added = rb_intern("method_added");