summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/proc.h1
-rw-r--r--src/class.c7
-rw-r--r--src/proc.c10
3 files changed, 11 insertions, 7 deletions
diff --git a/include/mruby/proc.h b/include/mruby/proc.h
index 8f178790e..f6bef23a5 100644
--- a/include/mruby/proc.h
+++ b/include/mruby/proc.h
@@ -49,6 +49,7 @@ struct RProc {
struct RProc *mrb_proc_new(mrb_state*, mrb_irep*);
struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
struct RProc *mrb_closure_new(mrb_state*, mrb_irep*);
+void mrb_proc_copy(struct RProc *a, struct RProc *b);
#include "mruby/khash.h"
KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1);
diff --git a/src/class.c b/src/class.c
index 29ec18e13..df42820e5 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1364,14 +1364,17 @@ static mrb_value
mod_define_method(mrb_state *mrb, mrb_value self)
{
struct RClass *c = mrb_class_ptr(self);
+ struct RProc *p;
mrb_sym mid;
mrb_value blk;
mrb_get_args(mrb, "n&", &mid, &blk);
if (mrb_nil_p(blk)) {
- /* raise */
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
}
- mrb_define_method_raw(mrb, c, mid, mrb_proc_ptr(blk));
+ p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+ mrb_proc_copy(p, mrb_proc_ptr(blk));
+ mrb_define_method_raw(mrb, c, mid, p);
return blk;
}
diff --git a/src/proc.c b/src/proc.c
index d223fa760..a1f8b180e 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -55,8 +55,8 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func)
return p;
}
-static inline void
-proc_copy(struct RProc *a, struct RProc *b)
+void
+mrb_proc_copy(struct RProc *a, struct RProc *b)
{
a->flags = b->flags;
a->body = b->body;
@@ -75,7 +75,7 @@ mrb_proc_initialize(mrb_state *mrb, mrb_value self)
mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
}
else {
- proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk));
+ mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk));
}
return self;
}
@@ -89,7 +89,7 @@ mrb_proc_init_copy(mrb_state *mrb, mrb_value self)
if (mrb_type(proc) != MRB_TT_PROC) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "not a proc");
}
- proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(proc));
+ mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(proc));
return self;
}
@@ -133,7 +133,7 @@ proc_lambda(mrb_state *mrb, mrb_value self)
p = mrb_proc_ptr(blk);
if (!MRB_PROC_STRICT_P(p)) {
struct RProc *p2 = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, p->c);
- proc_copy(p2, p);
+ mrb_proc_copy(p2, p);
p2->flags |= MRB_PROC_STRICT;
return mrb_obj_value(p2);
}