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

ruby-changes:16377

From: mame <ko1@a...>
Date: Fri, 18 Jun 2010 01:58:44 +0900 (JST)
Subject: [ruby-changes:16377] Ruby:r28357 (trunk): * object.c: Object#public_methods, private_methods, etc. returns

mame	2010-06-18 01:58:25 +0900 (Fri, 18 Jun 2010)

  New Revision: 28357

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

  Log:
    * object.c: Object#public_methods, private_methods, etc. returns
      method ids that belong to the class or the singleton class(es) of
      the object.  [ruby-dev:41613]
    
    * class.c: on the other hand, Module#public_instance_methods, etc.
      returns method ids that belong to the module itself (even if the
      module is singleton, it does not return method ids of super
      class(es); see [ruby-core:28837]).

  Modified files:
    trunk/ChangeLog
    trunk/class.c
    trunk/object.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28356)
+++ ChangeLog	(revision 28357)
@@ -1,3 +1,14 @@
+Fri Jun 18 01:50:21 2010  Yusuke Endoh  <mame@t...>
+
+	* object.c: Object#public_methods, private_methods, etc. returns
+	  method ids that belong to the class or the singleton class(es) of
+	  the object.  [ruby-dev:41613]
+
+	* class.c: on the other hand, Module#public_instance_methods, etc.
+	  returns method ids that belong to the module itself (even if the
+	  module is singleton, it does not return method ids of super
+	  class(es); see [ruby-core:28837]).
+
 Fri Jun 18 01:22:55 2010  Yusuke Endoh  <mame@t...>
 
 	* lib/webrick/httpservlet/filehandler.rb
Index: object.c
===================================================================
--- object.c	(revision 28356)
+++ object.c	(revision 28357)
@@ -1751,112 +1751,13 @@
     return RTEST(recur) ? rb_const_defined(mod, id) : rb_const_defined_at(mod, id);
 }
 
-/*
- *  call-seq:
- *     obj.methods    -> array
- *
- *  Returns a list of the names of methods publicly accessible in
- *  <i>obj</i>. This will include all the methods accessible in
- *  <i>obj</i>'s ancestors.
- *
- *     class Klass
- *       def kMethod()
- *       end
- *     end
- *     k = Klass.new
- *     k.methods[0..9]    #=> [:kMethod, :freeze, :nil?, :is_a?,
- *                        #    :class, :instance_variable_set,
- *                        #    :methods, :extend, :__send__, :instance_eval]
- *     k.methods.length   #=> 42
- */
+VALUE rb_obj_methods(int argc, VALUE *argv, VALUE obj);
+VALUE rb_obj_protected_methods(int argc, VALUE *argv, VALUE obj);
+VALUE rb_obj_private_methods(int argc, VALUE *argv, VALUE obj);
+VALUE rb_obj_public_methods(int argc, VALUE *argv, VALUE obj);
 
