mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
define_method to copy block body
This commit is contained in:
@@ -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);
|
||||
|
||||
+5
-2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+5
-5
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user