Fix circular init in AOT equality comparer causing NRE on Mono#73
Merged
bradwilson merged 1 commit intoxunit:mainfrom Mar 20, 2026
Merged
Fix circular init in AOT equality comparer causing NRE on Mono#73bradwilson merged 1 commit intoxunit:mainfrom
bradwilson merged 1 commit intoxunit:mainfrom
Conversation
The defaultComparer field in AssertEqualityComparer (AOT path) eagerly creates AssertEqualityComparerAdapter<object>, which triggers AssertEqualityComparer<object>'s static initializer. That initializer reads defaultComparer back via GetDefaultInnerComparer before the field has been assigned. On Mono/WASM this results in DefaultInnerComparer being permanently null, leading to NullReferenceException when comparing value types via IStructuralEquatable. Fix by creating a new instance on each call, matching the non-AOT reflection path behavior. Port of dotnet/arcade#16615 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Member
|
Thanks! |
Member
|
Fix available in v3 |
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
The
defaultComparerfield inAssertEqualityComparer(AOT path) eagerly createsAssertEqualityComparerAdapter<object>, which triggersAssertEqualityComparer<object>'s static initializer. That initializer readsdefaultComparerback viaGetDefaultInnerComparerbefore the field has been assigned. On Mono/WASM this results inDefaultInnerComparerbeing permanently null, leading toNullReferenceExceptionwhen comparing value types viaIStructuralEquatable.Fix by creating a new instance on each call, matching the non-AOT reflection path behavior.
Port of dotnet/arcade#16615