summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-01-07 12:42:48 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-01-07 12:42:48 +0000
commit19768b6cacb1319f34944a0dc5e0bbe099d2d18e (patch)
treedff9cb9190b86c36c642dd25c18f8a8bd777fa23
parent4722c20661093f5071701941bc2f7b519f2a7283 (diff)
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38732 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog9
-rw-r--r--proc.c3
-rw-r--r--test/ruby/test_module.rb28
-rw-r--r--vm_method.c6
4 files changed, 29 insertions, 17 deletions
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 <shugo@ruby-lang.org>
+
+ * 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 <shugo@ruby-lang.org>
* 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");