Skip to content

Resolve generic virtual methods in managed type system - #80035

Merged
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets
Jan 2, 2023
Merged

Resolve generic virtual methods in managed type system#80035
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets

Conversation

@MichalStrehovsky

@MichalStrehovskyMichalStrehovsky commented Dec 29, 2022

Copy link
Copy Markdown
Member

Generic virtual method resolution currently happens on top of RuntimeTypeHandles (i.e. the runtime type system). This works as long as we only need to do generic virtual method resolution on top of types that exist in the runtime.

In order to lay foundation for fixing #77070, we need to be able to resolve not just with types that have a type handle, but also for types that we're in the process of building (e.g. due to MakeGeneric, or due to another generic virtual method dispatch).

This pull request rewrites generic virtual method dispatch to happen on top of the managed type system, instead of the runtime type system. It's a bit more than just a mechanical replacement because the existing algorithm was set up in a confusing way, with ref parameters that were changing what we were resolving and an odd slotChanged logic that I don't fully understand. I replaced the slotChanged with the straightforward thing (if we resolve interface method to a virtual method on a type, find the implementation of the virtual method on the current type). Tests seem to be passing. Also instead of a bunch of ref parameters we now just pass a MethodDesc.

This also includes a compiler change, because in order for the managed type system's casting logic to work, we need to be able to find out the variance of parameters on generic definitions. The compiler change is about generating this info.

Cc @dotnet/ilc-contrib

@MichalStrehovskyMichalStrehovsky added the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 29, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:MichalStrehovsky
Assignees:-
Labels:

NO-REVIEW, area-NativeAOT-coreclr

Milestone:-

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovskyMichalStrehovsky changed the title WIP: Resolve generic virtual methods in type systemResolve generic virtual methods in type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky changed the title Resolve generic virtual methods in type systemResolve generic virtual methods in managed type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky removed the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 30, 2022
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovsky
MichalStrehovsky merged commit b81b822 into dotnet:mainJan 2, 2023
@MichalStrehovsky
MichalStrehovsky deleted the gvmresolvets branch January 2, 2023 07:48
@ghostghost locked as resolved and limited conversation to collaborators Feb 1, 2023
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.

2 participants

@MichalStrehovsky@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Resolve generic virtual methods in managed type system by MichalStrehovsky · Pull Request #80035 · dotnet/runtime · GitHub
Skip to content

Resolve generic virtual methods in managed type system - #80035

Merged
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets
Jan 2, 2023
Merged

Resolve generic virtual methods in managed type system#80035
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets

Conversation

@MichalStrehovsky

@MichalStrehovskyMichalStrehovsky commented Dec 29, 2022

Copy link
Copy Markdown
Member

Generic virtual method resolution currently happens on top of RuntimeTypeHandles (i.e. the runtime type system). This works as long as we only need to do generic virtual method resolution on top of types that exist in the runtime.

In order to lay foundation for fixing #77070, we need to be able to resolve not just with types that have a type handle, but also for types that we're in the process of building (e.g. due to MakeGeneric, or due to another generic virtual method dispatch).

This pull request rewrites generic virtual method dispatch to happen on top of the managed type system, instead of the runtime type system. It's a bit more than just a mechanical replacement because the existing algorithm was set up in a confusing way, with ref parameters that were changing what we were resolving and an odd slotChanged logic that I don't fully understand. I replaced the slotChanged with the straightforward thing (if we resolve interface method to a virtual method on a type, find the implementation of the virtual method on the current type). Tests seem to be passing. Also instead of a bunch of ref parameters we now just pass a MethodDesc.

This also includes a compiler change, because in order for the managed type system's casting logic to work, we need to be able to find out the variance of parameters on generic definitions. The compiler change is about generating this info.

Cc @dotnet/ilc-contrib

@MichalStrehovskyMichalStrehovsky added the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 29, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:MichalStrehovsky
Assignees:-
Labels:

NO-REVIEW, area-NativeAOT-coreclr

