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

define_method to copy block body

parent 77aa261f
......@@ -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);
......
......@@ -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;
}
......
......@@ -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);
}
......
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