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

ruby-changes:13117

From: nobu <ko1@a...>
Date: Sun, 13 Sep 2009 00:03:20 +0900 (JST)
Subject: [ruby-changes:13117] Ruby:r24867 (trunk): * vm_method.c (rb_add_method, rb_add_method_me): call method added

nobu	2009-09-13 00:03:02 +0900 (Sun, 13 Sep 2009)

  New Revision: 24867

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24867

  Log:
    * vm_method.c (rb_add_method, rb_add_method_me): call method added
      hook after definition.  [ruby-core:25536]

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_module.rb
    trunk/version.h
    trunk/vm_method.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24866)
+++ ChangeLog	(revision 24867)
@@ -1,3 +1,8 @@
+Sun Sep 13 00:03:01 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* vm_method.c (rb_add_method, rb_add_method_me): call method added
+	  hook after definition.  [ruby-core:25536]
+
 Sat Sep 12 22:47:24 2009  Tanaka Akira  <akr@f...>
 
 	* lib/open-uri.rb (URI::FTP#buffer_open): use the port specified in
Index: vm_method.c
===================================================================
--- vm_method.c	(revision 24866)
+++ vm_method.c	(revision 24867)
@@ -212,6 +212,12 @@
 
     st_insert(mtbl, mid, (st_data_t) me);
 
+    return me;
+}
+
+static void
+method_added(VALUE klass, ID mid)
+{
     if (mid != ID_ALLOCATOR && ruby_running) {
 	if (FL_TEST(klass, FL_SINGLETON)) {
 	    rb_funcall(rb_iv_get(klass, "__attached__"), singleton_added, 1, ID2SYM(mid));
@@ -220,8 +226,6 @@
 	    rb_funcall(klass, added, 1, ID2SYM(mid));
 	}
     }
-
-    return me;
 }
 
 rb_method_entry_t *
@@ -260,6 +264,7 @@
       default:
 	rb_bug("rb_add_method: unsupported method type (%d)\n", type);
     }
+    method_added(klass, mid);
     return me;
 }
 
@@ -267,7 +272,9 @@
 rb_add_method_me(VALUE klass, ID mid, const rb_method_entry_t *me, rb_method_flag_t noex)
 {
     rb_method_type_t type = me->def ? me->def->type : VM_METHOD_TYPE_UNDEF;
-    return rb_add_method_def(klass, mid, type, me->def, noex);
+    rb_method_entry_t *newme = rb_add_method_def(klass, mid, type, me->def, noex);
+    method_added(klass, mid);
+    return newme;
 }
 
 void
Index: version.h
===================================================================
--- version.h	(revision 24866)
+++ version.h	(revision 24867)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.2"
-#define RUBY_RELEASE_DATE "2009-09-12"
+#define RUBY_RELEASE_DATE "2009-09-13"
 #define RUBY_PATCHLEVEL -1
 #define RUBY_BRANCH_NAME "trunk"
 
@@ -8,7 +8,7 @@
 #define RUBY_VERSION_TEENY 1
 #define RUBY_RELEASE_YEAR 2009
 #define RUBY_RELEASE_MONTH 9
-#define RUBY_RELEASE_DAY 12
+#define RUBY_RELEASE_DAY 13
 
 #include "ruby/version.h"
 
Index: test/ruby/test_module.rb
===================================================================
--- test/ruby/test_module.rb	(revision 24866)
+++ test/ruby/test_module.rb	(revision 24867)
@@ -755,4 +755,23 @@
     c = eval("class C\u{df}; self; end")
     assert_equal("TestModule::C\u{df}", c.name, '[ruby-core:24600]')
   end
+
+  def test_method_added
+    memo = []
+    mod = Module.new do
+      mod = self
+      (class << self ; self ; end).class_eval do
+        define_method :method_added do |sym|
+          memo << sym
+          memo << mod.instance_methods(false)
+          memo << (mod.instance_method(sym) rescue nil)
+        end
+      end
+      def f
+      end
+    end
+    assert_equal :f, memo.shift
+    assert_equal mod.instance_methods(false), memo.shift
+    assert_equal mod.instance_method(:f), memo.shift
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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