Milestone:-

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovskyMichalStrehovsky changed the title WIP: Resolve generic virtual methods in type systemResolve generic virtual methods in type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky changed the title Resolve generic virtual methods in type systemResolve generic virtual methods in managed type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky removed the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 30, 2022
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovsky
MichalStrehovsky merged commit b81b822 into dotnet:mainJan 2, 2023
@MichalStrehovsky
MichalStrehovsky deleted the gvmresolvets branch January 2, 2023 07:48
@ghostghost locked as resolved and limited conversation to collaborators Feb 1, 2023
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.

2 participants

@MichalStrehovsky@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Resolve generic virtual methods in managed type system by MichalStrehovsky · Pull Request #80035 · dotnet/runtime · GitHub
Skip to content

Resolve generic virtual methods in managed type system - #80035

Merged
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets
Jan 2, 2023
Merged

Resolve generic virtual methods in managed type system#80035
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets

Conversation

@MichalStrehovsky

@MichalStrehovskyMichalStrehovsky commented Dec 29, 2022

Copy link
Copy Markdown
Member

Generic virtual method resolution currently happens on top of RuntimeTypeHandles (i.e. the runtime type system). This works as long as we only need to do generic virtual method resolution on top of types that exist in the runtime.

In order to lay foundation for fixing #77070, we need to be able to resolve not just with types that have a type handle, but also for types that we're in the process of building (e.g. due to MakeGeneric, or due to another generic virtual method dispatch).

This pull request rewrites generic virtual method dispatch to happen on top of the managed type system, instead of the runtime type system. It's a bit more than just a mechanical replacement because the existing algorithm was set up in a confusing way, with ref parameters that were changing what we were resolving and an odd slotChanged logic that I don't fully understand. I replaced the slotChanged with the straightforward thing (if we resolve interface method to a virtual method on a type, find the implementation of the virtual method on the current type). Tests seem to be passing. Also instead of a bunch of ref parameters we now just pass a MethodDesc.

This also includes a compiler change, because in order for the managed type system's casting logic to work, we need to be able to find out the variance of parameters on generic definitions. The compiler change is about generating this info.

Cc @dotnet/ilc-contrib

@MichalStrehovskyMichalStrehovsky added the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 29, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:MichalStrehovsky
Assignees:-
Labels:

NO-REVIEW, area-NativeAOT-coreclr

Milestone:-

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovskyMichalStrehovsky changed the title WIP: Resolve generic virtual methods in type systemResolve generic virtual methods in type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky changed the title Resolve generic virtual methods in type systemResolve generic virtual methods in managed type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky removed the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 30, 2022
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovsky
MichalStrehovsky merged commit b81b822 into dotnet:mainJan 2, 2023
@MichalStrehovsky
MichalStrehovsky deleted the gvmresolvets branch January 2, 2023 07:48
@ghostghost locked as resolved and limited conversation to collaborators Feb 1, 2023
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.

2 participants

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

Resolve generic virtual methods in managed type system - #80035

Merged
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets
Jan 2, 2023
Merged

Resolve generic virtual methods in managed type system#80035
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets

Conversation

@MichalStrehovsky

@MichalStrehovskyMichalStrehovsky commented Dec 29, 2022

Copy link
Copy Markdown
Member

Generic virtual method resolution currently happens on top of RuntimeTypeHandles (i.e. the runtime type system). This works as long as we only need to do generic virtual method resolution on top of types that exist in the runtime.

In order to lay foundation for fixing #77070, we need to be able to resolve not just with types that have a type handle, but also for types that we're in the process of building (e.g. due to MakeGeneric, or due to another generic virtual method dispatch).

This pull request rewrites generic virtual method dispatch to happen on top of the managed type system, instead of the runtime type system. It's a bit more than just a mechanical replacement because the existing algorithm was set up in a confusing way, with ref parameters that were changing what we were resolving and an odd slotChanged logic that I don't fully understand. I replaced the slotChanged with the straightforward thing (if we resolve interface method to a virtual method on a type, find the implementation of the virtual method on the current type). Tests seem to be passing. Also instead of a bunch of ref parameters we now just pass a MethodDesc.

