summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorMasamitsu MURASE <[email protected]>2012-06-21 02:00:05 +0900
committerMasamitsu MURASE <[email protected]>2012-06-24 16:39:08 +0900
commit2a2ffe7f7dc5202b29a1f59ab5e128b7040e0d86 (patch)
tree0a7e145cca174c0b811e9e847a771a2a81e626e0 /src
parent6d3b35e064ce46cc97530a4fc41e64e28c555c1a (diff)
downloadmruby-2a2ffe7f7dc5202b29a1f59ab5e128b7040e0d86.tar.gz
mruby-2a2ffe7f7dc5202b29a1f59ab5e128b7040e0d86.zip
Modify Kernel#clone and Kernel#dup.
Kernel#clone, Kernel#dup: - 'iv' should not be shared with the original object, but it should be copied. Kernel#clone: - 'mt' of singleton_class should be copied.
Diffstat (limited to 'src')
-rw-r--r--src/kernel.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/kernel.c b/src/kernel.c
index 8da112ee5..5e17d4b5a 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -338,7 +338,12 @@ mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj)
if (klass->iv) {
clone->iv = klass->iv;
}
- clone->mt = kh_init(mt, mrb);
+ if (klass->mt) {
+ clone->mt = kh_copy(mt, mrb, klass->mt);
+ }
+ else {
+ clone->mt = kh_init(mt, mrb);
+ }
clone->tt = MRB_TT_SCLASS;
return clone;
}
@@ -361,10 +366,11 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
case MRB_TT_CLASS:
case MRB_TT_MODULE:
if (ROBJECT(dest)->iv) {
+ kh_destroy(iv, ROBJECT(dest)->iv);
ROBJECT(dest)->iv = 0;
}
if (ROBJECT(obj)->iv) {
- ROBJECT(dest)->iv = ROBJECT(obj)->iv;
+ ROBJECT(dest)->iv = kh_copy(iv, mrb, ROBJECT(obj)->iv);
}
break;
@@ -446,9 +452,8 @@ mrb_obj_dup(mrb_state *mrb, mrb_value obj)
mrb_raise(mrb, E_TYPE_ERROR, "can't dup %s", mrb_obj_classname(mrb, obj));
}
p = mrb_obj_alloc(mrb, mrb_type(obj), mrb_obj_class(mrb, obj));
- //init_copy(dup, obj);
dup = mrb_obj_value(p);
- mrb_funcall(mrb, dup, "initialize_copy", 1, obj);
+ init_copy(mrb, dup, obj);
return dup;
}