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

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/

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