[sgen] For object copies, check whether we can use memmove in the wbarrier.
authorMark Probst <mark.probst@gmail.com>
Tue, 28 Apr 2015 01:01:49 +0000 (18:01 -0700)
committerMark Probst <mark.probst@gmail.com>
Wed, 29 Apr 2015 21:54:13 +0000 (14:54 -0700)
mono/metadata/object.c
mono/metadata/sgen-mono.c

index 822f901902e28d6ef39addc835807edf7eadfe61..21df3486224604646fd7058bbc0970766b226aec 100644 (file)
@@ -4623,13 +4623,9 @@ mono_object_clone (MonoObject *obj)
 
        o = mono_object_allocate (size, obj->vtable);
 
-       if (obj->vtable->klass->has_references) {
-               mono_gc_wbarrier_object_copy (o, obj);
-       } else {
-               int size = obj->vtable->klass->instance_size;
-               /* do not copy the sync state */
-               mono_gc_memmove_atomic ((char*)o + sizeof (MonoObject), (char*)obj + sizeof (MonoObject), size - sizeof (MonoObject));
-       }
+       /* If the object doesn't contain references this will do a simple memmove. */
+       mono_gc_wbarrier_object_copy (o, obj);
+
        if (G_UNLIKELY (profile_allocs))
                mono_profiler_allocation (o, obj->vtable->klass);
 
index 5f8e1d59809318d856e4aed305c6b6e0eb0f83ed..c1f50f6ebc6f94eb5e457f7b3ddac8c0bcc7aa28 100644 (file)
@@ -138,7 +138,7 @@ mono_gc_wbarrier_object_copy (MonoObject* obj, MonoObject *src)
 
        HEAVY_STAT (++stat_wbarrier_object_copy);
 
-       if (sgen_ptr_in_nursery (obj) || ptr_on_stack (obj)) {
+       if (sgen_ptr_in_nursery (obj) || ptr_on_stack (obj) || !SGEN_OBJECT_HAS_REFERENCES (src)) {
                size = mono_object_class (obj)->instance_size;
                mono_gc_memmove_aligned ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
                                size - sizeof (MonoObject));