Skip to content

Commit 2f00e4b

Browse files
committed
Disable some of the FastCopy fast paths since they are racy.
1 parent 035c858 commit 2f00e4b

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

Diff for: mono/metadata/icall.c

+12-3
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,6 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
718718
void * source_addr;
719719
MonoClass *src_class;
720720
MonoClass *dest_class;
721-
int i;
722721

723722
MONO_ARCH_SAVE_REGS;
724723

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

743742
/* Case1: object[] -> valuetype[] (ArrayList::ToArray) */
744743
if (src_class == mono_defaults.object_class && dest_class->valuetype) {
744+
// FIXME: This is racy
745+
return FALSE;
746+
/*
747+
int i;
745748
int has_refs = dest_class->has_references;
746749
for (i = source_idx; i < source_idx + length; ++i) {
747750
MonoObject *elem = mono_array_get (source, MonoObject*, i);
@@ -762,6 +765,7 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
762765
memcpy (addr, (char *)elem + sizeof (MonoObject), element_size);
763766
}
764767
return TRUE;
768+
*/
765769
}
766770

767771
/* Check if we're copying a char[] <==> (u)short[] */
@@ -772,13 +776,18 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
772776
if (mono_class_is_subclass_of (src_class, dest_class, FALSE))
773777
;
774778
/* Case2: object[] -> reftype[] (ArrayList::ToArray) */
775-
else if (mono_class_is_subclass_of (dest_class, src_class, FALSE))
779+
else if (mono_class_is_subclass_of (dest_class, src_class, FALSE)) {
780+
// FIXME: This is racy
781+
return FALSE;
782+
/*
783+
int i;
776784
for (i = source_idx; i < source_idx + length; ++i) {
777785
MonoObject *elem = mono_array_get (source, MonoObject*, i);
778786
if (elem && !mono_object_isinst (elem, dest_class))
779787
return FALSE;
780788
}
781-
else
789+
*/
790+
} else
782791
return FALSE;
783792
}
784793

0 commit comments

Comments
 (0)