From 0fe77cd26b04c652a0dae30f0f04980a324ea95d Mon Sep 17 00:00:00 2001 From: matz Date: Sat, 20 Jan 2007 14:25:07 +0000 Subject: [PATCH] * eval_proc.c (method_receiver): add new method to get the bound receiver of the method object. [ruby-talk:234949] * eval_proc.c (method_name): new method to get the name of a method. * eval_proc.c (method_owner): a new method to get the class or module that defines the method. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11551 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 11 +++++++++++ proc.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/ChangeLog b/ChangeLog index 86426de149..bc26090b3b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,17 @@ Sat Jan 20 11:18:49 2007 Masaki Suketa * test/win32ole/test_win32ole.rb: ditto. +Sat Jan 20 06:45:21 2007 Yukihiro Matsumoto + + * eval_proc.c (method_receiver): add new method to get the bound + receiver of the method object. [ruby-talk:234949] + + * eval_proc.c (method_name): new method to get the name of a + method. + + * eval_proc.c (method_owner): a new method to get the class or + module that defines the method. + Fri Jan 19 17:12:23 2007 Masaki Suketa * ext/win32ole/win32ole.c (Init_win32ole): add WIN32OLE_VARIANT::Empty, diff --git a/proc.c b/proc.c index 24ec148063..f0cd3f3733 100644 --- a/proc.c +++ b/proc.c @@ -790,6 +790,54 @@ method_unbind(obj) return method; } +/* + * call-seq: + * meth.receiver => object + * + * Returns the bound receiver of the method object. + */ + +static VALUE +method_receiver(VALUE obj) +{ + struct METHOD *data; + + Data_Get_Struct(obj, struct METHOD, data); + return data->recv; +} + +/* + * call-seq: + * meth.name => string + * + * Returns the name of the method. + */ + +static VALUE +method_name(VALUE obj) +{ + struct METHOD *data; + + Data_Get_Struct(obj, struct METHOD, data); + return rb_str_new2(rb_id2name(data->id)); +} + +/* + * call-seq: + * meth.owner => class_or_module + * + * Returns the class or module that defines the method. + */ + +static VALUE +method_owner(VALUE obj) +{ + struct METHOD *data; + + Data_Get_Struct(obj, struct METHOD, data); + return data->klass; +} + /* * call-seq: * obj.method(sym) => method @@ -1492,6 +1540,9 @@ Init_Proc() rb_define_method(rb_cMethod, "inspect", method_inspect, 0); rb_define_method(rb_cMethod, "to_s", method_inspect, 0); rb_define_method(rb_cMethod, "to_proc", method_proc, 0); + rb_define_method(rb_cMethod, "receiver", method_receiver, 0); + rb_define_method(rb_cMethod, "name", method_name, 0); + rb_define_method(rb_cMethod, "owner", method_owner, 0); rb_define_method(rb_cMethod, "unbind", method_unbind, 0); rb_define_method(rb_mKernel, "method", rb_obj_method, 1); @@ -1506,6 +1557,8 @@ Init_Proc() rb_define_method(rb_cUnboundMethod, "arity", method_arity_m, 0); rb_define_method(rb_cUnboundMethod, "inspect", method_inspect, 0); rb_define_method(rb_cUnboundMethod, "to_s", method_inspect, 0); + rb_define_method(rb_cUnboundMethod, "name", method_name, 0); + rb_define_method(rb_cUnboundMethod, "owner", method_owner, 0); rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1); /* Module#*_method */