-static VALUE
-rb_obj_methods(int argc, VALUE *argv, VALUE obj)
-{
-  retry:
-    if (argc == 0) {
-	VALUE args[1];
-
-	args[0] = Qtrue;
-	return rb_class_instance_methods(1, args, CLASS_OF(obj));
-    }
-    else {
-	VALUE recur;
-
-	rb_scan_args(argc, argv, "1", &recur);
-	if (RTEST(recur)) {
-	    argc = 0;
-	    goto retry;
-	}
-	return rb_obj_singleton_methods(argc, argv, obj);
-    }
-}
-
 /*
  *  call-seq:
- *     obj.protected_methods(all=true)   -> array
- *
- *  Returns the list of protected methods accessible to <i>obj</i>. If
- *  the <i>all</i> parameter is set to <code>false</code>, only those methods
- *  in the receiver will be listed.
- */
-
-static VALUE
-rb_obj_protected_methods(int argc, VALUE *argv, VALUE obj)
-{
-    if (argc == 0) {		/* hack to stop warning */
-	VALUE args[1];
-
-	args[0] = Qtrue;
-	return rb_class_protected_instance_methods(1, args, CLASS_OF(obj));
-    }
-    return rb_class_protected_instance_methods(argc, argv, CLASS_OF(obj));
-}
-
-/*
- *  call-seq:
- *     obj.private_methods(all=true)   -> array
- *
- *  Returns the list of private methods accessible to <i>obj</i>. If
- *  the <i>all</i> parameter is set to <code>false</code>, only those methods
- *  in the receiver will be listed.
- */
-
-static VALUE
-rb_obj_private_methods(int argc, VALUE *argv, VALUE obj)
-{
-    if (argc == 0) {		/* hack to stop warning */
-	VALUE args[1];
-
-	args[0] = Qtrue;
-	return rb_class_private_instance_methods(1, args, CLASS_OF(obj));
-    }
-    return rb_class_private_instance_methods(argc, argv, CLASS_OF(obj));
-}
-
-/*
- *  call-seq:
- *     obj.public_methods(all=true)   -> array
- *
- *  Returns the list of public methods accessible to <i>obj</i>. If
- *  the <i>all</i> parameter is set to <code>false</code>, only those methods
- *  in the receiver will be listed.
- */
-
-static VALUE
-rb_obj_public_methods(int argc, VALUE *argv, VALUE obj)
-{
-    if (argc == 0) {		/* hack to stop warning */
-	VALUE args[1];
-
-	args[0] = Qtrue;
-	return rb_class_public_instance_methods(1, args, CLASS_OF(obj));
-    }
-    return rb_class_public_instance_methods(argc, argv, CLASS_OF(obj));
-}
-
-/*
- *  call-seq:
  *     obj.instance_variable_get(symbol)    -> obj
  *
  *  Returns the value of the given instance variable, or nil if the
Index: class.c
===================================================================
--- class.c	(revision 28356)
+++ class.c	(revision 28357)
@@ -833,7 +833,7 @@
 }
 
 static VALUE
-class_instance_method_list(int argc, VALUE *argv, VALUE mod, int (*func) (ID, long, VALUE))
+class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (ID, long, VALUE))
 {
     VALUE ary;
     int recur;
@@ -852,6 +852,7 @@
     for (; mod; mod = RCLASS_SUPER(mod)) {
 	st_foreach(RCLASS_M_TBL(mod), method_entry, (st_data_t)list);
 	if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
+	if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
 	if (!recur) break;
     }
     ary = rb_ary_new();
@@ -891,7 +892,7 @@
 VALUE
 rb_class_instance_methods(int argc, VALUE *argv, VALUE mod)
 {
-    return class_instance_method_list(argc, argv, mod, ins_methods_i);
+    return class_instance_method_list(argc, argv, mod, 0, ins_methods_i);
 }
 
 /*
@@ -906,7 +907,7 @@
 VALUE
 rb_class_protected_instance_methods(int argc, VALUE *argv, VALUE mod)
 {
-    return class_instance_method_list(argc, argv, mod, ins_methods_prot_i);
+    return class_instance_method_list(argc, argv, mod, 0, ins_methods_prot_i);
 }
 
 /*
@@ -929,7 +930,7 @@
 VALUE
 rb_class_private_instance_methods(int argc, VALUE *argv, VALUE mod)
 {
-    return class_instance_method_list(argc, argv, mod, ins_methods_priv_i);
+    return class_instance_method_list(argc, argv, mod, 0, ins_methods_priv_i);
 }
 
 /*
@@ -944,11 +945,97 @@
 VALUE
 rb_class_public_instance_methods(int argc, VALUE *argv, VALUE mod)
 {
-    return class_instance_method_list(argc, argv, mod, ins_methods_pub_i);
+    return class_instance_method_list(argc, argv, mod, 0, ins_methods_pub_i);
 }
 
 /*
  *  call-seq:
+ *     obj.methods    -> array
+ *
+ *  Returns a list of the names of methods publicly accessible in
+ *  <i>obj</i>. This will include all the methods accessible in
+ *  <i>obj</i>'s ancestors.
+ *
+ *     class Klass
+ *       def kMethod()
+ *       end
+ *     end
+ *     k = Klass.new
+ *     k.methods[0..9]    #=> [:kMethod, :freeze, :nil?, :is_a?,
+ *                        #    :class, :instance_variable_set,
+ *                        #    :methods, :extend, :__send__, :instance_eval]
+ *     k.methods.length   #=> 42
+ */
+
+VALUE
+rb_obj_methods(int argc, VALUE *argv, VALUE obj)
+{
+  retry:
+    if (argc == 0) {
+	VALUE args[1];
+
+	args[0] = Qtrue;
+	return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_i);
+    }
+    else {
+	VALUE recur;
+
+	rb_scan_args(argc, argv, "1", &recur);
+	if (RTEST(recur)) {
+	    argc = 0;
+	    goto retry;
+	}
+	return rb_obj_singleton_methods(argc, argv, obj);
+    }
+}
+
+/*
+ *  call-seq:
+ *     obj.protected_methods(all=true)   -> array
+ *
+ *  Returns the list of protected methods accessible to <i>obj</i>. If
+ *  the <i>all</i> parameter is set to <code>false</code>, only those methods
+ *  in the receiver will be listed.
+ */
+
+VALUE
+rb_obj_protected_methods(int argc, VALUE *argv, VALUE obj)
+{
+    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_prot_i);
+}
+
+/*
+ *  call-seq:
+ *     obj.private_methods(all=true)   -> array
+ *
+ *  Returns the list of private methods accessible to <i>obj</i>. If
+ *  the <i>all</i> parameter is set to <code>false</code>, only those methods
+ *  in the receiver will be listed.
+ */
+
+VALUE
+rb_obj_private_methods(int argc, VALUE *argv, VALUE obj)
+{
+    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_priv_i);
+}
+
+/*
+ *  call-seq:
+ *     obj.public_methods(all=true)   -> array
+ *
+ *  Returns the list of public methods accessible to <i>obj</i>. If
+ *  the <i>all</i> parameter is set to <code>false</code>, only those methods
+ *  in the receiver will be listed.
+ */
+
+VALUE
+rb_obj_public_methods(int argc, VALUE *argv, VALUE obj)
+{
+    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_pub_i);
+}
+
+/*
+ *  call-seq:
  *     obj.singleton_methods(all=true)    -> array
  *
  *  Returns an array of the names of singleton methods for <i>obj</i>.

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

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