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/