diff options
| author | Yukihiro Matz Matsumoto <[email protected]> | 2012-12-10 16:43:03 +0900 |
|---|---|---|
| committer | Yukihiro Matz Matsumoto <[email protected]> | 2012-12-10 16:43:03 +0900 |
| commit | f312af11afec6e347e1e4507bff95f2286deac46 (patch) | |
| tree | b1ed8bf9902e9a32d6fb6d83331a59754ddcda21 | |
| parent | ce56f19b02a0c9ddd5715750b34cf7f9554f19f4 (diff) | |
| download | mruby-f312af11afec6e347e1e4507bff95f2286deac46.tar.gz mruby-f312af11afec6e347e1e4507bff95f2286deac46.zip | |
new function mrb_closure_new_cfunc(); close #609
| -rw-r--r-- | src/proc.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/proc.c b/src/proc.c index 07834e86d..c40d0382f 100644 --- a/src/proc.c +++ b/src/proc.c @@ -26,15 +26,14 @@ mrb_proc_new(mrb_state *mrb, mrb_irep *irep) return p; } -struct RProc * -mrb_closure_new(mrb_state *mrb, mrb_irep *irep) +static void +closure_setup(mrb_state *mrb, struct RProc *p, int nlocals) { - struct RProc *p = mrb_proc_new(mrb, irep); struct REnv *e; if (!mrb->ci->env) { e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->ci->proc->env); - e->flags= (unsigned int)mrb->ci->proc->body.irep->nlocals; + e->flags= (unsigned int)nlocals; e->mid = mrb->ci->mid; e->cioff = mrb->ci - mrb->cibase; e->stack = mrb->stack; @@ -48,6 +47,15 @@ mrb_closure_new(mrb_state *mrb, mrb_irep *irep) } struct RProc * +mrb_closure_new(mrb_state *mrb, mrb_irep *irep) +{ + struct RProc *p = mrb_proc_new(mrb, irep); + + closure_setup(mrb, p, mrb->ci->proc->body.irep->nlocals); + return p; +} + +struct RProc * mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func) { struct RProc *p; @@ -59,6 +67,15 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func) return p; } +struct RProc * +mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals) +{ + struct RProc *p = mrb_proc_new_cfunc(mrb, func); + + closure_setup(mrb, p, nlocals); + return p; +} + void mrb_proc_copy(struct RProc *a, struct RProc *b) { |
