diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-01-06 00:24:59 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-01-06 00:24:59 +0000 |
commit | ce55b4c0e0062cd59eb3d5e05ffc5d75bdcde85a (patch) | |
tree | f4252badb58ec3ab74af8c2f2a99db6ccbf4d4ab /eval.c | |
parent | a782fa12681c106fe6516955f72ec048bb27bbc9 (diff) | |
download | ruby-ce55b4c0e0062cd59eb3d5e05ffc5d75bdcde85a.tar.gz |
* insns.def : support direct method dispatch with "send" or "funcall".
This means that "obj.send :m" skips "BasicObject#send" invocation
(method frame creation, etc) and "obj.m" invokes directly.
If you make backtrace, there are no enties of "send" method.
* compile.c (iseq_specialized_instruction) : fix to support above
* eval.c : ditto (remove "static" from rb_f_send and rb_f_funcall
* yarvcore.c : ditto (add a external IDs for compiler)
* yarvcore.h : ditto (add a VM_CALL_SEND_BIT macro)
* yarvtest/test_method.rb : add tests for above changes
* eval.c : remove unused "Kernel#send" declaration
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11488 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 7 |
1 files changed, 3 insertions, 4 deletions
@@ -1709,7 +1709,7 @@ send_funcall(int argc, VALUE *argv, VALUE recv, int scope) * k.send :hello, "gentle", "readers" #=> "Hello gentle readers" */ -static VALUE +VALUE rb_f_send(int argc, VALUE *argv, VALUE recv) { int scope = NOEX_PUBLIC; @@ -1736,7 +1736,7 @@ rb_f_send(int argc, VALUE *argv, VALUE recv) * 1.funcall(:puts, "hello") # prints "foo" */ -static VALUE +VALUE rb_f_funcall(int argc, VALUE *argv, VALUE recv) { return send_funcall(argc, argv, recv, NOEX_NOSUPER | NOEX_PRIVATE); @@ -2894,13 +2894,12 @@ Init_eval() rb_define_global_function("global_variables", rb_f_global_variables, 0); /* in variable.c */ rb_define_global_function("local_variables", rb_f_local_variables, 0); - rb_define_method(rb_mKernel, "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, -1); rb_define_method(rb_cBasicObject, "funcall", rb_f_funcall, -1); rb_define_method(rb_cBasicObject, "__send!", rb_f_funcall, -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); |