From f312af11afec6e347e1e4507bff95f2286deac46 Mon Sep 17 00:00:00 2001 From: Yukihiro Matz Matsumoto Date: Mon, 10 Dec 2012 16:43:03 +0900 Subject: new function mrb_closure_new_cfunc(); close #609 --- src/proc.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'src') 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; @@ -47,6 +46,15 @@ mrb_closure_new(mrb_state *mrb, mrb_irep *irep) return p; } +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) { @@ -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) { -- cgit v1.2.3