This also includes a compiler change, because in order for the managed type system's casting logic to work, we need to be able to find out the variance of parameters on generic definitions. The compiler change is about generating this info.

Cc @dotnet/ilc-contrib

@MichalStrehovskyMichalStrehovsky added the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 29, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:MichalStrehovsky
Assignees:-
Labels:

NO-REVIEW, area-NativeAOT-coreclr

Milestone:-

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovskyMichalStrehovsky changed the title WIP: Resolve generic virtual methods in type systemResolve generic virtual methods in type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky changed the title Resolve generic virtual methods in type systemResolve generic virtual methods in managed type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky removed the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 30, 2022
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovsky
MichalStrehovsky merged commit b81b822 into dotnet:mainJan 2, 2023
@MichalStrehovsky
MichalStrehovsky deleted the gvmresolvets branch January 2, 2023 07:48
@ghostghost locked as resolved and limited conversation to collaborators Feb 1, 2023
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.

2 participants

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

Resolve generic virtual methods in managed type system - #80035

Merged
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets
Jan 2, 2023
Merged

Resolve generic virtual methods in managed type system#80035
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets

Conversation

@MichalStrehovsky

@MichalStrehovskyMichalStrehovsky commented Dec 29, 2022

Copy link
Copy Markdown
Member

Generic virtual method resolution currently happens on top of RuntimeTypeHandles (i.e. the runtime type system). This works as long as we only need to do generic virtual method resolution on top of types that exist in the runtime.

In order to lay foundation for fixing #77070, we need to be able to resolve not just with types that have a type handle, but also for types that we're in the process of building (e.g. due to MakeGeneric, or due to another generic virtual method dispatch).

This pull request rewrites generic virtual method dispatch to happen on top of the managed type system, instead of the runtime type system. It's a bit more than just a mechanical replacement because the existing algorithm was set up in a confusing way, with ref parameters that were changing what we were resolving and an odd slotChanged logic that I don't fully understand. I replaced the slotChanged with the straightforward thing (if we resolve interface method to a virtual method on a type, find the implementation of the virtual method on the current type). Tests seem to be passing. Also instead of a bunch of ref parameters we now just pass a MethodDesc.

This also includes a compiler change, because in order for the managed type system's casting logic to work, we need to be able to find out the variance of parameters on generic definitions. The compiler change is about generating this info.

Cc @dotnet/ilc-contrib

@MichalStrehovskyMichalStrehovsky added the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 29, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:MichalStrehovsky
Assignees:-
Labels:

NO-REVIEW, area-NativeAOT-coreclr

Milestone:-

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovskyMichalStrehovsky changed the title WIP: Resolve generic virtual methods in type systemResolve generic virtual methods in type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky changed the title Resolve generic virtual methods in type systemResolve generic virtual methods in managed type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky removed the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 30, 2022
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovsky
MichalStrehovsky merged commit b81b822 into dotnet:mainJan 2, 2023
@MichalStrehovsky
MichalStrehovsky deleted the gvmresolvets branch January 2, 2023 07:48
@ghostghost locked as resolved and limited conversation to collaborators Feb 1, 2023
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.

2 participants

@MichalStrehovsky@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Resolve generic virtual methods in managed type system by MichalStrehovsky · Pull Request #80035 · dotnet/runtime · GitHub
Skip to content

Resolve generic virtual methods in managed type system - #80035

Merged
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets
Jan 2, 2023
Merged

Resolve generic virtual methods in managed type system#80035
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets

Conversation

@MichalStrehovsky

@MichalStrehovskyMichalStrehovsky commented Dec 29, 2022

Copy link
Copy Markdown
Member

Generic virtual method resolution currently happens on top of RuntimeTypeHandles (i.e. the runtime type system). This works as long as we only need to do generic virtual method resolution on top of types that exist in the runtime.

In order to lay foundation for fixing #77070, we need to be able to resolve not just with types that have a type handle, but also for types that we're in the process of building (e.g. due to MakeGeneric, or due to another generic virtual method dispatch).

