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