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

ruby-changes:13123

From: nobu <ko1@a...>
Date: Sun, 13 Sep 2009 00:46:57 +0900 (JST)
Subject: [ruby-changes:13123] Ruby:r24873 (trunk): * vm_method.c (CALL_METHOD_HOOK): refined with macro.

nobu	2009-09-13 00:46:42 +0900 (Sun, 13 Sep 2009)

  New Revision: 24873

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

  Log:
    * vm_method.c (CALL_METHOD_HOOK): refined with macro.

  Modified files:
    trunk/ChangeLog
    trunk/vm_method.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24872)
+++ ChangeLog	(revision 24873)
@@ -1,5 +1,7 @@
-Sun Sep 13 00:27:57 2009  Nobuyoshi Nakada  <nobu@r...>
+Sun Sep 13 00:46:39 2009  Nobuyoshi Nakada  <nobu@r...>
 
+	* vm_method.c (CALL_METHOD_HOOK): refined with macro.
+
 	* vm_method.c (rb_remove_method_id): no definition body is
 	  undefined.
 
Index: vm_method.c
===================================================================
--- vm_method.c	(revision 24872)
+++ vm_method.c	(revision 24873)
@@ -10,7 +10,7 @@
 
 static ID object_id;
 static ID removed, singleton_removed, undefined, singleton_undefined;
-static ID added, singleton_added;
+static ID added, singleton_added, attached;
 
 struct cache_entry {		/* method hash table. */
     ID mid;			/* method's id */
@@ -165,7 +165,7 @@
 	     type == VM_METHOD_TYPE_CFUNC &&
 	     mid == rb_intern("allocate")) {
 	rb_warn("defining %s.allocate is deprecated; use rb_define_alloc_func()",
-		rb_class2name(rb_iv_get(klass, "__attached__")));
+		rb_class2name(rb_ivar_get(klass, attached)));
 	mid = ID_ALLOCATOR;
     }
     if (OBJ_FROZEN(klass)) {
@@ -215,16 +215,22 @@
     return me;
 }
 
+#define CALL_METHOD_HOOK(klass, hook, mid) do {		\
+	const VALUE arg = ID2SYM(mid);			\
+	VALUE recv_class = klass;			\
+	ID hook_id = hook;				\
+	if (FL_TEST(klass, FL_SINGLETON)) {		\
+	    recv_class = rb_ivar_get(klass, attached);	\
+	    hook_id = singleton_##hook;			\
+	}						\
+	rb_funcall2(recv_class, hook_id, 1, &arg);	\
+    } while (0)
+
 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));
-	}
-	else {
-	    rb_funcall(klass, added, 1, ID2SYM(mid));
-	}
+	CALL_METHOD_HOOK(klass, added, mid);
     }
 }
 
@@ -398,12 +404,7 @@
     rb_clear_cache_for_undef(klass, mid);
     rb_free_method_entry(me);
 
-    if (FL_TEST(klass, FL_SINGLETON)) {
-	rb_funcall(rb_iv_get(klass, "__attached__"), singleton_removed, 1, ID2SYM(mid));
-    }
-    else {
-	rb_funcall(klass, removed, 1, ID2SYM(mid));
-    }
+    CALL_METHOD_HOOK(klass, removed, mid);
 }
 
 void
@@ -566,7 +567,7 @@
 	VALUE c = klass;
 
 	if (FL_TEST(c, FL_SINGLETON)) {
-	    VALUE obj = rb_iv_get(klass, "__attached__");
+	    VALUE obj = rb_ivar_get(klass, attached);
 
 	    switch (TYPE(obj)) {
 	      case T_MODULE:
@@ -584,12 +585,7 @@
 
     rb_add_method(klass, id, VM_METHOD_TYPE_UNDEF, 0, NOEX_PUBLIC);
 
-    if (FL_TEST(klass, FL_SINGLETON)) {
-	rb_funcall(rb_iv_get(klass, "__attached__"), singleton_undefined, 1, ID2SYM(id));
-    }
-    else {
-	rb_funcall(klass, undefined, 1, ID2SYM(id));
-    }
+    CALL_METHOD_HOOK(klass, undefined, id);
 }
 
 /*
@@ -1201,5 +1197,6 @@
     singleton_removed = rb_intern("singleton_method_removed");
     undefined = rb_intern("method_undefined");
     singleton_undefined = rb_intern("singleton_method_undefined");
+    attached = rb_intern("__attached__");
 }
 

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

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