ruby-changes:27970
From: nobu <ko1@a...>
Date: Sun, 31 Mar 2013 17:18:19 +0900 (JST)
Subject: [ruby-changes:27970] nobu:r40022 (trunk): proc.c: consider noex in define_method
nobu 2013-03-31 17:18:09 +0900 (Sun, 31 Mar 2013) New Revision: 40022 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=40022 Log: proc.c: consider noex in define_method * proc.c (rb_mod_define_method): consider visibility in define_method. patch by mashiro <mail AT mashiro.org>. fix GH-268. Modified files: trunk/ChangeLog trunk/proc.c trunk/test/ruby/test_method.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 40021) +++ ChangeLog (revision 40022) @@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sun Mar 31 17:17:56 2013 Nobuyoshi Nakada <nobu@r...> + + * proc.c (rb_mod_define_method): consider visibility in define_method. + patch by mashiro <mail AT mashiro.org>. fix GH-268. + Sun Mar 31 15:40:30 2013 Nobuyoshi Nakada <nobu@r...> * win32/configure.bat: try to fix option arguments split by commas and Index: proc.c =================================================================== --- proc.c (revision 40021) +++ proc.c (revision 40022) @@ -1377,7 +1377,7 @@ rb_mod_define_method(int argc, VALUE *ar https://github.com/ruby/ruby/blob/trunk/proc.c#L1377 { ID id; VALUE body; - int noex = NOEX_PUBLIC; + int noex = (int)rb_vm_cref()->nd_visi; if (argc == 1) { id = rb_to_id(argv[0]); @@ -1410,6 +1410,9 @@ rb_mod_define_method(int argc, VALUE *ar https://github.com/ruby/ruby/blob/trunk/proc.c#L1410 } } rb_method_entry_set(mod, id, method->me, noex); + if (noex == NOEX_MODFUNC) { + rb_method_entry_set(rb_singleton_class(mod), id, method->me, NOEX_PUBLIC); + } } else if (rb_obj_is_proc(body)) { rb_proc_t *proc; @@ -1423,6 +1426,9 @@ rb_mod_define_method(int argc, VALUE *ar https://github.com/ruby/ruby/blob/trunk/proc.c#L1426 proc->block.klass = mod; } rb_add_method(mod, id, VM_METHOD_TYPE_BMETHOD, (void *)body, noex); + if (noex == NOEX_MODFUNC) { + rb_add_method(rb_singleton_class(mod), id, VM_METHOD_TYPE_BMETHOD, (void *)body, NOEX_PUBLIC); + } } else { /* type error */ Index: test/ruby/test_method.rb =================================================================== --- test/ruby/test_method.rb (revision 40021) +++ test/ruby/test_method.rb (revision 40022) @@ -270,6 +270,38 @@ class TestMethod < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_method.rb#L270 assert_equal(:meth, c.new.meth, feature4254) end + def test_define_method_visibility + c = Class.new do + public + define_method(:foo) {:foo} + protected + define_method(:bar) {:bar} + private + define_method(:baz) {:baz} + end + + assert_equal(true, c.public_method_defined?(:foo)) + assert_equal(false, c.public_method_defined?(:bar)) + assert_equal(false, c.public_method_defined?(:baz)) + + assert_equal(false, c.protected_method_defined?(:foo)) + assert_equal(true, c.protected_method_defined?(:bar)) + assert_equal(false, c.protected_method_defined?(:baz)) + + assert_equal(false, c.private_method_defined?(:foo)) + assert_equal(false, c.private_method_defined?(:bar)) + assert_equal(true, c.private_method_defined?(:baz)) + + m = Module.new do + module_function + define_method(:foo) {:foo} + end + assert_equal(true, m.respond_to?(:foo)) + assert_equal(false, m.public_method_defined?(:foo)) + assert_equal(false, m.protected_method_defined?(:foo)) + assert_equal(true, m.private_method_defined?(:foo)) + end + def test_super_in_proc_from_define_method c1 = Class.new { def m -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/