-
Notifications
You must be signed in to change notification settings - Fork 5.3k
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
Merged
jkotas
merged 16 commits into
dotnet:main
from
jthorborg:poh-allocate-array-allow-reference-types
Aug 11, 2023
Merged
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
d579879
Relaxing constraints of System.GC.AllocateArray<T>.
jthorborg 5fc9157
Adding coverage of GC.AllocateArray with ref types.
jthorborg 376fb89
Mono/NativeAOT relaxing of System.GC.AllocateArray<T>.
jthorborg 808d582
Merge branch 'dotnet:main' into poh-allocate-array-allow-reference-types
jthorborg ea6de35
Relaxed GC.AllocateUninitializedArray for ref types as well.
jthorborg c403266
Simplifiy conditionals in AllocateUninitializedArray.
jthorborg 30fd375
Also simplify path for NativeOAT.
jthorborg 13fe7a1
Simplify pinning paths.
jthorborg 3aeca6b
Revert mistake in prior refactor.
jthorborg 2e502dc
Renaming in tests.
jthorborg d7dfad7
Update src/coreclr/System.Private.CoreLib/src/System/GC.CoreCLR.cs
jkotas 3a1bca6
Apply suggestions from code review
jkotas 4b805e5
Don't use `var` if type name doesn't exist explicitly on right-hand side
jthorborg f3aff36
PR feedback for using terse method tables and JIT intrinsics for GC a…
jthorborg 349970a
Changed EmbeddedValueType and added comment.
jthorborg bfe62ec
Suggestions from PR feedback.
jthorborg File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -795,9 +795,6 @@ internal static ulong GetSegmentSize() | |
| /// <typeparam name="T">Specifies the type of the array element.</typeparam> | ||
| /// <param name="length">Specifies the length of the array.</param> | ||
| /// <param name="pinned">Specifies whether the allocated array must be pinned.</param> | ||
| /// <remarks> | ||
| /// If pinned is set to true, <typeparamref name="T"/> must not be a reference type or a type that contains object references. | ||
| /// </remarks> | ||
| [MethodImpl(MethodImplOptions.AggressiveInlining)] // forced to ensure no perf drop for small memory buffers (hot path) | ||
| public static unsafe T[] AllocateUninitializedArray<T>(int length, bool pinned = false) | ||
| { | ||
|
|
@@ -819,10 +816,6 @@ public static unsafe T[] AllocateUninitializedArray<T>(int length, bool pinned = | |
| } | ||
| #endif | ||
| } | ||
| else if (RuntimeHelpers.IsReferenceOrContainsReferences<T>()) | ||
| { | ||
| ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(T)); | ||
| } | ||
|
|
||
| // kept outside of the small arrays hot path to have inlining without big size growth | ||
| return AllocateNewUninitializedArray(length, pinned); | ||
|
|
@@ -837,7 +830,7 @@ static T[] AllocateNewUninitializedArray(int length, bool pinned) | |
| throw new OverflowException(); | ||
|
|
||
| T[]? array = null; | ||
| RuntimeImports.RhAllocateNewArray(EETypePtr.EETypePtrOf<T[]>().RawValue, (uint)length, (uint)flags, Unsafe.AsPointer(ref array)); | ||
| RuntimeImports.RhAllocateNewArray(MethodTable.Of<T[]>(), (uint)length, (uint)flags, Unsafe.AsPointer(ref array)); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you please also change the type of |
||
| if (array == null) | ||
| throw new OutOfMemoryException(); | ||
|
|
||
|
|
@@ -851,26 +844,20 @@ static T[] AllocateNewUninitializedArray(int length, bool pinned) | |
| /// <typeparam name="T">Specifies the type of the array element.</typeparam> | ||
| /// <param name="length">Specifies the length of the array.</param> | ||
| /// <param name="pinned">Specifies whether the allocated array must be pinned.</param> | ||
| /// <remarks> | ||
| /// If pinned is set to true, <typeparamref name="T"/> must not be a reference type or a type that contains object references. | ||
| /// </remarks> | ||
| public static unsafe T[] AllocateArray<T>(int length, bool pinned = false) | ||
| { | ||
| GC_ALLOC_FLAGS flags = GC_ALLOC_FLAGS.GC_ALLOC_NO_FLAGS; | ||
|
|
||
| if (pinned) | ||
| { | ||
| if (RuntimeHelpers.IsReferenceOrContainsReferences<T>()) | ||
| ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(T)); | ||
|
|
||
| flags = GC_ALLOC_FLAGS.GC_ALLOC_PINNED_OBJECT_HEAP; | ||
| } | ||
|
|
||
jkotas marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| if (length < 0) | ||
| throw new OverflowException(); | ||
|
|
||
| T[]? array = null; | ||
| RuntimeImports.RhAllocateNewArray(EETypePtr.EETypePtrOf<T[]>().RawValue, (uint)length, (uint)flags, Unsafe.AsPointer(ref array)); | ||
| RuntimeImports.RhAllocateNewArray(MethodTable.Of<T[]>(), (uint)length, (uint)flags, Unsafe.AsPointer(ref array)); | ||
| if (array == null) | ||
| throw new OutOfMemoryException(); | ||
|
|
||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.