summaryrefslogtreecommitdiff
path: root/src/vm/jitinterface.cpp
diff options
context:
space:
mode:
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>2019-03-07 01:52:36 +0100
committerJan Kotas <jkotas@microsoft.com>2019-03-06 16:52:36 -0800
commit502de2a97b9fd26082ee8e3de46734724b2b535c (patch)
treeb7c45e1cc2e082d05df2eb7584351d548b5daf98 /src/vm/jitinterface.cpp
parent18542014bba5c33a776fa12c46a001fbe55dc5d1 (diff)
downloadcoreclr-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.cpp20
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