From 730f53045eb85cf995b0b675ea2818a682810a4f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 3 Aug 2012 20:17:04 +0900 Subject: define_method to copy block body --- include/mruby/proc.h | 1 + src/class.c | 7 +++++-- src/proc.c | 10 +++++----- 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); } -- cgit v1.2.3