summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-18 08:02:30 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-18 08:02:30 +0000
commit1c03862049be55c911c1dfb2621c3be42d7c0d09 (patch)
treea0c0c5aa74e28b7d947f72a69ae9d9f46ec0eccd /vm.c
parent942a54302de5bfa4665960947c403e1c0b6831ad (diff)
* eval_load.c (rb_require_safe, ruby_init_ext): load with ruby level
cfp. [ruby-core:10779] * eval_intern.h, vm.c (rb_vm_call_cfunc): new function to call a function with ruby level cfp. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12570 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/vm.c b/vm.c
index 40a627fdc5..6ad62d2fa9 100644
--- a/vm.c
+++ b/vm.c
@@ -1902,3 +1902,18 @@ rb_thread_current_status(rb_thread_t *th)
return str;
}
+
+VALUE
+rb_vm_call_cfunc(VALUE recv, VALUE (*func)(VALUE), VALUE arg, rb_block_t *blockptr, VALUE filename)
+{
+ rb_thread_t *th = GET_THREAD();
+ rb_control_frame_t *reg_cfp = th->cfp;
+ volatile VALUE iseq = rb_iseq_new(0, filename, filename, 0, ISEQ_TYPE_TOP);
+ VALUE val;
+
+ push_frame(th, DATA_PTR(iseq), FRAME_MAGIC_TOP,
+ recv, (VALUE)blockptr, 0, reg_cfp->sp, 0, 1);
+ val = (*func)(arg);
+ pop_frame(th);
+ return val;
+}