ruby-changes:24192
From: nagachika <ko1@a...>
Date: Thu, 28 Jun 2012 09:40:04 +0900 (JST)
Subject: [ruby-changes:24192] nagachika:r36243 (trunk): * class.c (class_instance_method_list): consider prepended Class/Module
nagachika 2012-06-28 09:39:52 +0900 (Thu, 28 Jun 2012) New Revision: 36243 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36243 Log: * class.c (class_instance_method_list): consider prepended Class/Module when recur != 0. [ruby-dev:45863] [Bug #6660] * test/ruby/test_module.rb (test_prepend_instance_methods_false): add a test for it. Modified files: trunk/ChangeLog trunk/class.c trunk/test/ruby/test_module.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 36242) +++ ChangeLog (revision 36243) @@ -1,3 +1,12 @@ +Thu Jun 28 09:27:09 2012 CHIKANAGA Tomoyuki <nagachika@r...> + + * class.c (class_instance_method_list): consider prepended Class/Module + when recur != 0. [ruby-dev:45863] [Bug #6660] + + * test/ruby/test_module.rb (test_prepend_instance_methods_false): add + a test for it. + + Thu Jun 28 06:12:42 2012 Nobuyoshi Nakada <nobu@r...> * class.c (rb_mod_ancestors): fix ancestors order. Index: class.c =================================================================== --- class.c (revision 36242) +++ class.c (revision 36243) @@ -938,7 +938,7 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (st_data_t, st_data_t, st_data_t)) { VALUE ary; - int recur; + int recur, prepended = 0; st_table *list; if (argc == 0) { @@ -950,10 +950,15 @@ recur = RTEST(r); } + if (!recur && RCLASS_ORIGIN(mod) != mod) { + mod = RCLASS_ORIGIN(mod); + prepended = 1; + } + list = st_init_numtable(); for (; mod; mod = RCLASS_SUPER(mod)) { if (RCLASS_M_TBL(mod)) st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list); - if (BUILTIN_TYPE(mod) == T_ICLASS) continue; + if (BUILTIN_TYPE(mod) == T_ICLASS && !prepended) continue; if (obj && FL_TEST(mod, FL_SINGLETON)) continue; if (!recur) break; } Index: test/ruby/test_module.rb =================================================================== --- test/ruby/test_module.rb (revision 36242) +++ test/ruby/test_module.rb (revision 36243) @@ -1327,4 +1327,10 @@ class_eval(&block) if block end end + + def test_prepend_instance_methods_false + bug6660 = '[ruby-dev:45863]' + assert_equal([:m1], Class.new{ prepend Module.new; def m1; end }.instance_methods(false), bug6660) + assert_equal([:m1], Class.new(Class.new{def m2;end}){ prepend Module.new; def m1; end }.instance_methods(false), bug6660) + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/