Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 5 additions & 12 deletions src/libraries/System.Private.CoreLib/src/System/Span.cs
Original file line number Diff line number Diff line change
Expand Up @@ -284,18 +284,11 @@ public void Fill(T value)
{
if (Unsafe.SizeOf<T>() == 1)
{
#if MONO
// Mono runtime's implementation of initblk performs a null check on the address.
// We'll perform a length check here to avoid passing a null address in the empty span case.
if (_length != 0)
#endif
{
// Special-case single-byte types like byte / sbyte / bool.
// The runtime eventually calls memset, which can efficiently support large buffers.
// We don't need to check IsReferenceOrContainsReferences because no references
// can ever be stored in types this small.
Unsafe.InitBlockUnaligned(ref Unsafe.As<T, byte>(ref _pointer.Value), Unsafe.As<T, byte>(ref value), (uint)_length);
}
// Special-case single-byte types like byte / sbyte / bool.
// The runtime eventually calls memset, which can efficiently support large buffers.
// We don't need to check IsReferenceOrContainsReferences because no references
// can ever be stored in types this small.
Unsafe.InitBlockUnaligned(ref Unsafe.As<T, byte>(ref _pointer.Value), Unsafe.As<T, byte>(ref value), (uint)_length);
}
else
{
Expand Down
14 changes: 8 additions & 6 deletions src/mono/mono/mini/interp/interp.c
Original file line number Diff line number Diff line change
Expand Up @@ -6804,18 +6804,20 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
MINT_IN_CASE(MINT_CPBLK) {
gpointer dest = LOCAL_VAR (ip [1], gpointer);
gpointer src = LOCAL_VAR (ip [2], gpointer);
if (!dest || !src)
guint32 size = LOCAL_VAR (ip [3], guint32);
if (size && (!dest || !src))
THROW_EX (mono_get_exception_null_reference(), ip);
/* FIXME: value and size may be int64... */
memcpy (dest, src, LOCAL_VAR (ip [3], gint32));
else
memcpy (dest, src, size);
ip += 4;
MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_INITBLK) {
gpointer dest = LOCAL_VAR (ip [1], gpointer);
NULL_CHECK (dest);
/* FIXME: value and size may be int64... */
memset (dest, LOCAL_VAR (ip [2], gint32), LOCAL_VAR (ip [3], gint32));
guint32 size = LOCAL_VAR (ip [3], guint32);
if (size)
NULL_CHECK (dest);
memset (dest, LOCAL_VAR (ip [2], gint32), size);
ip += 4;
MINT_IN_BREAK;
}
Expand Down