This pull request rewrites generic virtual method dispatch to happen on top of the managed type system, instead of the runtime type system. It's a bit more than just a mechanical replacement because the existing algorithm was set up in a confusing way, with ref parameters that were changing what we were resolving and an odd slotChanged logic that I don't fully understand. I replaced the slotChanged with the straightforward thing (if we resolve interface method to a virtual method on a type, find the implementation of the virtual method on the current type). Tests seem to be passing. Also instead of a bunch of ref parameters we now just pass a MethodDesc.

This also includes a compiler change, because in order for the managed type system's casting logic to work, we need to be able to find out the variance of parameters on generic definitions. The compiler change is about generating this info.

Cc @dotnet/ilc-contrib

@MichalStrehovskyMichalStrehovsky added the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 29, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:MichalStrehovsky
Assignees:-
Labels:

NO-REVIEW, area-NativeAOT-coreclr

Milestone:-

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovskyMichalStrehovsky changed the title WIP: Resolve generic virtual methods in type systemResolve generic virtual methods in type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky changed the title Resolve generic virtual methods in type systemResolve generic virtual methods in managed type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky removed the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 30, 2022
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovsky
MichalStrehovsky merged commit b81b822 into dotnet:mainJan 2, 2023
@MichalStrehovsky
MichalStrehovsky deleted the gvmresolvets branch January 2, 2023 07:48
@ghostghost locked as resolved and limited conversation to collaborators Feb 1, 2023
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.

2 participants

@MichalStrehovsky@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Resolve generic virtual methods in managed type system by MichalStrehovsky · Pull Request #80035 · dotnet/runtime · GitHub
Skip to content

Resolve generic virtual methods in managed type system - #80035

Merged
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets
Jan 2, 2023
Merged

Resolve generic virtual methods in managed type system#80035
MichalStrehovsky merged 5 commits into
dotnet:mainfrom
MichalStrehovsky:gvmresolvets

Conversation

@MichalStrehovsky

@MichalStrehovskyMichalStrehovsky commented Dec 29, 2022

Copy link
Copy Markdown
Member

Generic virtual method resolution currently happens on top of RuntimeTypeHandles (i.e. the runtime type system). This works as long as we only need to do generic virtual method resolution on top of types that exist in the runtime.

In order to lay foundation for fixing #77070, we need to be able to resolve not just with types that have a type handle, but also for types that we're in the process of building (e.g. due to MakeGeneric, or due to another generic virtual method dispatch).

This pull request rewrites generic virtual method dispatch to happen on top of the managed type system, instead of the runtime type system. It's a bit more than just a mechanical replacement because the existing algorithm was set up in a confusing way, with ref parameters that were changing what we were resolving and an odd slotChanged logic that I don't fully understand. I replaced the slotChanged with the straightforward thing (if we resolve interface method to a virtual method on a type, find the implementation of the virtual method on the current type). Tests seem to be passing. Also instead of a bunch of ref parameters we now just pass a MethodDesc.

This also includes a compiler change, because in order for the managed type system's casting logic to work, we need to be able to find out the variance of parameters on generic definitions. The compiler change is about generating this info.

Cc @dotnet/ilc-contrib

@MichalStrehovskyMichalStrehovsky added the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 29, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:MichalStrehovsky
Assignees:-
Labels:

NO-REVIEW, area-NativeAOT-coreclr

Milestone:-

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovskyMichalStrehovsky changed the title WIP: Resolve generic virtual methods in type systemResolve generic virtual methods in type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky changed the title Resolve generic virtual methods in type systemResolve generic virtual methods in managed type systemDec 30, 2022
@MichalStrehovskyMichalStrehovsky removed the NO-REVIEW Experimental/testing PR, do NOT review it label Dec 30, 2022
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MichalStrehovsky
MichalStrehovsky merged commit b81b822 into dotnet:mainJan 2, 2023
@MichalStrehovsky
MichalStrehovsky deleted the gvmresolvets branch January 2, 2023 07:48
@ghostghost locked as resolved and limited conversation to collaborators Feb 1, 2023
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.

2 participants

@MichalStrehovsky@jkotas