summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-08-03 20:17:04 +0900
committerYukihiro Matsumoto <[email protected]>2012-08-03 20:17:04 +0900
commit730f53045eb85cf995b0b675ea2818a682810a4f (patch)
tree692a86a56261fc86e809e264fcbe475c649d64d3 /src/class.c
parent77aa261f3bcb9ab93e1ea9a9d89f8cba51b98873 (diff)
downloadmruby-730f53045eb85cf995b0b675ea2818a682810a4f.tar.gz
mruby-730f53045eb85cf995b0b675ea2818a682810a4f.zip
define_method to copy block body
Diffstat (limited to 'src/class.c')
-rw-r--r--src/class.c7
1 files changed, 5 insertions, 2 deletions
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;
}