}
/// <summary>
- /// Get an array segment from the underlying memory.
- /// If unable to get the array segment, return false with a default array segment.
- /// </summary>
- [EditorBrowsable(EditorBrowsableState.Never)]
- public bool DangerousTryGetArray(out ArraySegment<T> arraySegment)
- {
- if (_index < 0)
- {
- if (((OwnedMemory<T>)_object).TryGetArray(out var segment))
- {
- arraySegment = new ArraySegment<T>(segment.Array, segment.Offset + (_index & RemoveOwnedFlagBitMask), _length);
- return true;
- }
- }
- else if (_object is T[] arr)
- {
- arraySegment = new ArraySegment<T>(arr, _index, _length);
- return true;
- }
-
- arraySegment = default;
- return false;
- }
-
- /// <summary>
/// Copies the contents from the memory into a new array. This heap
/// allocates, so should generally be avoided, however it is sometimes
/// necessary to bridge the gap with APIs written in terms of arrays.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[EditorBrowsable(EditorBrowsableState.Never)]
- public ref T DangerousGetPinnableReference()
+ internal ref readonly T DangerousGetPinnableReference()
{
return ref _pointer.Value;
}
public ref readonly T Current
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- get
- {
- // TODO https://github.com/dotnet/coreclr/pull/14727:
- // Change this to simply be:
- // get => ref readonly _span[_index];
- // once ReadOnlySpan<T>'s indexer returns ref readonly.
-
- if ((uint)_index >= (uint)_span.Length)
- {
- ThrowHelper.ThrowIndexOutOfRangeException();
- }
-
- return ref Unsafe.Add(ref _span.DangerousGetPinnableReference(), _index);
- }
+ get => ref _span[_index];
}
}
}
using System.Diagnostics;
using System.Runtime;
using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
using Internal.Runtime.CompilerServices;
#if BIT64
ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(T));
return new Span<byte>(
- ref Unsafe.As<T, byte>(ref source.DangerousGetPinnableReference()),
+ ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(source)),
checked(source.Length * Unsafe.SizeOf<T>()));
}
ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(T));
return new ReadOnlySpan<byte>(
- ref Unsafe.As<T, byte>(ref source.DangerousGetPinnableReference()),
+ ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(source)),
checked(source.Length * Unsafe.SizeOf<T>()));
}
ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(TTo));
return new ReadOnlySpan<TTo>(
- ref Unsafe.As<TFrom, TTo>(ref source.DangerousGetPinnableReference()),
+ ref Unsafe.As<TFrom, TTo>(ref MemoryMarshal.GetReference(source)),
checked((int)((long)source.Length * Unsafe.SizeOf<TFrom>() / Unsafe.SizeOf<TTo>())));
}
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[EditorBrowsable(EditorBrowsableState.Never)]
- public ref T DangerousGetPinnableReference()
+ internal ref T DangerousGetPinnableReference()
{
return ref _pointer.Value;
}
}
#endregion
- #region TestSpanDangerousGetPinnableReference<T>
+ #region TestMemoryMarshalGetReference<T>
[Benchmark(InnerIterationCount = BaseIterations)]
[InlineData(100)]
- public static void TestSpanDangerousGetPinnableReferenceByte(int length)
+ public static void TestMemoryMarshalGetReferenceByte(int length)
{
- InvokeTestSpanDangerousGetPinnableReference<byte>(length);
+ InvokeTestMemoryMarshalGetReference<byte>(length);
}
[Benchmark(InnerIterationCount = BaseIterations)]
[InlineData(100)]
- public static void TestSpanDangerousGetPinnableReferenceString(int length)
+ public static void TestMemoryMarshalGetReferenceString(int length)
{
- InvokeTestSpanDangerousGetPinnableReference<string>(length);
+ InvokeTestMemoryMarshalGetReference<string>(length);
}
- static void InvokeTestSpanDangerousGetPinnableReference<T>(int length)
+ static void InvokeTestMemoryMarshalGetReference<T>(int length)
{
var array = new T[length];
- Invoke((int innerIterationCount) => TestSpanDangerousGetPinnableReference<T>(array, innerIterationCount),
- "TestSpanDangerousGetPinnableReference<{0}>({1})", typeof(T).Name, length);
+ Invoke((int innerIterationCount) => TestMemoryMarshalGetReference<T>(array, innerIterationCount),
+ "TestMemoryMarshalGetReference<{0}>({1})", typeof(T).Name, length);
}
[MethodImpl(MethodImplOptions.NoInlining)]
- static void TestSpanDangerousGetPinnableReference<T>(T[] array, int iterationCount)
+ static void TestMemoryMarshalGetReference<T>(T[] array, int iterationCount)
{
var sink = Sink<T>.Instance;
var span = new Span<T>(array);
for (int i = 0; i < iterationCount; i++)
{
- ref T temp = ref span.DangerousGetPinnableReference();
+ ref T temp = ref MemoryMarshal.GetReference(span);
sink.Data = temp;
}
}