[cDAC] Implement IsValidObject for cDAC - #128457

Merged
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject
May 22, 2026
Merged

[cDAC] Implement IsValidObject for cDAC#128457
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject

Conversation

@barosiak

@barosiakbarosiak commented May 21, 2026

Copy link
Copy Markdown
Member

Summary

Implement IsValidObject in the cDAC.

Changes

  • Implemented DacDbiImpl.IsValidObject
  • Added ContinuationSingletonEEClass global pointer to datadescriptor.inc
  • Added GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1
  • Added parameterized tests for the new APIs

@barosiakbarosiak self-assigned this May 21, 2026
CopilotAI review requested due to automatic review settings May 21, 2026 18:23
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the cDAC runtime type system contract (and its tests/mocks) to support additional MethodTable/EEClass queries, then uses those APIs to implement DacDbiImpl.IsValidObject. It also adds a new CoreCLR cDAC global (ContinuationSingletonEEClass) to enable continuation subtype identification.

Changes:

  • Adds a new CoreCLR cDAC global pointer (ContinuationSingletonEEClass) and wires it into the managed reader contracts/tests.
  • Extends IRuntimeTypeSystem / RuntimeTypeSystem_1 with APIs to query EEClass pointers, canonical MethodTables, and continuation-without-metadata detection.
  • Implements Microsoft.Diagnostics.DataContractReader.Legacy.DacDbiImpl.IsValidObject using the cDAC contracts and adds new MethodTable tests.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.RuntimeTypeSystem.csAdds mock global storage + setter for the continuation singleton EEClass pointer.
