mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #3224 from ksss/define_method
Module#define_method supports proc argument
This commit is contained in:
+13
-1
@@ -1783,9 +1783,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");
|
||||
}
|
||||
|
||||
@@ -494,6 +494,18 @@ end
|
||||
|
||||
# Not ISO specified
|
||||
|
||||
assert('Module#define_method') do
|
||||
c = Class.new {
|
||||
define_method(:m1) { :ok }
|
||||
define_method(:m2, Proc.new { :ok })
|
||||
}
|
||||
assert_equal c.new.m1, :ok
|
||||
assert_equal c.new.m2, :ok
|
||||
assert_raise(TypeError) do
|
||||
Class.new { define_method(:n1, nil) }
|
||||
end
|
||||
end
|
||||
|
||||
# @!group prepend
|
||||
assert('Module#prepend') do
|
||||
module M0
|
||||
|
||||
Reference in New Issue
Block a user