summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorksss <[email protected]>2016-10-12 22:05:14 +0900
committerksss <[email protected]>2016-10-12 22:19:54 +0900
commitefe4f30b3982e8ff85a9142933955d6fa0bdebc7 (patch)
treee8abf65b51d1fbd5399adf7ae6611b3b6b452649 /src/class.c
parent9d3167cabe64b61ce707a00a3a3108b580cf5d11 (diff)
downloadmruby-efe4f30b3982e8ff85a9142933955d6fa0bdebc7.tar.gz
mruby-efe4f30b3982e8ff85a9142933955d6fa0bdebc7.zip
Module#define_method supports proc argument
Diffstat (limited to 'src/class.c')
-rw-r--r--src/class.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/class.c b/src/class.c
index 47a6c846b..00fc9c12e 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1773,9 +1773,21 @@ mod_define_method(mrb_state *mrb, mrb_value self)
struct RClass *c = mrb_class_ptr(self);
struct RProc *p;
mrb_sym mid;
+ mrb_value proc = mrb_undef_value();
mrb_value blk;
- mrb_get_args(mrb, "n&", &mid, &blk);
+ mrb_get_args(mrb, "n|o&", &mid, &proc, &blk);
+ switch (mrb_type(proc)) {
+ case MRB_TT_PROC:
+ blk = proc;
+ break;
+ case MRB_TT_UNDEF:
+ /* ignored */
+ break;
+ default:
+ mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected Proc)", mrb_obj_value(mrb_obj_class(mrb, proc)));
+ break;
+ }
if (mrb_nil_p(blk)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
}