summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2019-07-20 22:39:48 +0900
committerKOBAYASHI Shuji <[email protected]>2019-07-20 22:41:57 +0900
commit7675fcb5d3e8e19964b46df7c1547e27f4a2bbde (patch)
tree56b7b23ceb7bde1df79c47f0e0da152c1920a8ce /src/class.c
parentcf4cddf7a1e67109ca36f058719fa62c48b6b315 (diff)
downloadmruby-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/class.c')
-rw-r--r--src/class.c9
1 files changed, 9 insertions, 0 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");