Author: lupus
Date: 2007-02-28 10:54:45 -0500 (Wed, 28 Feb 2007)
New Revision: 73563

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/boehm-gc.c
   trunk/mono/mono/metadata/null-gc.c
   trunk/mono/mono/metadata/object.c
   trunk/mono/mono/metadata/object.h
Log:


Wed Feb 28 16:53:40 CET 2007 Paolo Molaro <[EMAIL PROTECTED]>

        * boehm-gc.c, null-gc.c, object.h, object.c: sgen gc fixes
        for clone operations.



Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-02-28 15:45:53 UTC (rev 73562)
+++ trunk/mono/mono/metadata/ChangeLog  2007-02-28 15:54:45 UTC (rev 73563)
@@ -1,3 +1,9 @@
+
+Wed Feb 28 16:53:40 CET 2007 Paolo Molaro <[EMAIL PROTECTED]>
+
+       * boehm-gc.c, null-gc.c, object.h, object.c: sgen gc fixes
+       for clone operations.
+
 2007-02-28  Zoltan Varga  <[EMAIL PROTECTED]>
 
        * marshal.c: Fix warnings.

Modified: trunk/mono/mono/metadata/boehm-gc.c
===================================================================
--- trunk/mono/mono/metadata/boehm-gc.c 2007-02-28 15:45:53 UTC (rev 73562)
+++ trunk/mono/mono/metadata/boehm-gc.c 2007-02-28 15:54:45 UTC (rev 73563)
@@ -245,5 +245,10 @@
 {
 }
 
+void
+mono_gc_wbarrier_object (MonoObject *object)
+{
+}
+
 #endif /* no Boehm GC */
 

Modified: trunk/mono/mono/metadata/null-gc.c
===================================================================
--- trunk/mono/mono/metadata/null-gc.c  2007-02-28 15:45:53 UTC (rev 73562)
+++ trunk/mono/mono/metadata/null-gc.c  2007-02-28 15:54:45 UTC (rev 73563)
@@ -149,5 +149,10 @@
 {
 }
 
+void
+mono_gc_wbarrier_object (MonoObject* obj)
+{
+}
+
 #endif
 

Modified: trunk/mono/mono/metadata/object.c
===================================================================
--- trunk/mono/mono/metadata/object.c   2007-02-28 15:45:53 UTC (rev 73562)
+++ trunk/mono/mono/metadata/object.c   2007-02-28 15:54:45 UTC (rev 73563)
@@ -2841,7 +2841,11 @@
        o = mono_object_allocate (size, obj->vtable);
        /* do not copy the sync state */
        memcpy ((char*)o + sizeof (MonoObject), (char*)obj + sizeof 
(MonoObject), size - sizeof (MonoObject));
-       
+
+#ifdef HAVE_SGEN_GC
+       if (obj->vtable->klass->has_references)
+               mono_gc_wbarrier_object (o);
+#endif
        mono_profiler_allocation (o, obj->vtable->klass);
 
        if (obj->vtable->klass->has_finalize)
@@ -2869,7 +2873,18 @@
        size = mono_array_length (src);
        g_assert (size == mono_array_length (dest));
        size *= mono_array_element_size (klass);
+#ifdef HAVE_SGEN_GC
+       if (klass->valuetype) {
+               if (klass->has_references)
+                       mono_value_copy_array (dest, 0, src, mono_array_length 
(src));
+               else
+                       memcpy (&dest->vector, &src->vector, size);
+       } else {
+               mono_array_memcpy_refs (dest, 0, src, 0, mono_array_length 
(src));
+       }
+#else
        memcpy (&dest->vector, &src->vector, size);
+#endif
 }
 
 /**
@@ -2895,7 +2910,18 @@
                o = mono_array_new_full (domain, klass, &size, NULL);
 
                size *= mono_array_element_size (klass);
+#ifdef HAVE_SGEN_GC
+               if (klass->valuetype) {
+                       if (klass->has_references)
+                               mono_value_copy_array (o, 0, array, 
mono_array_length (array));
+                       else
+                               memcpy (&o->vector, &array->vector, size);
+               } else {
+                       mono_array_memcpy_refs (o, 0, array, 0, 
mono_array_length (array));
+               }
+#else
                memcpy (&o->vector, &array->vector, size);
+#endif
                return o;
        }
        
@@ -2907,7 +2933,18 @@
                sizes [i + klass->rank] = array->bounds [i].lower_bound;
        }
        o = mono_array_new_full (domain, klass, sizes, sizes + klass->rank);
+#ifdef HAVE_SGEN_GC
+       if (klass->valuetype) {
+               if (klass->has_references)
+                       mono_value_copy_array (o, 0, array, mono_array_length 
(array));
+               else
+                       memcpy (&o->vector, &array->vector, size);
+       } else {
+               mono_array_memcpy_refs (o, 0, array, 0, mono_array_length 
(array));
+       }
+#else
        memcpy (&o->vector, &array->vector, size);
+#endif
 
        return o;
 }
@@ -3241,6 +3278,10 @@
 
        size = size - sizeof (MonoObject);
 
+#ifdef HAVE_SGEN_GC
+       mono_gc_wbarrier_value_copy ((char *)res + sizeof (MonoObject), value, 
1, class);
+#endif
+
 #if NO_UNALIGNED_ACCESS
        memcpy ((char *)res + sizeof (MonoObject), value, size);
 #else

Modified: trunk/mono/mono/metadata/object.h
===================================================================
--- trunk/mono/mono/metadata/object.h   2007-02-28 15:45:53 UTC (rev 73562)
+++ trunk/mono/mono/metadata/object.h   2007-02-28 15:54:45 UTC (rev 73563)
@@ -313,6 +313,7 @@
 void mono_gc_wbarrier_arrayref_copy (MonoArray *arr, gpointer slot_ptr, int 
count);
 void mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value);
 void mono_gc_wbarrier_value_copy    (gpointer dest, gpointer src, int count, 
MonoClass *klass);
+void mono_gc_wbarrier_object        (MonoObject* obj);
 
 G_END_DECLS
 

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to