src/native/managed/cdac/tests/MethodTableTests.csAdds globals wiring and new theory tests for IsContinuationWithoutMetadata and IsCanonicalMethodTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csImplements IsValidObject using cDAC contracts (replacing legacy fallback-only behavior).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csReads new global and implements new RTS APIs (GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.csAdds the new global name constant.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.csAdds new public contract members used by IsValidObject.
src/coreclr/vm/datadescriptor/datadescriptor.incExposes g_singletonContinuationEEClass via a new cDAC global pointer.
Comments suppressed due to low confidence (1)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:548

  • GetClassPointer is now a public IRuntimeTypeSystem API, but it doesn't guard against non-MethodTable TypeHandles (it indexes _methodTables[typeHandle.Address] unconditionally). Other public APIs in this type return TargetPointer.Null / 0 for non-MethodTable handles. Please add a typeHandle.IsMethodTable() check (and return TargetPointer.Null or throw ArgumentException consistently) to avoid KeyNotFound/undefined behavior when callers pass a TypeDesc handle.
 public TargetPointer GetClassPointer(TypeHandle typeHandle)
{
MethodTable methodTable = _methodTables[typeHandle.Address];
switch (MethodTableFlags_1.GetEEClassOrCanonMTBits(methodTable.EEClassOrCanonMT))
{

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak requested a review from rcj1May 21, 2026 23:54
@rcj1

rcj1 commented May 22, 2026

Copy link
Copy Markdown
Contributor

Might want to have a dump test for this, see

TargetPointerobjectAddress=Target.ReadPointer(handleData.Handle);

(test that all objects read from these handles are valid and that an object at some non-object address is not)

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
CopilotAI review requested due to automatic review settings May 22, 2026 17:52

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
CopilotAI review requested due to automatic review settings May 22, 2026 18:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 4 comments.

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak enabled auto-merge (squash) May 22, 2026 20:18
@barosiak
barosiak merged commit 070886d into dotnet:mainMay 22, 2026
122 of 127 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

Not sure why the Build Analysis was green but the relevant test leg "runtime (Build linux-x64 checked CLR_Tools_Tests)" that runs the Microsoft.Diagnostics.DataContractReader.Tests had failures in both IsContinuationWithoutMetadata_ReturnsFalseWhenSingletonEEClassGlobalIsNull and ValidateContinuationMethodTablePointer.

This is now breaking CI in e.g. #127768.

@jjonescz

jjonescz commented May 25, 2026

Copy link
Copy Markdown
Member

Haven't seen that before but it looks like it's automatically trying to detect non-deterministic test failures? https://github.com/dotnet/runtime/runs/77478246586

At least I think it won't break merging of other PRs since Build Analysis will probably ignore those again...

image

@rcj1

rcj1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

@jjonescz@MichalStrehovsky should be fixed in #128526

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@barosiak@rcj1@MichalStrehovsky@jjonescz@noahfalk@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[cDAC] Implement IsValidObject for cDAC - #128457

Merged
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject
May 22, 2026
Merged

[cDAC] Implement IsValidObject for cDAC#128457
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject

Conversation

@barosiak

@barosiakbarosiak commented May 21, 2026

Copy link
Copy Markdown
Member

Summary

Implement IsValidObject in the cDAC.

Changes

  • Implemented DacDbiImpl.IsValidObject
  • Added ContinuationSingletonEEClass global pointer to datadescriptor.inc
  • Added GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1
  • Added parameterized tests for the new APIs

@barosiakbarosiak self-assigned this May 21, 2026
CopilotAI review requested due to automatic review settings May 21, 2026 18:23
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the cDAC runtime type system contract (and its tests/mocks) to support additional MethodTable/EEClass queries, then uses those APIs to implement DacDbiImpl.IsValidObject. It also adds a new CoreCLR cDAC global (ContinuationSingletonEEClass) to enable continuation subtype identification.

Changes:

  • Adds a new CoreCLR cDAC global pointer (ContinuationSingletonEEClass) and wires it into the managed reader contracts/tests.
  • Extends IRuntimeTypeSystem / RuntimeTypeSystem_1 with APIs to query EEClass pointers, canonical MethodTables, and continuation-without-metadata detection.
  • Implements Microsoft.Diagnostics.DataContractReader.Legacy.DacDbiImpl.IsValidObject using the cDAC contracts and adds new MethodTable tests.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.RuntimeTypeSystem.csAdds mock global storage + setter for the continuation singleton EEClass pointer.
src/native/managed/cdac/tests/MethodTableTests.csAdds globals wiring and new theory tests for IsContinuationWithoutMetadata and IsCanonicalMethodTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csImplements IsValidObject using cDAC contracts (replacing legacy fallback-only behavior).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csReads new global and implements new RTS APIs (GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.csAdds the new global name constant.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.csAdds new public contract members used by IsValidObject.
src/coreclr/vm/datadescriptor/datadescriptor.incExposes g_singletonContinuationEEClass via a new cDAC global pointer.
Comments suppressed due to low confidence (1)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:548

  • GetClassPointer is now a public IRuntimeTypeSystem API, but it doesn't guard against non-MethodTable TypeHandles (it indexes _methodTables[typeHandle.Address] unconditionally). Other public APIs in this type return TargetPointer.Null / 0 for non-MethodTable handles. Please add a typeHandle.IsMethodTable() check (and return TargetPointer.Null or throw ArgumentException consistently) to avoid KeyNotFound/undefined behavior when callers pass a TypeDesc handle.
 public TargetPointer GetClassPointer(TypeHandle typeHandle)
{
MethodTable methodTable = _methodTables[typeHandle.Address];
switch (MethodTableFlags_1.GetEEClassOrCanonMTBits(methodTable.EEClassOrCanonMT))
{

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak requested a review from rcj1May 21, 2026 23:54
@rcj1

rcj1 commented May 22, 2026

Copy link
Copy Markdown
Contributor

Might want to have a dump test for this, see

TargetPointerobjectAddress=Target.ReadPointer(handleData.Handle);

(test that all objects read from these handles are valid and that an object at some non-object address is not)

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
CopilotAI review requested due to automatic review settings May 22, 2026 17:52

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
CopilotAI review requested due to automatic review settings May 22, 2026 18:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 4 comments.

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak enabled auto-merge (squash) May 22, 2026 20:18
@barosiak
barosiak merged commit 070886d into dotnet:mainMay 22, 2026
122 of 127 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

Not sure why the Build Analysis was green but the relevant test leg "runtime (Build linux-x64 checked CLR_Tools_Tests)" that runs the Microsoft.Diagnostics.DataContractReader.Tests had failures in both IsContinuationWithoutMetadata_ReturnsFalseWhenSingletonEEClassGlobalIsNull and ValidateContinuationMethodTablePointer.

This is now breaking CI in e.g. #127768.

@jjonescz

jjonescz commented May 25, 2026

Copy link
Copy Markdown
Member

Haven't seen that before but it looks like it's automatically trying to detect non-deterministic test failures? https://github.com/dotnet/runtime/runs/77478246586

At least I think it won't break merging of other PRs since Build Analysis will probably ignore those again...

image

@rcj1

rcj1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

@jjonescz@MichalStrehovsky should be fixed in #128526

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@barosiak@rcj1@MichalStrehovsky@jjonescz@noahfalk@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cDAC] Implement IsValidObject for cDAC - #128457

Merged
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject
May 22, 2026
Merged

[cDAC] Implement IsValidObject for cDAC#128457
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject

Conversation

@barosiak

@barosiakbarosiak commented May 21, 2026

Copy link
Copy Markdown
Member

Summary

Implement IsValidObject in the cDAC.

Changes

  • Implemented DacDbiImpl.IsValidObject
  • Added ContinuationSingletonEEClass global pointer to datadescriptor.inc
  • Added GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1
  • Added parameterized tests for the new APIs

@barosiakbarosiak self-assigned this May 21, 2026
CopilotAI review requested due to automatic review settings May 21, 2026 18:23
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the cDAC runtime type system contract (and its tests/mocks) to support additional MethodTable/EEClass queries, then uses those APIs to implement DacDbiImpl.IsValidObject. It also adds a new CoreCLR cDAC global (ContinuationSingletonEEClass) to enable continuation subtype identification.

Changes:

  • Adds a new CoreCLR cDAC global pointer (ContinuationSingletonEEClass) and wires it into the managed reader contracts/tests.
  • Extends IRuntimeTypeSystem / RuntimeTypeSystem_1 with APIs to query EEClass pointers, canonical MethodTables, and continuation-without-metadata detection.
  • Implements Microsoft.Diagnostics.DataContractReader.Legacy.DacDbiImpl.IsValidObject using the cDAC contracts and adds new MethodTable tests.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.RuntimeTypeSystem.csAdds mock global storage + setter for the continuation singleton EEClass pointer.
src/native/managed/cdac/tests/MethodTableTests.csAdds globals wiring and new theory tests for IsContinuationWithoutMetadata and IsCanonicalMethodTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csImplements IsValidObject using cDAC contracts (replacing legacy fallback-only behavior).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csReads new global and implements new RTS APIs (GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.csAdds the new global name constant.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.csAdds new public contract members used by IsValidObject.
src/coreclr/vm/datadescriptor/datadescriptor.incExposes g_singletonContinuationEEClass via a new cDAC global pointer.
Comments suppressed due to low confidence (1)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:548

  • GetClassPointer is now a public IRuntimeTypeSystem API, but it doesn't guard against non-MethodTable TypeHandles (it indexes _methodTables[typeHandle.Address] unconditionally). Other public APIs in this type return TargetPointer.Null / 0 for non-MethodTable handles. Please add a typeHandle.IsMethodTable() check (and return TargetPointer.Null or throw ArgumentException consistently) to avoid KeyNotFound/undefined behavior when callers pass a TypeDesc handle.
 public TargetPointer GetClassPointer(TypeHandle typeHandle)
{
MethodTable methodTable = _methodTables[typeHandle.Address];
switch (MethodTableFlags_1.GetEEClassOrCanonMTBits(methodTable.EEClassOrCanonMT))
{

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak requested a review from rcj1May 21, 2026 23:54
@rcj1

rcj1 commented May 22, 2026

Copy link
Copy Markdown
Contributor

Might want to have a dump test for this, see

TargetPointerobjectAddress=Target.ReadPointer(handleData.Handle);

(test that all objects read from these handles are valid and that an object at some non-object address is not)

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
CopilotAI review requested due to automatic review settings May 22, 2026 17:52

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
CopilotAI review requested due to automatic review settings May 22, 2026 18:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 4 comments.

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak enabled auto-merge (squash) May 22, 2026 20:18
@barosiak
barosiak merged commit 070886d into dotnet:mainMay 22, 2026
122 of 127 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

Not sure why the Build Analysis was green but the relevant test leg "runtime (Build linux-x64 checked CLR_Tools_Tests)" that runs the Microsoft.Diagnostics.DataContractReader.Tests had failures in both IsContinuationWithoutMetadata_ReturnsFalseWhenSingletonEEClassGlobalIsNull and ValidateContinuationMethodTablePointer.

This is now breaking CI in e.g. #127768.

@jjonescz

jjonescz commented May 25, 2026

Copy link
Copy Markdown
Member

Haven't seen that before but it looks like it's automatically trying to detect non-deterministic test failures? https://github.com/dotnet/runtime/runs/77478246586

At least I think it won't break merging of other PRs since Build Analysis will probably ignore those again...

image

@rcj1

rcj1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

@jjonescz@MichalStrehovsky should be fixed in #128526

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@barosiak@rcj1@MichalStrehovsky@jjonescz@noahfalk@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cDAC] Implement IsValidObject for cDAC - #128457

Merged
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject
May 22, 2026
Merged

[cDAC] Implement IsValidObject for cDAC#128457
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject

Conversation

@barosiak

@barosiakbarosiak commented May 21, 2026

Copy link
Copy Markdown
Member

Summary

Implement IsValidObject in the cDAC.

Changes

  • Implemented DacDbiImpl.IsValidObject
  • Added ContinuationSingletonEEClass global pointer to datadescriptor.inc
  • Added GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1
  • Added parameterized tests for the new APIs

@barosiakbarosiak self-assigned this May 21, 2026
CopilotAI review requested due to automatic review settings May 21, 2026 18:23
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the cDAC runtime type system contract (and its tests/mocks) to support additional MethodTable/EEClass queries, then uses those APIs to implement DacDbiImpl.IsValidObject. It also adds a new CoreCLR cDAC global (ContinuationSingletonEEClass) to enable continuation subtype identification.

Changes:

  • Adds a new CoreCLR cDAC global pointer (ContinuationSingletonEEClass) and wires it into the managed reader contracts/tests.
  • Extends IRuntimeTypeSystem / RuntimeTypeSystem_1 with APIs to query EEClass pointers, canonical MethodTables, and continuation-without-metadata detection.
  • Implements Microsoft.Diagnostics.DataContractReader.Legacy.DacDbiImpl.IsValidObject using the cDAC contracts and adds new MethodTable tests.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.RuntimeTypeSystem.csAdds mock global storage + setter for the continuation singleton EEClass pointer.
src/native/managed/cdac/tests/MethodTableTests.csAdds globals wiring and new theory tests for IsContinuationWithoutMetadata and IsCanonicalMethodTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csImplements IsValidObject using cDAC contracts (replacing legacy fallback-only behavior).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csReads new global and implements new RTS APIs (GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.csAdds the new global name constant.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.csAdds new public contract members used by IsValidObject.
src/coreclr/vm/datadescriptor/datadescriptor.incExposes g_singletonContinuationEEClass via a new cDAC global pointer.
Comments suppressed due to low confidence (1)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:548

  • GetClassPointer is now a public IRuntimeTypeSystem API, but it doesn't guard against non-MethodTable TypeHandles (it indexes _methodTables[typeHandle.Address] unconditionally). Other public APIs in this type return TargetPointer.Null / 0 for non-MethodTable handles. Please add a typeHandle.IsMethodTable() check (and return TargetPointer.Null or throw ArgumentException consistently) to avoid KeyNotFound/undefined behavior when callers pass a TypeDesc handle.
 public TargetPointer GetClassPointer(TypeHandle typeHandle)
{
MethodTable methodTable = _methodTables[typeHandle.Address];
switch (MethodTableFlags_1.GetEEClassOrCanonMTBits(methodTable.EEClassOrCanonMT))
{

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak requested a review from rcj1May 21, 2026 23:54
@rcj1

rcj1 commented May 22, 2026

Copy link
Copy Markdown
Contributor

Might want to have a dump test for this, see

TargetPointerobjectAddress=Target.ReadPointer(handleData.Handle);

(test that all objects read from these handles are valid and that an object at some non-object address is not)

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
CopilotAI review requested due to automatic review settings May 22, 2026 17:52

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
CopilotAI review requested due to automatic review settings May 22, 2026 18:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 4 comments.

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak enabled auto-merge (squash) May 22, 2026 20:18
@barosiak
barosiak merged commit 070886d into dotnet:mainMay 22, 2026
122 of 127 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

Not sure why the Build Analysis was green but the relevant test leg "runtime (Build linux-x64 checked CLR_Tools_Tests)" that runs the Microsoft.Diagnostics.DataContractReader.Tests had failures in both IsContinuationWithoutMetadata_ReturnsFalseWhenSingletonEEClassGlobalIsNull and ValidateContinuationMethodTablePointer.

This is now breaking CI in e.g. #127768.

@jjonescz

jjonescz commented May 25, 2026

Copy link
Copy Markdown
Member

Haven't seen that before but it looks like it's automatically trying to detect non-deterministic test failures? https://github.com/dotnet/runtime/runs/77478246586

At least I think it won't break merging of other PRs since Build Analysis will probably ignore those again...

image

@rcj1

rcj1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

@jjonescz@MichalStrehovsky should be fixed in #128526

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@barosiak@rcj1@MichalStrehovsky@jjonescz@noahfalk@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[cDAC] Implement IsValidObject for cDAC - #128457

Merged
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject
May 22, 2026
Merged

[cDAC] Implement IsValidObject for cDAC#128457
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject

Conversation

@barosiak

@barosiakbarosiak commented May 21, 2026

Copy link
Copy Markdown
Member

Summary

Implement IsValidObject in the cDAC.

Changes

  • Implemented DacDbiImpl.IsValidObject
  • Added ContinuationSingletonEEClass global pointer to datadescriptor.inc
  • Added GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1
  • Added parameterized tests for the new APIs

@barosiakbarosiak self-assigned this May 21, 2026
CopilotAI review requested due to automatic review settings May 21, 2026 18:23
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the cDAC runtime type system contract (and its tests/mocks) to support additional MethodTable/EEClass queries, then uses those APIs to implement DacDbiImpl.IsValidObject. It also adds a new CoreCLR cDAC global (ContinuationSingletonEEClass) to enable continuation subtype identification.

Changes:

  • Adds a new CoreCLR cDAC global pointer (ContinuationSingletonEEClass) and wires it into the managed reader contracts/tests.
  • Extends IRuntimeTypeSystem / RuntimeTypeSystem_1 with APIs to query EEClass pointers, canonical MethodTables, and continuation-without-metadata detection.
  • Implements Microsoft.Diagnostics.DataContractReader.Legacy.DacDbiImpl.IsValidObject using the cDAC contracts and adds new MethodTable tests.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.RuntimeTypeSystem.csAdds mock global storage + setter for the continuation singleton EEClass pointer.
src/native/managed/cdac/tests/MethodTableTests.csAdds globals wiring and new theory tests for IsContinuationWithoutMetadata and IsCanonicalMethodTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csImplements IsValidObject using cDAC contracts (replacing legacy fallback-only behavior).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csReads new global and implements new RTS APIs (GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.csAdds the new global name constant.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.csAdds new public contract members used by IsValidObject.
src/coreclr/vm/datadescriptor/datadescriptor.incExposes g_singletonContinuationEEClass via a new cDAC global pointer.
Comments suppressed due to low confidence (1)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:548

  • GetClassPointer is now a public IRuntimeTypeSystem API, but it doesn't guard against non-MethodTable TypeHandles (it indexes _methodTables[typeHandle.Address] unconditionally). Other public APIs in this type return TargetPointer.Null / 0 for non-MethodTable handles. Please add a typeHandle.IsMethodTable() check (and return TargetPointer.Null or throw ArgumentException consistently) to avoid KeyNotFound/undefined behavior when callers pass a TypeDesc handle.
 public TargetPointer GetClassPointer(TypeHandle typeHandle)
{
MethodTable methodTable = _methodTables[typeHandle.Address];
switch (MethodTableFlags_1.GetEEClassOrCanonMTBits(methodTable.EEClassOrCanonMT))
{

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak requested a review from rcj1May 21, 2026 23:54
@rcj1

rcj1 commented May 22, 2026

Copy link
Copy Markdown
Contributor

Might want to have a dump test for this, see

TargetPointerobjectAddress=Target.ReadPointer(handleData.Handle);

(test that all objects read from these handles are valid and that an object at some non-object address is not)

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
CopilotAI review requested due to automatic review settings May 22, 2026 17:52

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
CopilotAI review requested due to automatic review settings May 22, 2026 18:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 4 comments.

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak enabled auto-merge (squash) May 22, 2026 20:18
@barosiak
barosiak merged commit 070886d into dotnet:mainMay 22, 2026
122 of 127 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

Not sure why the Build Analysis was green but the relevant test leg "runtime (Build linux-x64 checked CLR_Tools_Tests)" that runs the Microsoft.Diagnostics.DataContractReader.Tests had failures in both IsContinuationWithoutMetadata_ReturnsFalseWhenSingletonEEClassGlobalIsNull and ValidateContinuationMethodTablePointer.

This is now breaking CI in e.g. #127768.

@jjonescz

jjonescz commented May 25, 2026

Copy link
Copy Markdown
Member

Haven't seen that before but it looks like it's automatically trying to detect non-deterministic test failures? https://github.com/dotnet/runtime/runs/77478246586

At least I think it won't break merging of other PRs since Build Analysis will probably ignore those again...

image

@rcj1

rcj1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

@jjonescz@MichalStrehovsky should be fixed in #128526

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@barosiak@rcj1@MichalStrehovsky@jjonescz@noahfalk@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cDAC] Implement IsValidObject for cDAC - #128457

Merged
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject
May 22, 2026
Merged

[cDAC] Implement IsValidObject for cDAC#128457
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject

Conversation

@barosiak

@barosiakbarosiak commented May 21, 2026

Copy link
Copy Markdown
Member

Summary

Implement IsValidObject in the cDAC.

Changes

  • Implemented DacDbiImpl.IsValidObject
  • Added ContinuationSingletonEEClass global pointer to datadescriptor.inc
  • Added GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1
  • Added parameterized tests for the new APIs

@barosiakbarosiak self-assigned this May 21, 2026
CopilotAI review requested due to automatic review settings May 21, 2026 18:23
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the cDAC runtime type system contract (and its tests/mocks) to support additional MethodTable/EEClass queries, then uses those APIs to implement DacDbiImpl.IsValidObject. It also adds a new CoreCLR cDAC global (ContinuationSingletonEEClass) to enable continuation subtype identification.

Changes:

  • Adds a new CoreCLR cDAC global pointer (ContinuationSingletonEEClass) and wires it into the managed reader contracts/tests.
  • Extends IRuntimeTypeSystem / RuntimeTypeSystem_1 with APIs to query EEClass pointers, canonical MethodTables, and continuation-without-metadata detection.
  • Implements Microsoft.Diagnostics.DataContractReader.Legacy.DacDbiImpl.IsValidObject using the cDAC contracts and adds new MethodTable tests.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.RuntimeTypeSystem.csAdds mock global storage + setter for the continuation singleton EEClass pointer.
src/native/managed/cdac/tests/MethodTableTests.csAdds globals wiring and new theory tests for IsContinuationWithoutMetadata and IsCanonicalMethodTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csImplements IsValidObject using cDAC contracts (replacing legacy fallback-only behavior).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csReads new global and implements new RTS APIs (GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.csAdds the new global name constant.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.csAdds new public contract members used by IsValidObject.
src/coreclr/vm/datadescriptor/datadescriptor.incExposes g_singletonContinuationEEClass via a new cDAC global pointer.
Comments suppressed due to low confidence (1)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:548

  • GetClassPointer is now a public IRuntimeTypeSystem API, but it doesn't guard against non-MethodTable TypeHandles (it indexes _methodTables[typeHandle.Address] unconditionally). Other public APIs in this type return TargetPointer.Null / 0 for non-MethodTable handles. Please add a typeHandle.IsMethodTable() check (and return TargetPointer.Null or throw ArgumentException consistently) to avoid KeyNotFound/undefined behavior when callers pass a TypeDesc handle.
 public TargetPointer GetClassPointer(TypeHandle typeHandle)
{
MethodTable methodTable = _methodTables[typeHandle.Address];
switch (MethodTableFlags_1.GetEEClassOrCanonMTBits(methodTable.EEClassOrCanonMT))
{

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak requested a review from rcj1May 21, 2026 23:54
@rcj1

rcj1 commented May 22, 2026

Copy link
Copy Markdown
Contributor

Might want to have a dump test for this, see

TargetPointerobjectAddress=Target.ReadPointer(handleData.Handle);

(test that all objects read from these handles are valid and that an object at some non-object address is not)

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
CopilotAI review requested due to automatic review settings May 22, 2026 17:52

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
CopilotAI review requested due to automatic review settings May 22, 2026 18:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 4 comments.

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak enabled auto-merge (squash) May 22, 2026 20:18
@barosiak
barosiak merged commit 070886d into dotnet:mainMay 22, 2026
122 of 127 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

Not sure why the Build Analysis was green but the relevant test leg "runtime (Build linux-x64 checked CLR_Tools_Tests)" that runs the Microsoft.Diagnostics.DataContractReader.Tests had failures in both IsContinuationWithoutMetadata_ReturnsFalseWhenSingletonEEClassGlobalIsNull and ValidateContinuationMethodTablePointer.

This is now breaking CI in e.g. #127768.

@jjonescz

jjonescz commented May 25, 2026

Copy link
Copy Markdown
Member

Haven't seen that before but it looks like it's automatically trying to detect non-deterministic test failures? https://github.com/dotnet/runtime/runs/77478246586

At least I think it won't break merging of other PRs since Build Analysis will probably ignore those again...

image

@rcj1

rcj1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

@jjonescz@MichalStrehovsky should be fixed in #128526

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@barosiak@rcj1@MichalStrehovsky@jjonescz@noahfalk@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cDAC] Implement IsValidObject for cDAC - #128457

Merged
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject
May 22, 2026
Merged

[cDAC] Implement IsValidObject for cDAC#128457
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject

Conversation

@barosiak

@barosiakbarosiak commented May 21, 2026

Copy link
Copy Markdown
Member

Summary

Implement IsValidObject in the cDAC.

Changes

  • Implemented DacDbiImpl.IsValidObject
  • Added ContinuationSingletonEEClass global pointer to datadescriptor.inc
  • Added GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1
  • Added parameterized tests for the new APIs

@barosiakbarosiak self-assigned this May 21, 2026
CopilotAI review requested due to automatic review settings May 21, 2026 18:23
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the cDAC runtime type system contract (and its tests/mocks) to support additional MethodTable/EEClass queries, then uses those APIs to implement DacDbiImpl.IsValidObject. It also adds a new CoreCLR cDAC global (ContinuationSingletonEEClass) to enable continuation subtype identification.

Changes:

  • Adds a new CoreCLR cDAC global pointer (ContinuationSingletonEEClass) and wires it into the managed reader contracts/tests.
  • Extends IRuntimeTypeSystem / RuntimeTypeSystem_1 with APIs to query EEClass pointers, canonical MethodTables, and continuation-without-metadata detection.
  • Implements Microsoft.Diagnostics.DataContractReader.Legacy.DacDbiImpl.IsValidObject using the cDAC contracts and adds new MethodTable tests.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.RuntimeTypeSystem.csAdds mock global storage + setter for the continuation singleton EEClass pointer.
src/native/managed/cdac/tests/MethodTableTests.csAdds globals wiring and new theory tests for IsContinuationWithoutMetadata and IsCanonicalMethodTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csImplements IsValidObject using cDAC contracts (replacing legacy fallback-only behavior).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csReads new global and implements new RTS APIs (GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.csAdds the new global name constant.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.csAdds new public contract members used by IsValidObject.
src/coreclr/vm/datadescriptor/datadescriptor.incExposes g_singletonContinuationEEClass via a new cDAC global pointer.
Comments suppressed due to low confidence (1)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:548

  • GetClassPointer is now a public IRuntimeTypeSystem API, but it doesn't guard against non-MethodTable TypeHandles (it indexes _methodTables[typeHandle.Address] unconditionally). Other public APIs in this type return TargetPointer.Null / 0 for non-MethodTable handles. Please add a typeHandle.IsMethodTable() check (and return TargetPointer.Null or throw ArgumentException consistently) to avoid KeyNotFound/undefined behavior when callers pass a TypeDesc handle.
 public TargetPointer GetClassPointer(TypeHandle typeHandle)
{
MethodTable methodTable = _methodTables[typeHandle.Address];
switch (MethodTableFlags_1.GetEEClassOrCanonMTBits(methodTable.EEClassOrCanonMT))
{

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak requested a review from rcj1May 21, 2026 23:54
@rcj1

rcj1 commented May 22, 2026

Copy link
Copy Markdown
Contributor

Might want to have a dump test for this, see

TargetPointerobjectAddress=Target.ReadPointer(handleData.Handle);

(test that all objects read from these handles are valid and that an object at some non-object address is not)

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
CopilotAI review requested due to automatic review settings May 22, 2026 17:52

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
CopilotAI review requested due to automatic review settings May 22, 2026 18:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 4 comments.

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak enabled auto-merge (squash) May 22, 2026 20:18
@barosiak
barosiak merged commit 070886d into dotnet:mainMay 22, 2026
122 of 127 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

Not sure why the Build Analysis was green but the relevant test leg "runtime (Build linux-x64 checked CLR_Tools_Tests)" that runs the Microsoft.Diagnostics.DataContractReader.Tests had failures in both IsContinuationWithoutMetadata_ReturnsFalseWhenSingletonEEClassGlobalIsNull and ValidateContinuationMethodTablePointer.

This is now breaking CI in e.g. #127768.

@jjonescz

jjonescz commented May 25, 2026

Copy link
Copy Markdown
Member

Haven't seen that before but it looks like it's automatically trying to detect non-deterministic test failures? https://github.com/dotnet/runtime/runs/77478246586

At least I think it won't break merging of other PRs since Build Analysis will probably ignore those again...

image

@rcj1

rcj1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

@jjonescz@MichalStrehovsky should be fixed in #128526

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@barosiak@rcj1@MichalStrehovsky@jjonescz@noahfalk@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[cDAC] Implement IsValidObject for cDAC - #128457

Merged
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject
May 22, 2026
Merged

[cDAC] Implement IsValidObject for cDAC#128457
barosiak merged 6 commits into
dotnet:mainfrom
barosiak:barosiak/IsValidObject

Conversation

@barosiak

@barosiakbarosiak commented May 21, 2026

Copy link
Copy Markdown
Member

Summary

Implement IsValidObject in the cDAC.

Changes

  • Implemented DacDbiImpl.IsValidObject
  • Added ContinuationSingletonEEClass global pointer to datadescriptor.inc
  • Added GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1APIs to the IRuntimeTypeSystem contract and RuntimeTypeSystem_1
  • Added parameterized tests for the new APIs

@barosiakbarosiak self-assigned this May 21, 2026
CopilotAI review requested due to automatic review settings May 21, 2026 18:23
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the cDAC runtime type system contract (and its tests/mocks) to support additional MethodTable/EEClass queries, then uses those APIs to implement DacDbiImpl.IsValidObject. It also adds a new CoreCLR cDAC global (ContinuationSingletonEEClass) to enable continuation subtype identification.

Changes:

  • Adds a new CoreCLR cDAC global pointer (ContinuationSingletonEEClass) and wires it into the managed reader contracts/tests.
  • Extends IRuntimeTypeSystem / RuntimeTypeSystem_1 with APIs to query EEClass pointers, canonical MethodTables, and continuation-without-metadata detection.
  • Implements Microsoft.Diagnostics.DataContractReader.Legacy.DacDbiImpl.IsValidObject using the cDAC contracts and adds new MethodTable tests.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.RuntimeTypeSystem.csAdds mock global storage + setter for the continuation singleton EEClass pointer.
src/native/managed/cdac/tests/MethodTableTests.csAdds globals wiring and new theory tests for IsContinuationWithoutMetadata and IsCanonicalMethodTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csImplements IsValidObject using cDAC contracts (replacing legacy fallback-only behavior).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csReads new global and implements new RTS APIs (GetClassPointer, IsCanonicalMethodTable, IsContinuationWithoutMetadata).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.csAdds the new global name constant.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.csAdds new public contract members used by IsValidObject.
src/coreclr/vm/datadescriptor/datadescriptor.incExposes g_singletonContinuationEEClass via a new cDAC global pointer.
Comments suppressed due to low confidence (1)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs:548

  • GetClassPointer is now a public IRuntimeTypeSystem API, but it doesn't guard against non-MethodTable TypeHandles (it indexes _methodTables[typeHandle.Address] unconditionally). Other public APIs in this type return TargetPointer.Null / 0 for non-MethodTable handles. Please add a typeHandle.IsMethodTable() check (and return TargetPointer.Null or throw ArgumentException consistently) to avoid KeyNotFound/undefined behavior when callers pass a TypeDesc handle.
 public TargetPointer GetClassPointer(TypeHandle typeHandle)
{
MethodTable methodTable = _methodTables[typeHandle.Address];
switch (MethodTableFlags_1.GetEEClassOrCanonMTBits(methodTable.EEClassOrCanonMT))
{

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak requested a review from rcj1May 21, 2026 23:54
@rcj1

rcj1 commented May 22, 2026

Copy link
Copy Markdown
Contributor

Might want to have a dump test for this, see

TargetPointerobjectAddress=Target.ReadPointer(handleData.Handle);

(test that all objects read from these handles are valid and that an object at some non-object address is not)

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
CopilotAI review requested due to automatic review settings May 22, 2026 17:52

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md
Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
CopilotAI review requested due to automatic review settings May 22, 2026 18:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 4 comments.

Comment threaddocs/design/datacontracts/RuntimeTypeSystem.md Outdated
Comment threadsrc/native/managed/cdac/tests/MethodTableTests.cs
@barosiak
barosiak enabled auto-merge (squash) May 22, 2026 20:18
@barosiak
barosiak merged commit 070886d into dotnet:mainMay 22, 2026
122 of 127 checks passed
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone May 23, 2026
@MichalStrehovsky

Copy link
Copy Markdown
Member

Not sure why the Build Analysis was green but the relevant test leg "runtime (Build linux-x64 checked CLR_Tools_Tests)" that runs the Microsoft.Diagnostics.DataContractReader.Tests had failures in both IsContinuationWithoutMetadata_ReturnsFalseWhenSingletonEEClassGlobalIsNull and ValidateContinuationMethodTablePointer.

This is now breaking CI in e.g. #127768.

@jjonescz

jjonescz commented May 25, 2026

Copy link
Copy Markdown
Member

Haven't seen that before but it looks like it's automatically trying to detect non-deterministic test failures? https://github.com/dotnet/runtime/runs/77478246586

At least I think it won't break merging of other PRs since Build Analysis will probably ignore those again...

image

@rcj1

rcj1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

@jjonescz@MichalStrehovsky should be fixed in #128526

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 25, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@barosiak@rcj1@MichalStrehovsky@jjonescz@noahfalk@max-charlamb