diff options
| author | Masamitsu MURASE <[email protected]> | 2012-06-21 02:00:05 +0900 |
|---|---|---|
| committer | Masamitsu MURASE <[email protected]> | 2012-06-24 16:39:08 +0900 |
| commit | 2a2ffe7f7dc5202b29a1f59ab5e128b7040e0d86 (patch) | |
| tree | 0a7e145cca174c0b811e9e847a771a2a81e626e0 /src/kernel.c | |
| parent | 6d3b35e064ce46cc97530a4fc41e64e28c555c1a (diff) | |
| download | mruby-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/kernel.c')
| -rw-r--r-- | src/kernel.c | 13 |
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; } |
