diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-06-18 08:02:30 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-06-18 08:02:30 +0000 |
commit | 1c03862049be55c911c1dfb2621c3be42d7c0d09 (patch) | |
tree | a0c0c5aa74e28b7d947f72a69ae9d9f46ec0eccd /vm.c | |
parent | 942a54302de5bfa4665960947c403e1c0b6831ad (diff) | |
download | ruby-1c03862049be55c911c1dfb2621c3be42d7c0d09.tar.gz |
* 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.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -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; +} |