diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-07-20 22:39:48 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-07-20 22:41:57 +0900 |
| commit | 7675fcb5d3e8e19964b46df7c1547e27f4a2bbde (patch) | |
| tree | 56b7b23ceb7bde1df79c47f0e0da152c1920a8ce /src | |
| parent | cf4cddf7a1e67109ca36f058719fa62c48b6b315 (diff) | |
| download | mruby-7675fcb5d3e8e19964b46df7c1547e27f4a2bbde.tar.gz mruby-7675fcb5d3e8e19964b46df7c1547e27f4a2bbde.zip | |
Fix `Module#dup` to frozen module
Before this patch:
$ bin/mruby -e 'p Module.new.freeze.dup.frozen?' #=> true
After this patch (same as Ruby):
$ bin/mruby -e 'p Module.new.freeze.dup.frozen?' #=> false
Diffstat (limited to 'src')
| -rw-r--r-- | src/class.c | 9 | ||||
| -rw-r--r-- | src/kernel.c | 1 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/class.c b/src/class.c index 2961284f5..65d21ad4f 100644 --- a/src/class.c +++ b/src/class.c @@ -2078,6 +2078,14 @@ mrb_mod_eqq(mrb_state *mrb, mrb_value mod) } static mrb_value +mrb_mod_dup(mrb_state *mrb, mrb_value self) +{ + mrb_value mod = mrb_obj_clone(mrb, self); + MRB_UNSET_FROZEN_FLAG(mrb_obj_ptr(mod)); + return mod; +} + +static mrb_value mrb_mod_module_function(mrb_state *mrb, mrb_value mod) { mrb_value *argv; @@ -2207,6 +2215,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */ mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_ARG(1,1)); mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1)); /* 15.2.2.4.7 */ + mrb_define_method(mrb, mod, "dup", mrb_mod_dup, MRB_ARGS_NONE()); mrb_undef_method(mrb, cls, "append_features"); mrb_undef_method(mrb, cls, "extend_object"); diff --git a/src/kernel.c b/src/kernel.c index a3c2d2ec6..f223be9fc 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -805,5 +805,4 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "__to_str", mrb_to_str, MRB_ARGS_NONE()); /* internal */ mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); - mrb_define_alias(mrb, mrb->module_class, "dup", "clone"); /* XXX */ } |
