summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-24 10:06:23 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-24 10:06:23 +0000
commit1757fc9927fe25b761fca9f2391d1982e7a781c3 (patch)
tree481602fbaf7d4d215d8447ab246c939ea2218a18 /vm.c
parentf2074245b4c4d712cb74716c680d876eda9b8789 (diff)
* 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.c28
1 files changed, 28 insertions, 0 deletions
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 */