Watson1978
9/12/2011 - 3:31 AM

MacRuby : ticket #1262

MacRuby : ticket #1262

diff --git a/array.c b/array.c
index b4a1c7f..ac31015 100644
--- a/array.c
+++ b/array.c
@@ -1203,14 +1203,10 @@ rary_dup(VALUE ary, SEL sel)
     }
     assert(rb_klass_is_rary(klass));
 
-    VALUE dup = rary_copy(ary, klass);
+    VALUE dup = rary_alloc(klass, 0);
+    rb_obj_invoke_initialize_copy(dup, ary);
 
-    if (OBJ_TAINTED(ary)) {
-	OBJ_TAINT(dup);
-    }
-    if (OBJ_UNTRUSTED(ary)) {
-	OBJ_UNTRUST(dup);
-    }
+    OBJ_INFECT(dup, ary);
     return dup;
 }
 
diff --git a/hash.c b/hash.c
index 065d4f2..6f073d9 100644
--- a/hash.c
+++ b/hash.c
@@ -145,18 +145,6 @@ rhash_alloc(VALUE klass, SEL sel)
     return (VALUE)hash;
 }
 
-static VALUE
-rhash_copy(VALUE rcv, VALUE klass)
-{
-    NEWOBJ(dup, rb_hash_t);
-    dup->basic.flags = 0;
-    dup->basic.klass = klass;
-    GC_WB(&dup->tbl, st_copy(RHASH(rcv)->tbl));
-    GC_WB(&dup->ifnone, RHASH(rcv)->ifnone);
-    dup->has_proc_default = RHASH(rcv)->has_proc_default;
-    return (VALUE)dup;
-}
-
 VALUE
 rhash_dup(VALUE rcv, SEL sel)
 {
@@ -166,7 +154,8 @@ rhash_dup(VALUE rcv, SEL sel)
     }
     assert(rb_klass_is_rhash(klass));
 
-    VALUE dup = rhash_copy(rcv, klass);
+    VALUE dup = rhash_alloc(klass, 0);
+    rb_obj_invoke_initialize_copy(dup, rcv);
 
     OBJ_INFECT(dup, rcv);
     return dup;
diff --git a/macruby_internal.h b/macruby_internal.h
index e60bf37..d088e9e 100644
--- a/macruby_internal.h
+++ b/macruby_internal.h
@@ -91,6 +91,9 @@ rb_objc_release(void *addr)
 
 // MacRubyIntern.h
 
+/* object.c */
+void rb_obj_invoke_initialize_copy(VALUE dest, VALUE obj);
+
 /* enumerator.c */
 VALUE rb_enumeratorize(VALUE, SEL, int, VALUE *);
 #define RETURN_ENUMERATOR(obj, argc, argv) \
diff --git a/object.c b/object.c
index dc8ae7b..ac4240a 100644
--- a/object.c
+++ b/object.c
@@ -221,6 +221,12 @@ init_copy(VALUE dest, VALUE obj)
     rb_vm_call(dest, selInitializeCopy, 1, &obj);
 }
 
+void
+rb_obj_invoke_initialize_copy(VALUE dest, VALUE obj)
+{
+    init_copy(dest, obj);
+}
+
 /*
  *  call-seq:
  *     obj.clone -> an_object
diff --git a/string.c b/string.c
index fc1cb08..641a9e6 100644
--- a/string.c
+++ b/string.c
@@ -1831,14 +1831,6 @@ rstr_initialize(VALUE self, SEL sel, int argc, VALUE *argv)
 }
 
 static VALUE
-rstr_copy(VALUE rcv, VALUE klass)
-{
-    VALUE dup = rstr_alloc(klass, 0);
-    rstr_replace(dup, 0, rcv);
-    return dup;
-}
-
-static VALUE
 rstr_dup(VALUE str, SEL sel)
 {
     VALUE klass = CLASS_OF(str);
@@ -1847,7 +1839,8 @@ rstr_dup(VALUE str, SEL sel)
     }
     assert(rb_klass_is_rstr(klass));
 
-    VALUE dup = rstr_copy(str, klass);
+    VALUE dup = rstr_alloc(klass, 0);
+    rb_obj_invoke_initialize_copy(dup, str);
 
     OBJ_INFECT(dup, str);
     return dup;