-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Allow reference types for pinned GC.AllocateArray() #89293
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
d579879
5fc9157
376fb89
808d582
ea6de35
c403266
30fd375
13fe7a1
3aeca6b
2e502dc
d7dfad7
3a1bca6
4b805e5
f3aff36
349970a
bfe62ec
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1058,11 +1058,52 @@ private static void AllocateArrayTooLarge() | |
| Assert.Throws<OutOfMemoryException>(() => GC.AllocateUninitializedArray<double>(int.MaxValue, pinned: true)); | ||
| } | ||
|
|
||
| [Fact] | ||
| private static void AllocateArrayRefType() | ||
| struct EmbeddedValueType<T> | ||
jkotas marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| { | ||
| unsafe fixed byte _[7]; | ||
|
||
| public T Value; | ||
| } | ||
|
|
||
| [Theory] | ||
| [InlineData(false), InlineData(true)] | ||
| private static void AllocateArray_UninitializedOrNot_WithManagedType_DoesNotThrow(bool pinned) | ||
| { | ||
| void TryType<T>() | ||
| { | ||
| GC.AllocateUninitializedArray<T>(100, pinned); | ||
| GC.AllocateArray<T>(100, pinned); | ||
|
|
||
| GC.AllocateArray<EmbeddedValueType<T>>(100, pinned); | ||
| GC.AllocateUninitializedArray<EmbeddedValueType<T>>(100, pinned); | ||
| } | ||
|
|
||
| TryType<string>(); | ||
| TryType<object>(); | ||
| } | ||
|
|
||
| [Theory] | ||
| [InlineData(false), InlineData(true)] | ||
| private unsafe static void AllocateArrayPinned_ManagedValueType_CanRoundtripThroughPointer(bool uninitialized) | ||
| { | ||
| GC.AllocateUninitializedArray<string>(100); | ||
| Assert.Throws<ArgumentException>(() => GC.AllocateUninitializedArray<string>(100, pinned: true)); | ||
| const int k_Length = 100; | ||
AaronRobinsonMSFT marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| var rng = new Random(0xAF); | ||
|
|
||
| var array = uninitialized ? GC.AllocateUninitializedArray<EmbeddedValueType<string>>(k_Length, pinned: true) : GC.AllocateArray<EmbeddedValueType<string>>(k_Length, pinned: true); | ||
| byte* pointer = (byte*)Unsafe.AsPointer(ref array[0]); | ||
| var size = Unsafe.SizeOf<EmbeddedValueType<string>>(); | ||
|
|
||
| for(int i = 0; i < k_Length; ++i) | ||
| { | ||
| var idx = rng.Next(k_Length); | ||
| ref var evt = ref Unsafe.AsRef<EmbeddedValueType<string>>(pointer + size * idx); | ||
|
|
||
| var stringValue = rng.NextSingle().ToString(); | ||
| evt.Value = stringValue; | ||
|
|
||
| Assert.Equal(evt.Value, array[idx].Value); | ||
| } | ||
|
|
||
| GC.KeepAlive(array); | ||
| } | ||
|
|
||
| [Fact] | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.