summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--bootstraptest/test_method.rb6
-rw-r--r--eval.c22
-rw-r--r--lib/delegate.rb4
4 files changed, 17 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 4f952d08b1..031d4740ec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Dec 10 14:33:50 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * eval.c (rb_f_public_send): rename invoke_method to public_send.
+ it now invokes public method only no matter how it's called.
+
Mon Dec 10 14:00:43 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* transcode.c: new file to provide encoding conversion features.
diff --git a/bootstraptest/test_method.rb b/bootstraptest/test_method.rb
index 89488a40bc..8b5d584e31 100644
--- a/bootstraptest/test_method.rb
+++ b/bootstraptest/test_method.rb
@@ -336,7 +336,7 @@ assert_equal '1', %q( class C; def m(x,a=7) a end end;
assert_equal '[1, 2]', %q( class C; def m(*a) a end end;
C.new.send(:m,1,2).inspect )
assert_equal '1', %q( class C; def m() 7 end; private :m end
- begin C.new.invoke_method(:m); rescue NoMethodError; 1 end )
+ begin C.new.public_send(:m); rescue NoMethodError; 1 end )
assert_equal '1', %q( class C; def m() 1 end; private :m end
C.new.send(:m) )
@@ -919,8 +919,8 @@ assert_equal %q{[:ok, :ok, :ok, :ok, :ok, :ok, :ng, :ng]}, %q{
test{o2.mm}
test{o1.send :m}
test{o2.send :mm}
- test{o1.invoke_method :m}
- test{o2.invoke_method :mm}
+ test{o1.public_send :m}
+ test{o2.public_send :mm}
test{o1.method(:m).call}
test{o2.method(:mm).call}
$ans
diff --git a/eval.c b/eval.c
index 6cfd503e60..e7d144e83a 100644
--- a/eval.c
+++ b/eval.c
@@ -1509,27 +1509,19 @@ rb_f_send(int argc, VALUE *argv, VALUE recv)
/*
* call-seq:
- * obj.invoke_method(symbol [, args...]) => obj
+ * obj.public_send(symbol [, args...]) => obj
*
* Invokes the method identified by _symbol_, passing it any
- * arguments specified. Unlike send, invoke_method calls public
- * methods only, unless it's invoked in a function call style.
+ * arguments specified. Unlike send, public_send calls public
+ * methods only.
*
- * 1.invoke_method(:puts, "hello") # causes NoMethodError
+ * 1.public_send(:puts, "hello") # causes NoMethodError
*/
VALUE
-rb_invoke_method(int argc, VALUE *argv, VALUE recv)
+rb_f_public_send(int argc, VALUE *argv, VALUE recv)
{
- int rb_vm_cfunc_funcall_p(rb_control_frame_t *);
- int scope = NOEX_PUBLIC;
- rb_thread_t *th = GET_THREAD();
-
- if (rb_vm_cfunc_funcall_p(th->cfp)) {
- scope = NOEX_NOSUPER | NOEX_PRIVATE;
- }
-
- return send_internal(argc, argv, recv, scope);
+ return send_internal(argc, argv, recv, NOEX_PUBLIC);
}
VALUE
@@ -2760,7 +2752,7 @@ Init_eval(void)
rb_define_method(rb_cBasicObject, "__send__", rb_f_send, -1);
rb_define_method(rb_mKernel, "send", rb_f_send, -1);
- rb_define_method(rb_mKernel, "invoke_method", rb_invoke_method, -1);
+ rb_define_method(rb_mKernel, "public_send", rb_f_public_send, -1);
rb_define_method(rb_mKernel, "instance_eval", rb_obj_instance_eval, -1);
rb_define_method(rb_mKernel, "instance_exec", rb_obj_instance_exec, -1);
diff --git a/lib/delegate.rb b/lib/delegate.rb
index 809faa32c6..8501ed1064 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -115,7 +115,7 @@
# implementation, see SimpleDelegator.
#
class Delegator
- preserved = [:__id__, :object_id, :__send__, :invoke_method, :respond_to?, :send]
+ preserved = [:__id__, :object_id, :__send__, :public_send, :respond_to?, :send]
instance_methods.each do |m|
next if preserved.include?(m)
undef_method m
@@ -262,7 +262,7 @@ def DelegateClass(superclass)
klass = Class.new
methods = superclass.public_instance_methods(true)
methods -= [
- :__id__, :object_id, :__send__, :invoke_method, :respond_to?, :send,
+ :__id__, :object_id, :__send__, :public_send, :respond_to?, :send,
:==, :equal?, :initialize, :method_missing, :__getobj__, :__setobj__,
:clone, :dup, :marshal_dump, :marshal_load,
]