[cDAC] Add typed field extension methods for Data classes#126713
[cDAC] Add typed field extension methods for Data classes#126713max-charlamb wants to merge 2 commits intomainfrom
Conversation
Add TargetFieldExtensions with ReadField<T>, ReadPointerField, ReadNUIntField, ReadCodePointerField, ReadDataField<T>, and ReadDataFieldPointer<T> extension methods. Each method validates the field type name from the data descriptor (when present) against the C# read type via Debug.Assert. Convert all ~110 IData<T> classes to use the new extension methods. Fix pre-existing bugs found by the type system: - DynamicStaticsInfo.GCStatics/NonGCStatics: was uint32, is TADDR (pointer) - EEClass.FieldDescList: was Read<ulong>, should be ReadPointer - ExceptionClause.ClassToken: was reading TypeHandle (nuint) as uint - SimpleComCallWrapper.RefCount: was ulong, native is LONGLONG (signed) - NativeCodeVersionNode.NativeCode: was T_POINTER, is PCODE (CodePointer) - MethodTable.EEClassOrCanonMT: was T_NUINT, managed reads as pointer Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds managed-side typed field read helpers for cDAC Target and migrates cDAC IData<T> data readers to use them, enabling debug/checked build validation against native data descriptor field types.
Changes:
- Introduces
TargetFieldExtensionswith typed field reads and Debug.Assert type compatibility checks. - Converts cDAC
IData<T>data classes to use the new typed read helpers (replacing manualRead<T>(address + offset)patterns). - Adds descriptor/type verification infrastructure (test + generator + runtime helper) and updates select native descriptor field annotations.
Reviewed changes
Copilot reviewed 115 out of 115 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| src/native/managed/cdac/tests/ContractDescriptor/TypeVerificationTests.cs | Adds a test intended to validate managed reads against a checked descriptor’s declared field types. |
| src/native/managed/cdac/tests/ContractDescriptor/checked-descriptor.json | Adds a checked-build contract descriptor fixture containing field offsets + type names. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/DataDescriptorTypeVerification.cs | Adds a DEBUG-only verification entrypoint and a noop Target wrapper for type-check instantiation. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Generators/Microsoft.Diagnostics.DataContractReader.Generators.csproj | Adds a new Roslyn generator project intended to generate verification code. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Generators/DataTypeVerificationGenerator.cs | Implements a generator to discover IData<T> implementations and emit VerifyAllDataTypes. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj | Adds InternalsVisibleTo for Microsoft.Diagnostics.DataContractReader. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/VirtualCallStubManager.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/UnwindInfo.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/TypeDesc.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/TLSIndex.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ThreadStressLog.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ThreadStore.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ThreadLocalData.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Thread.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ThisPtrRetBufPrecodeData.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/TableSegment.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/SystemDomain.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/SyncTableEntry.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/SyncBlockCache.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/SyncBlock.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/String.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StressLogModuleDesc.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StressLogChunk.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StressLog.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/SimpleComCallWrapper.cs | Switches field reads to typed helper methods; adjusts RefCount type. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/RuntimeFunction.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/RealCodeHeader.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ReadyToRunSection.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ReadyToRunInfo.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ReadyToRunHeader.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ReadyToRunCoreInfo.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ReadyToRunCoreHeader.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/RCWCleanupList.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/RCW.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/RangeSectionFragment.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/RangeSection.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ProfControlBlock.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ProbeExtensionResult.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PrecodeMachineDescriptor.cs | Switches field reads to typed helper methods (and modifies precode parsing logic). |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PortableEntryPoint.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PlatformMetadata.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImage.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEAssembly.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PatchpointInfo.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ObjectHeader.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Object.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/NativeObjectWrapperObject.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/NativeCodeVersionNode.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ModuleLookupMap.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Module.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/MethodTableAuxiliaryData.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/MethodTable.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/MethodDescVersioningState.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/MethodDescCodeData.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/MethodDescChunk.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/MethodDesc.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ManagedObjectWrapperLayout.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ManagedObjectWrapperHolderObject.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/LoaderAllocator.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/InterfaceEntry.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/InflightTLSData.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ImageDataDirectory.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ILCodeVersionNode.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ILCodeVersioningState.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/IdDispenser.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/HashMap.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/HandleTableMap.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/HandleTableBucket.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/HandleTable.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GenericsDictInfo.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GCAllocContext.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GC/OOMHistory.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GC/HeapSegment.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GC/Generation.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/GC/GCHeapSVR.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/TransitionBlock.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/TailCallFrame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/StubDispatchFrame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/SoftwareExceptionFrame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/ResumableFrame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/InlinedCallFrame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/HijackFrame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/HijackArgsAMD64.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/FuncEvalFrame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/FramedMethodFrame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/Frame.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/DebuggerEval.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/FixupPrecodeData.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/FieldDesc.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ExceptionLookupTableEntry.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ExceptionInfo.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ExceptionClause.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Exception.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/EEJitManager.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/EEClass.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/DynamicStaticsInfo.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/DynamicMetadata.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/DynamicILBlobEntry.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/DacEnumerableHash.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/CtxEntry.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/CoreLibBinder.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ComMethodTable.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ComCallWrapper.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/CodeHeapListNode.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/CGrowableSymbolStream.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/AssemblyBinder.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Assembly.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ArrayListBase.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Array.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/AppDomain.cs | Switches field reads to typed helper methods. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs | Adjusts SCCW refcount masking after RefCount signedness change. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs | Adds the new typed field read extensions + type compatibility asserts. |
| src/coreclr/vm/datadescriptor/datadescriptor.inc | Updates select native descriptor field type annotations to match actual semantics. |
Comments suppressed due to low confidence (1)
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PrecodeMachineDescriptor.cs:57
StubPrecodeSizeis read usingnameof(FixupStubPrecodeSize)(line 46), so it will fetch the wrong field offset and size when both fields exist. This will corruptStubBytes/StubIgnoredBytesreads. ReadStubPrecodeSizefrom its own field name and ensure theelsebranch resets theStub*members (currently it resetsFixup*instead).
src/native/managed/cdac/tests/ContractDescriptor/TypeVerificationTests.cs
Outdated
Show resolved
Hide resolved
src/native/managed/cdac/tests/ContractDescriptor/TypeVerificationTests.cs
Outdated
Show resolved
Hide resolved
| private static void CreateData<T>(Target target) where T : IData<T> | ||
| { | ||
| T.Create(target, default); | ||
| } |
There was a problem hiding this comment.
CreateData<T> is unused (the test uses TryCreate<T> everywhere). With warnings-as-errors enabled in this repo, unused members can break builds; remove it or use it.
src/native/managed/cdac/tests/ContractDescriptor/TypeVerificationTests.cs
Outdated
Show resolved
Hide resolved
.../managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/TargetFieldExtensions.cs
Show resolved
Hide resolved
...ics.DataContractReader.Generators/Microsoft.Diagnostics.DataContractReader.Generators.csproj
Outdated
Show resolved
Hide resolved
...ed/cdac/Microsoft.Diagnostics.DataContractReader.Generators/DataTypeVerificationGenerator.cs
Outdated
Show resolved
Hide resolved
...tive/managed/cdac/Microsoft.Diagnostics.DataContractReader/DataDescriptorTypeVerification.cs
Outdated
Show resolved
Hide resolved
This comment has been minimized.
This comment has been minimized.
ee38f27 to
a291681
Compare
a291681 to
c3a2982
Compare
…sions Convert Data classes in Frames/, GC/, and root Data/ that were missed by the initial conversion (subdirectory files, string literal field keys, underscore-prefixed variable names). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
c3a2982 to
8ad41e4
Compare
|
Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag |
|
|
||
| if (type.Fields.ContainsKey(nameof(StubPrecodeSize))) | ||
| { | ||
| StubPrecodeSize = target.Read<byte>(address + (ulong)type.Fields[nameof(FixupStubPrecodeSize)].Offset); | ||
| StubPrecodeSize = target.ReadField<byte>(address, type, nameof(FixupStubPrecodeSize)); | ||
| StubBytes = new byte[StubPrecodeSize.Value]; | ||
| target.ReadBuffer(address + (ulong)type.Fields[nameof(StubBytes)].Offset, StubBytes); | ||
| StubIgnoredBytes = new byte[StubPrecodeSize.Value]; |
There was a problem hiding this comment.
In the StubPrecodeSize branch, StubPrecodeSize is read using nameof(FixupStubPrecodeSize) rather than nameof(StubPrecodeSize), so it will use the wrong field offset/value (and may throw if the fixup field isn't present). Also, the else branch for StubPrecodeSize currently nulls out FixupBytes/FixupIgnoredBytes instead of StubBytes/StubIgnoredBytes, which can leave the stub byte arrays in an incorrect state.
| { | ||
| GCCoverageInfo = target.ReadPointer(address + (ulong)type.Fields[nameof(GCCoverageInfo)].Offset); | ||
| GCCoverageInfo = target.ReadPointerField(address, type, nameof(GCCoverageInfo)); | ||
| } | ||
| OptimizationTier = target.Read<uint>(address + (ulong)type.Fields[nameof(OptimizationTier)].Offset); | ||
| OptimizationTier = target.ReadField<uint>(address, type, nameof(OptimizationTier)); |
There was a problem hiding this comment.
OptimizationTier is still read via target.Read<uint>(address + ...) instead of the new ReadField<uint>(...) helper. Using ReadField here would keep this type’s field reads consistent and allow the descriptor type validation to apply to OptimizationTier as well.
🤖 Copilot Code Review — PR #126713Note This review was generated by Copilot. Holistic AssessmentMotivation: Well-justified. Introduces typed field extension methods that reduce boilerplate across ~110 Data classes and add debug-time type validation via Approach: Good. Extension methods on Summary: Detailed Findings✅ Type Bug Fixes — Correct based on native type declarationsAll 6 type corrections mentioned in the commit message are verified against native C++ types:
The ✅ TargetFieldExtensions Design — Well structuredThe API covers the key field read patterns (primitive, pointer, NUInt, CodePointer, inline data, data pointer) with optional/required variants. ✅ datadescriptor.inc Changes — CorrectThe 3 changes to the native data descriptor match the actual C++ field types.
|
Summary
Add typed field extension methods for the cDAC managed reader and convert all
IData<T>classes to use them. This builds on the native data descriptor type system (#126163) to add managed-side type validation.Changes
TargetFieldExtensions.cs— New extension methods onTarget:ReadField<T>— reads a primitive field withDebug.Asserttype validationReadPointerField/ReadPointerFieldOrNull— reads pointer fields (required/optional)ReadNUIntField— reads native unsigned integer fieldsReadCodePointerField— reads code pointer fieldsReadDataField<T>/ReadDataFieldPointer<T>— reads inline/pointer-to Data struct fieldsReadFieldOrDefault<T>— reads optional primitive fields with default valueWhen the data descriptor includes type information (debug/checked builds), these methods assert that the declared field type is compatible with the C# read type.
All ~130
IData<T>classes converted to use the new extension methods, replacing directtarget.Read<T>(address + (ulong)type.Fields[...].Offset)calls.Bugs found and fixed
The type system caught several pre-existing issues:
uint32, native type isTADDR(pointer)Read<ulong>for a pointer field (broken on 32-bit)TypeHandle(nuint) asuintulong, native isLONGLONG(signed)T_POINTER, actuallyCodePointerT_NUINT, managed reads as pointerNote
This content was generated with the assistance of GitHub Copilot.