summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matz Matsumoto <[email protected]>2012-12-10 16:43:03 +0900
committerYukihiro Matz Matsumoto <[email protected]>2012-12-10 16:43:03 +0900
commitf312af11afec6e347e1e4507bff95f2286deac46 (patch)
treeb1ed8bf9902e9a32d6fb6d83331a59754ddcda21
parentce56f19b02a0c9ddd5715750b34cf7f9554f19f4 (diff)
downloadmruby-f312af11afec6e347e1e4507bff95f2286deac46.tar.gz
mruby-f312af11afec6e347e1e4507bff95f2286deac46.zip
new function mrb_closure_new_cfunc(); close #609
-rw-r--r--src/proc.c25
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)
{