summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c44
1 files changed, 20 insertions, 24 deletions
diff --git a/eval.c b/eval.c
index cddf518adf..c17ac16b08 100644
--- a/eval.c
+++ b/eval.c
@@ -25,7 +25,7 @@ static VALUE rb_frame_self(void);
static ID removed, singleton_removed, undefined, singleton_undefined;
static ID init, eqq, each, aref, aset, match, missing;
static ID added, singleton_added;
-static ID object_id, __send, __send_bang, respond_to;
+static ID object_id, __send__, respond_to;
VALUE rb_eLocalJumpError;
VALUE rb_eSysStackError;
@@ -1471,7 +1471,7 @@ send_internal(int argc, VALUE *argv, VALUE recv, int scope)
/*
* call-seq:
* obj.send(symbol [, args...]) => obj
- * obj.__send__(symbol [, args...]) => obj
+ * obj.__send__(symbol [, args...]) => obj
*
* Invokes the method identified by _symbol_, passing it any
* arguments specified. You can use <code>__send__</code> if the name
@@ -1489,34 +1489,33 @@ send_internal(int argc, VALUE *argv, VALUE recv, int scope)
VALUE
rb_f_send(int argc, VALUE *argv, VALUE recv)
{
- int scope = NOEX_PUBLIC;
- rb_thread_t *th = GET_THREAD();
- rb_control_frame_t *cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
-
- if (SPECIAL_CONST_P(cfp->sp[0])) {
- scope = NOEX_NOSUPER | NOEX_PRIVATE;
- }
-
- return send_internal(argc, argv, recv, scope);
+ return send_internal(argc, argv, recv, NOEX_NOSUPER | NOEX_PRIVATE);
}
+
/*
* call-seq:
- * obj.send!(symbol [, args...]) => obj
- * obj.__send!(symbol [, args...]) => obj
+ * obj.invoke_method(symbol [, args...]) => obj
*
* Invokes the method identified by _symbol_, passing it any
- * arguments specified. Unlike send, which calls public methods only
- * when it is invoked in function call style, send! always aware of
- * private methods.
+ * 1arguments specified. Unlike send, invoke_method calls public
+ * methods only, unless it's invoked in a function call style.
*
- * 1.send!(:puts, "hello") # prints "foo"
+ * 1.invoke_method(:puts, "hello") # causes NoMethodError
*/
VALUE
-rb_f_send_bang(int argc, VALUE *argv, VALUE recv)
+rb_invoke_method(int argc, VALUE *argv, VALUE recv)
{
- return send_internal(argc, argv, recv, NOEX_NOSUPER | NOEX_PRIVATE);
+ int scope = NOEX_PUBLIC;
+ rb_thread_t *th = GET_THREAD();
+ rb_control_frame_t *cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
+
+ if (SPECIAL_CONST_P(cfp->sp[0])) {
+ scope = NOEX_NOSUPER | NOEX_PRIVATE;
+ }
+
+ return send_internal(argc, argv, recv, scope);
}
VALUE
@@ -2718,8 +2717,7 @@ Init_eval(void)
singleton_undefined = rb_intern("singleton_method_undefined");
object_id = rb_intern("object_id");
- __send = rb_intern("__send");
- __send_bang = rb_intern("__send!");
+ __send__ = rb_intern("__send__");
rb_define_virtual_variable("$@", errat_getter, errat_setter);
rb_define_virtual_variable("$!", errinfo_getter, 0);
@@ -2748,9 +2746,7 @@ Init_eval(void)
rb_define_method(rb_cBasicObject, "send", rb_f_send, -1);
rb_define_method(rb_cBasicObject, "__send__", rb_f_send, -1);
- rb_define_method(rb_cBasicObject, "__send", rb_f_send, -1);
- rb_define_method(rb_cBasicObject, "send!", rb_f_send_bang, -1);
- rb_define_method(rb_cBasicObject, "__send!", rb_f_send_bang, -1);
+ rb_define_method(rb_mKernel, "invoke_method", rb_invoke_method, -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);