mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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]). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28357 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
191ad1b157
commit
d35f8ea885
3 changed files with 107 additions and 108 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
Fri Jun 18 01:50:21 2010 Yusuke Endoh <mame@tsg.ne.jp>
|
||||||
|
|
||||||
|
* 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@tsg.ne.jp>
|
Fri Jun 18 01:22:55 2010 Yusuke Endoh <mame@tsg.ne.jp>
|
||||||
|
|
||||||
* lib/webrick/httpservlet/filehandler.rb
|
* lib/webrick/httpservlet/filehandler.rb
|
||||||
|
|
97
class.c
97
class.c
|
@ -833,7 +833,7 @@ method_entry(ID key, const rb_method_entry_t *me, st_table *list)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
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;
|
VALUE ary;
|
||||||
int recur;
|
int recur;
|
||||||
|
@ -852,6 +852,7 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int (*func) (ID, lo
|
||||||
for (; mod; mod = RCLASS_SUPER(mod)) {
|
for (; mod; mod = RCLASS_SUPER(mod)) {
|
||||||
st_foreach(RCLASS_M_TBL(mod), method_entry, (st_data_t)list);
|
st_foreach(RCLASS_M_TBL(mod), method_entry, (st_data_t)list);
|
||||||
if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
|
if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
|
||||||
|
if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
|
||||||
if (!recur) break;
|
if (!recur) break;
|
||||||
}
|
}
|
||||||
ary = rb_ary_new();
|
ary = rb_ary_new();
|
||||||
|
@ -891,7 +892,7 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int (*func) (ID, lo
|
||||||
VALUE
|
VALUE
|
||||||
rb_class_instance_methods(int argc, VALUE *argv, VALUE mod)
|
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 @@ rb_class_instance_methods(int argc, VALUE *argv, VALUE mod)
|
||||||
VALUE
|
VALUE
|
||||||
rb_class_protected_instance_methods(int argc, VALUE *argv, VALUE mod)
|
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 @@ rb_class_protected_instance_methods(int argc, VALUE *argv, VALUE mod)
|
||||||
VALUE
|
VALUE
|
||||||
rb_class_private_instance_methods(int argc, VALUE *argv, VALUE mod)
|
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,7 +945,93 @@ rb_class_private_instance_methods(int argc, VALUE *argv, VALUE mod)
|
||||||
VALUE
|
VALUE
|
||||||
rb_class_public_instance_methods(int argc, VALUE *argv, VALUE mod)
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
107
object.c
107
object.c
|
@ -1751,109 +1751,10 @@ rb_mod_const_defined(int argc, VALUE *argv, VALUE mod)
|
||||||
return RTEST(recur) ? rb_const_defined(mod, id) : rb_const_defined_at(mod, id);
|
return RTEST(recur) ? rb_const_defined(mod, id) : rb_const_defined_at(mod, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
VALUE rb_obj_methods(int argc, VALUE *argv, VALUE obj);
|
||||||
* call-seq:
|
VALUE rb_obj_protected_methods(int argc, VALUE *argv, VALUE obj);
|
||||||
* obj.methods -> array
|
VALUE rb_obj_private_methods(int argc, VALUE *argv, VALUE obj);
|
||||||
*
|
VALUE rb_obj_public_methods(int argc, VALUE *argv, VALUE obj);
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
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:
|
* call-seq:
|
||||||
|
|
Loading…
Add table
Reference in a new issue