Skip to content
Permalink
Browse files Browse the repository at this point in the history
Disable some of the FastCopy fast paths since they are racy.
  • Loading branch information
vargaz committed Jan 18, 2011
1 parent 035c858 commit 2f00e4b
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions mono/metadata/icall.c
Expand Up @@ -718,7 +718,6 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
void * source_addr;
MonoClass *src_class;
MonoClass *dest_class;
int i;

MONO_ARCH_SAVE_REGS;

Expand All @@ -742,6 +741,10 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d

/* Case1: object[] -> valuetype[] (ArrayList::ToArray) */
if (src_class == mono_defaults.object_class && dest_class->valuetype) {
// FIXME: This is racy
return FALSE;
/*
int i;
int has_refs = dest_class->has_references;
for (i = source_idx; i < source_idx + length; ++i) {
MonoObject *elem = mono_array_get (source, MonoObject*, i);
Expand All @@ -762,6 +765,7 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
memcpy (addr, (char *)elem + sizeof (MonoObject), element_size);
}
return TRUE;
*/
}

/* Check if we're copying a char[] <==> (u)short[] */
Expand All @@ -772,13 +776,18 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
if (mono_class_is_subclass_of (src_class, dest_class, FALSE))
;
/* Case2: object[] -> reftype[] (ArrayList::ToArray) */
else if (mono_class_is_subclass_of (dest_class, src_class, FALSE))
else if (mono_class_is_subclass_of (dest_class, src_class, FALSE)) {
// FIXME: This is racy
return FALSE;
/*
int i;
for (i = source_idx; i < source_idx + length; ++i) {
MonoObject *elem = mono_array_get (source, MonoObject*, i);
if (elem && !mono_object_isinst (elem, dest_class))
return FALSE;
}
else
*/
} else
return FALSE;
}

Expand Down

0 comments on commit 2f00e4b

Please sign in to comment.