From 1281cb00e53d2a4425fc28c3f75dee48e8e7a2d3 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 17 Dec 2007 23:01:50 +0000 Subject: * proc.c (rb_obj_public_method): Object#public_method to retrieve public method object. * proc.c (rb_mod_public_instance_method): Module#public_instance_method to retrieve public instance method from class / module. * proc.c (mnew): visibility check added. * eval_error.ci (rb_print_undef): add rb_ prefix. * eval_error.ci (rb_print_undef): add visibility in the error message. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14284 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- proc.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'proc.c') diff --git a/proc.c b/proc.c index d2bf571393..0bc3e99963 100644 --- a/proc.c +++ b/proc.c @@ -638,7 +638,7 @@ bm_mark(struct METHOD *data) NODE *rb_get_method_body(VALUE klass, ID id, ID *idp); static VALUE -mnew(VALUE klass, VALUE obj, ID id, VALUE mclass) +mnew(VALUE klass, VALUE obj, ID id, VALUE mclass, int scope) { VALUE method; NODE *body; @@ -648,7 +648,10 @@ mnew(VALUE klass, VALUE obj, ID id, VALUE mclass) again: if ((body = rb_get_method_body(klass, id, 0)) == 0) { - print_undef(rclass, oid); + rb_print_undef(rclass, oid, 0); + } + if (scope && (body->nd_noex & NOEX_MASK) != NOEX_PUBLIC) { + rb_print_undef(rclass, oid, (body->nd_noex & NOEX_MASK)); } klass = body->nd_clss; @@ -864,7 +867,13 @@ method_owner(VALUE obj) VALUE rb_obj_method(VALUE obj, VALUE vid) { - return mnew(CLASS_OF(obj), obj, rb_to_id(vid), rb_cMethod); + return mnew(CLASS_OF(obj), obj, rb_to_id(vid), rb_cMethod, Qfalse); +} + +VALUE +rb_obj_public_method(VALUE obj, VALUE vid) +{ + return mnew(CLASS_OF(obj), obj, rb_to_id(vid), rb_cMethod, Qtrue); } /* @@ -900,9 +909,15 @@ rb_obj_method(VALUE obj, VALUE vid) */ static VALUE -rb_mod_method(VALUE mod, VALUE vid) +rb_mod_instance_method(VALUE mod, VALUE vid) +{ + return mnew(mod, Qundef, rb_to_id(vid), rb_cUnboundMethod, Qfalse); +} + +static VALUE +rb_mod_public_instance_method(VALUE mod, VALUE vid) { - return mnew(mod, Qundef, rb_to_id(vid), rb_cUnboundMethod); + return mnew(mod, Qundef, rb_to_id(vid), rb_cUnboundMethod, Qtrue); } /* @@ -1518,6 +1533,7 @@ Init_Proc(void) 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); + rb_define_method(rb_mKernel, "public_method", rb_obj_public_method, 1); /* UnboundMethod */ rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cObject); @@ -1535,7 +1551,8 @@ Init_Proc(void) rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1); /* Module#*_method */ - rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1); + rb_define_method(rb_cModule, "instance_method", rb_mod_instance_method, 1); + rb_define_method(rb_cModule, "public_instance_method", rb_mod_public_instance_method, 1); rb_define_private_method(rb_cModule, "define_method", rb_mod_define_method, -1); /* Kernel */ -- cgit v1.2.3