ruby-changes:27692
From: nobu <ko1@a...>
Date: Wed, 13 Mar 2013 15:13:17 +0900 (JST)
Subject: [ruby-changes:27692] nobu:r39744 (trunk): class.c: from the origin class
nobu 2013-03-13 15:13:08 +0900 (Wed, 13 Mar 2013) New Revision: 39744 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39744 Log: class.c: from the origin class * class.c (rb_obj_singleton_methods): collect methods from the origin class. [ruby-core:53207] [Bug #8044] Modified files: trunk/ChangeLog trunk/class.c trunk/test/ruby/test_object.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 39743) +++ ChangeLog (revision 39744) @@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Wed Mar 13 15:13:04 2013 Nobuyoshi Nakada <nobu@r...> + + * class.c (rb_obj_singleton_methods): collect methods from the origin + class. [ruby-core:53207] [Bug #8044] + Wed Mar 13 14:51:26 2013 Nobuyoshi Nakada <nobu@r...> * vm_method.c (rb_export_method): directly override the flag of method Index: class.c =================================================================== --- class.c (revision 39743) +++ class.c (revision 39744) @@ -1228,8 +1228,8 @@ rb_obj_public_methods(int argc, VALUE *a https://github.com/ruby/ruby/blob/trunk/class.c#L1228 VALUE rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj) { - VALUE recur, ary, klass; - st_table *list; + VALUE recur, ary, klass, origin; + st_table *list, *mtbl; if (argc == 0) { recur = Qtrue; @@ -1238,16 +1238,17 @@ rb_obj_singleton_methods(int argc, VALUE https://github.com/ruby/ruby/blob/trunk/class.c#L1238 rb_scan_args(argc, argv, "01", &recur); } klass = CLASS_OF(obj); + origin = RCLASS_ORIGIN(klass); list = st_init_numtable(); if (klass && FL_TEST(klass, FL_SINGLETON)) { - if (RCLASS_M_TBL(klass)) - st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list); + if ((mtbl = RCLASS_M_TBL(origin)) != 0) + st_foreach(mtbl, method_entry_i, (st_data_t)list); klass = RCLASS_SUPER(klass); } if (RTEST(recur)) { while (klass && (FL_TEST(klass, FL_SINGLETON) || RB_TYPE_P(klass, T_ICLASS))) { - if (RCLASS_M_TBL(klass)) - st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list); + if (klass != origin && (mtbl = RCLASS_M_TBL(klass)) != 0) + st_foreach(mtbl, method_entry_i, (st_data_t)list); klass = RCLASS_SUPER(klass); } } Index: test/ruby/test_object.rb =================================================================== --- test/ruby/test_object.rb (revision 39743) +++ test/ruby/test_object.rb (revision 39744) @@ -159,6 +159,15 @@ class TestObject < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_object.rb#L159 assert_equal([:foo2], (o2.public_methods(false) - o0.public_methods(false)).sort) end + def test_methods_prepend + bug8044 = '[ruby-core:53207] [Bug #8044]' + o = Object.new + def o.foo; end + assert_equal([:foo], o.methods(false)) + class << o; prepend Module.new; end + assert_equal([:foo], o.methods(false), bug8044) + end + def test_instance_variable_get o = Object.new o.instance_eval { @foo = :foo } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/