Commit 730f5304 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

define_method to copy block body

parent 77aa261f
...@@ -49,6 +49,7 @@ struct RProc { ...@@ -49,6 +49,7 @@ struct RProc {
struct RProc *mrb_proc_new(mrb_state*, mrb_irep*); struct RProc *mrb_proc_new(mrb_state*, mrb_irep*);
struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t); struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
struct RProc *mrb_closure_new(mrb_state*, mrb_irep*); struct RProc *mrb_closure_new(mrb_state*, mrb_irep*);
void mrb_proc_copy(struct RProc *a, struct RProc *b);
#include "mruby/khash.h" #include "mruby/khash.h"
KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1); KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1);
......
...@@ -1364,14 +1364,17 @@ static mrb_value ...@@ -1364,14 +1364,17 @@ static mrb_value
mod_define_method(mrb_state *mrb, mrb_value self) mod_define_method(mrb_state *mrb, mrb_value self)
{ {
struct RClass *c = mrb_class_ptr(self); struct RClass *c = mrb_class_ptr(self);
struct RProc *p;
mrb_sym mid; mrb_sym mid;
mrb_value blk; mrb_value blk;
mrb_get_args(mrb, "n&", &mid, &blk); mrb_get_args(mrb, "n&", &mid, &blk);
if (mrb_nil_p(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; return blk;
} }
......
...@@ -55,8 +55,8 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func) ...@@ -55,8 +55,8 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func)
return p; return p;
} }
static inline void void
proc_copy(struct RProc *a, struct RProc *b) mrb_proc_copy(struct RProc *a, struct RProc *b)
{ {
a->flags = b->flags; a->flags = b->flags;
a->body = b->body; a->body = b->body;
...@@ -75,7 +75,7 @@ mrb_proc_initialize(mrb_state *mrb, mrb_value self) ...@@ -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"); mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
} }
else { else {
proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk)); mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk));
} }
return self; return self;
} }
...@@ -89,7 +89,7 @@ mrb_proc_init_copy(mrb_state *mrb, mrb_value self) ...@@ -89,7 +89,7 @@ mrb_proc_init_copy(mrb_state *mrb, mrb_value self)
if (mrb_type(proc) != MRB_TT_PROC) { if (mrb_type(proc) != MRB_TT_PROC) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "not a 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; return self;
} }
...@@ -133,7 +133,7 @@ proc_lambda(mrb_state *mrb, mrb_value self) ...@@ -133,7 +133,7 @@ proc_lambda(mrb_state *mrb, mrb_value self)
p = mrb_proc_ptr(blk); p = mrb_proc_ptr(blk);
if (!MRB_PROC_STRICT_P(p)) { if (!MRB_PROC_STRICT_P(p)) {
struct RProc *p2 = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, p->c); 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; p2->flags |= MRB_PROC_STRICT;
return mrb_obj_value(p2); return mrb_obj_value(p2);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment