diff options
author | Michal Strehovský <MichalStrehovsky@users.noreply.github.com> | 2019-03-07 01:52:36 +0100 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2019-03-06 16:52:36 -0800 |
commit | 502de2a97b9fd26082ee8e3de46734724b2b535c (patch) | |
tree | b7c45e1cc2e082d05df2eb7584351d548b5daf98 /src/vm/jitinterface.cpp | |
parent | 18542014bba5c33a776fa12c46a001fbe55dc5d1 (diff) | |
download | coreclr-502de2a97b9fd26082ee8e3de46734724b2b535c.tar.gz coreclr-502de2a97b9fd26082ee8e3de46734724b2b535c.tar.bz2 coreclr-502de2a97b9fd26082ee8e3de46734724b2b535c.zip |
Remove legacy behavior around non-virtual interface calls (#23032)
* Throw BadImageFormat for direct calls to abstract methods
* Remove legacy behavior around non-virtual interface calls
* Try fixing failing tests
The test we inherited from the default interface method prototype branch is doing exactly the thing it shouldn't do (rely on the bad behavior) for unexplained reasons.
Diffstat (limited to 'src/vm/jitinterface.cpp')
-rw-r--r-- | src/vm/jitinterface.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index 31f6d1a78a..42975b6537 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -5295,6 +5295,7 @@ void CEEInfo::getCallInfo( // MethodDesc * pTargetMD = pMDAfterConstraintResolution; + DWORD dwTargetMethodAttrs = pTargetMD->GetAttrs(); if (pTargetMD->HasMethodInstantiation()) { @@ -5352,12 +5353,6 @@ void CEEInfo::getCallInfo( directCall = true; } else - // Backwards compat: calls to abstract interface methods are treated as callvirt - if (pTargetMD->GetMethodTable()->IsInterface() && pTargetMD->IsAbstract()) - { - directCall = false; - } - else if (!(flags & CORINFO_CALLINFO_CALLVIRT) || fResolvedConstraint) { directCall = true; @@ -5398,12 +5393,11 @@ void CEEInfo::getCallInfo( if (pTargetMD->GetMethodTable()->IsInterface()) { // Handle interface methods specially because the Sealed bit has no meaning on interfaces. - devirt = !IsMdVirtual(pTargetMD->GetAttrs()); + devirt = !IsMdVirtual(dwTargetMethodAttrs); } else { - DWORD dwMethodAttrs = pTargetMD->GetAttrs(); - devirt = !IsMdVirtual(dwMethodAttrs) || IsMdFinal(dwMethodAttrs) || pTargetMD->GetMethodTable()->IsSealed(); + devirt = !IsMdVirtual(dwTargetMethodAttrs) || IsMdFinal(dwTargetMethodAttrs) || pTargetMD->GetMethodTable()->IsSealed(); } if (devirt) @@ -5415,6 +5409,14 @@ void CEEInfo::getCallInfo( if (directCall) { + // Direct calls to abstract methods are not allowed + if (IsMdAbstract(dwTargetMethodAttrs) && + // Compensate for always treating delegates as direct calls above + !(((flags & CORINFO_CALLINFO_LDFTN) && (flags & CORINFO_CALLINFO_CALLVIRT) && !resolvedCallVirt))) + { + COMPlusThrowHR(COR_E_BADIMAGEFORMAT, BFA_BAD_IL); + } + bool allowInstParam = (flags & CORINFO_CALLINFO_ALLOWINSTPARAM); // Create instantiating stub if necesary |