[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]