From 1757fc9927fe25b761fca9f2391d1982e7a781c3 Mon Sep 17 00:00:00 2001 From: ko1 Date: Sun, 24 Jun 2007 10:06:23 +0000 Subject: * 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 --- ChangeLog | 5 +++++ vm.c | 28 ++++++++++++++++++++++++++++ vm_macro.def | 28 +--------------------------- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index 75af323df6..9c4a7bdda1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun Jun 24 19:02:33 2007 Koichi Sasada + + * vm.c, vm_macro.def : remove macro_eval_invoke_cfunc() and + add vm_call_cfunc(). + Sun Jun 24 17:54:13 2007 Koichi Sasada * insns.def, vm.c: add/fix stack overflow check. diff --git a/vm.c b/vm.c index 487797818c..c70e1d91ce 100644 --- a/vm.c +++ b/vm.c @@ -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 */ diff --git a/vm_macro.def b/vm_macro.def index 0d635c55fe..cba36a51e6 100644 --- a/vm_macro.def +++ b/vm_macro.def @@ -2,32 +2,6 @@ /* do not use C++ style comment */ /* */ -MACRO macro_eval_invoke_cfunc(num, id, recv, klass, mn, blockptr) -{ - 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, GET_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) { - SDR2(reg_cfp); - SDR2(th->cfp-5); - rb_bug("cfp consistency error - send"); - th->cfp = reg_cfp; - } - pop_frame(th); - } - EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, recv, id, klass); -} - MACRO macro_eval_invoke_func(niseqval, recv, klass, blockptr, num) { rb_iseq_t *niseq; @@ -136,7 +110,7 @@ MACRO macro_eval_invoke_method(recv, klass, id, num, mn, blockptr) NEXT_INSN(); } case NODE_CFUNC:{ - macro_eval_invoke_cfunc(num, id, recv, klass, node, blockptr); + val = vm_call_cfunc(th, GET_CFP(), num, id, recv, klass, node, blockptr); break; } case NODE_ATTRSET:{ -- cgit v1.2.3