summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-01-25 04:55:07 -0800
committerYukihiro "Matz" Matsumoto <[email protected]>2014-01-25 04:55:07 -0800
commitb69bb896fcae64373606172fc43c558f02d4207f (patch)
tree3240f552ea496ffc3a32f5e7635fbb37691ba526 /src
parente0e5aebc66833dfe55b362678032f7e0e4a265d7 (diff)
parent25045345c9ae9f456b27c9fbc63caee6372e16d4 (diff)
downloadmruby-b69bb896fcae64373606172fc43c558f02d4207f.tar.gz
mruby-b69bb896fcae64373606172fc43c558f02d4207f.zip
Merge pull request #1664 from h2so5/clone-class-module
clone Class/Module rightly
Diffstat (limited to 'src')
-rw-r--r--src/kernel.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/kernel.c b/src/kernel.c
index 15567a65f..e811b394c 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -294,12 +294,22 @@ mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj)
}
static void
+copy_class(mrb_state *mrb, mrb_value dst, mrb_value src)
+{
+ struct RClass *dc = mrb_class_ptr(dst);
+ struct RClass *sc = mrb_class_ptr(src);
+ dc->mt = kh_copy(mt, mrb, sc->mt);
+ dc->super = sc->super;
+}
+
+static void
init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
{
- switch (mrb_type(obj)) {
- case MRB_TT_OBJECT:
+ switch (mrb_type(obj)) {
case MRB_TT_CLASS:
case MRB_TT_MODULE:
+ copy_class(mrb, dest, obj);
+ case MRB_TT_OBJECT:
case MRB_TT_SCLASS:
case MRB_TT_HASH:
case MRB_TT_DATA: