diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-06-24 10:06:23 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-06-24 10:06:23 +0000 |
commit | 1757fc9927fe25b761fca9f2391d1982e7a781c3 (patch) | |
tree | 481602fbaf7d4d215d8447ab246c939ea2218a18 /vm.c | |
parent | f2074245b4c4d712cb74716c680d876eda9b8789 (diff) | |
download | ruby-1757fc9927fe25b761fca9f2391d1982e7a781c3.tar.gz |
* vm.c, vm_macro.def : remove macro_eval_invoke_cfunc() and
add vm_call_cfunc().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12598 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -343,6 +343,34 @@ caller_setup_args(rb_thread_t *th, rb_control_frame_t *cfp, return argc; } +static inline VALUE +vm_call_cfunc(rb_thread_t *th, rb_control_frame_t *reg_cfp, int num, + ID id, VALUE recv, VALUE klass, NODE *mn, rb_block_t *blockptr) +{ + VALUE val; + + EXEC_EVENT_HOOK(th, RUBY_EVENT_C_CALL, recv, id, klass); + { + rb_control_frame_t *cfp = + push_frame(th, 0, FRAME_MAGIC_CFUNC, + recv, (VALUE) blockptr, 0, reg_cfp->sp, 0, 1); + + cfp->method_id = id; + cfp->method_klass = klass; + + reg_cfp->sp -= num + 1; + + val = call_cfunc(mn->nd_cfnc, recv, mn->nd_argc, num, reg_cfp->sp + 1); + + if (reg_cfp != th->cfp + 1) { + rb_bug("cfp consistency error - send"); + } + pop_frame(th); + } + EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, recv, id, klass); + + return val; +} /* Env */ |