Uh oh!
There was an error while loading. Please reload this page.
[cDAC] Ensure mt created - #129114
Conversation
Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag |
There was a problem hiding this comment.
Pull request overview
This PR updates the cDAC RuntimeTypeSystem_1 contract implementation to ensure a MethodTable is validated/created/cached before dereferencing _methodTables[...] in code paths that start from a MethodDesc (rather than from an already-constructed TypeHandle). This reduces the chance of runtime failures (e.g., KeyNotFoundException) when querying generic context/metadata-related properties for a method.
Changes:
- Route
MethodDesc-based MethodTable lookups throughGetOrCreateMethodTable(methodDesc)instead of directly indexing_methodTables[methodDesc.MethodTable]. - Apply this in generic context location evaluation and in the abstract-method metadata check.
Show a summary per file
| File | Description |
|---|---|
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs | Ensures MethodTable is created/cached before dereferencing _methodTables when starting from MethodDesc-driven paths. |
Copilot's findings
Comments suppressed due to low confidence (1)
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:1353
- This change fixes a previously possible
KeyNotFoundExceptionwhenGetGenericContextLoc(viaRequiresInstArgMethodTable/IsSharedByGenericInstantiations/IsAbstract) is invoked for aMethodDescHandlewhose owning MethodTable hasn't been cached yet (e.g., afterGetMethodDescHandlewithout any priorGetTypeHandle). There are existing cDAC unit tests forIRuntimeTypeSystem/MethodDescbehavior, but none appear to cover this regression. Please add a targeted unit test that callsGetMethodDescHandle(...)and thenGetGenericContextLoc(...)without pre-caching the MethodTable, and asserts it does not throw and returns the expectedGenericContextLocfor the constructed mock MethodTable/method.
MethodTable mt = GetOrCreateMethodTable(methodDesc);
if (mt.Flags.IsValueType)
return true;
if (mt.Flags.IsInterface && !IsAbstract(methodDesc))
return true;
- Files reviewed: 1/1 changed files
- Comments generated: 0
Before checking the dict of MTs when not coming directly from a constructed TypeHandle, ensure that the MethodTable is created.