diff --git a/src/vm/codeversion.cpp b/src/vm/codeversion.cpp
index eb5f15f24524..e956ad7f03ce 100644
--- a/src/vm/codeversion.cpp
+++ b/src/vm/codeversion.cpp
@@ -200,7 +200,7 @@ void NativeCodeVersionNode::SetGCCoverageInfo(PTR_GCCoverageInfo gcCover)
#endif // HAVE_GCCOVER
NativeCodeVersion::NativeCodeVersion() :
- m_storageKind(StorageKind::Unknown)
+ m_storageKind(StorageKind::Unknown), m_pVersionNode(PTR_NULL)
{}
NativeCodeVersion::NativeCodeVersion(const NativeCodeVersion & rhs) :
diff --git a/src/vm/gccover.cpp b/src/vm/gccover.cpp
index 2ede08d823f4..a455c3d22315 100644
--- a/src/vm/gccover.cpp
+++ b/src/vm/gccover.cpp
@@ -1315,7 +1315,9 @@ bool IsGcCoverageInterrupt(LPVOID ip)
return false;
}
- GCCoverageInfo *gcCover = codeInfo.GetNativeCodeVersion().GetGCCoverageInfo();
+ NativeCodeVersion nativeCodeVersion = codeInfo.GetNativeCodeVersion();
+ _ASSERTE(!nativeCodeVersion.IsNull());
+ GCCoverageInfo *gcCover = nativeCodeVersion.GetGCCoverageInfo();
if (gcCover == nullptr)
{
return false;
@@ -1377,7 +1379,9 @@ BOOL OnGcCoverageInterrupt(PCONTEXT regs)
forceStack[1] = &pMD; // This is so I can see it fastchecked
forceStack[2] = &offset; // This is so I can see it fastchecked
- GCCoverageInfo* gcCover = codeInfo.GetNativeCodeVersion().GetGCCoverageInfo();
+ NativeCodeVersion nativeCodeVersion = codeInfo.GetNativeCodeVersion();
+ _ASSERTE(!nativeCodeVersion.IsNull());
+ GCCoverageInfo* gcCover = nativeCodeVersion.GetGCCoverageInfo();
forceStack[3] = &gcCover; // This is so I can see it fastchecked
if (gcCover == 0)
return(FALSE); // we aren't doing code gcCoverage on this function
diff --git a/src/vm/method.cpp b/src/vm/method.cpp
index e4a75d6a4c94..3a53462dae51 100644
--- a/src/vm/method.cpp
+++ b/src/vm/method.cpp
@@ -1022,6 +1022,7 @@ PCODE MethodDesc::GetNativeCode()
{
WRAPPER_NO_CONTRACT;
SUPPORTS_DAC;
+ _ASSERTE(!IsDefaultInterfaceMethod() || HasNativeCodeSlot());
g_IBCLogger.LogMethodDescAccess(this);
@@ -5037,6 +5038,8 @@ BOOL MethodDesc::SetNativeCodeInterlocked(PCODE addr, PCODE pExpected /*=NULL*/)
GC_NOTRIGGER;
} CONTRACTL_END;
+ _ASSERTE(!IsDefaultInterfaceMethod() || HasNativeCodeSlot());
+
if (HasNativeCodeSlot())
{
#ifdef _TARGET_ARM_
@@ -5060,11 +5063,6 @@ BOOL MethodDesc::SetNativeCodeInterlocked(PCODE addr, PCODE pExpected /*=NULL*/)
(TADDR&)value, (TADDR&)expected) == (TADDR&)expected;
}
- if (IsDefaultInterfaceMethod() && HasPrecode())
- {
- return GetPrecode()->SetTargetInterlocked(addr);
- }
-
_ASSERTE(pExpected == NULL);
return SetStableEntryPointInterlocked(addr);
}
diff --git a/src/vm/methodtablebuilder.cpp b/src/vm/methodtablebuilder.cpp
index f5038138f189..24a1e587db4e 100644
--- a/src/vm/methodtablebuilder.cpp
+++ b/src/vm/methodtablebuilder.cpp
@@ -6973,6 +6973,20 @@ MethodTableBuilder::NeedsNativeCodeSlot(bmtMDMethod * pMDMethod)
}
#endif
+#ifdef FEATURE_DEFAULT_INTERFACES
+ if (IsInterface())
+ {
+ DWORD attrs = pMDMethod->GetDeclAttrs();
+ if (!IsMdStatic(attrs) && IsMdVirtual(attrs) && !IsMdAbstract(attrs))
+ {
+ // Default interface method. Since interface methods currently need to have a precode, the native code slot will be
+ // used to retrieve the native code entry point, instead of getting it from the precode, which is not reliable with
+ // debuggers setting breakpoints.
+ return TRUE;
+ }
+ }
+#endif
+
#if defined(FEATURE_JIT_PITCHING)
if ((CLRConfig::GetConfigValue(CLRConfig::INTERNAL_JitPitchEnabled) != 0) &&
(CLRConfig::GetConfigValue(CLRConfig::INTERNAL_JitPitchMemThreshold) != 0))
diff --git a/tests/src/Loader/classloader/DefaultInterfaceMethods/sharedgenerics/sharedgenerics_d.ilproj b/tests/src/Loader/classloader/DefaultInterfaceMethods/sharedgenerics/sharedgenerics_d.ilproj
index 14a52a1697b3..2cdea3a3c62f 100644
--- a/tests/src/Loader/classloader/DefaultInterfaceMethods/sharedgenerics/sharedgenerics_d.ilproj
+++ b/tests/src/Loader/classloader/DefaultInterfaceMethods/sharedgenerics/sharedgenerics_d.ilproj
@@ -15,8 +15,6 @@
Exe
BuildAndRun
0
-
- true
diff --git a/tests/src/Loader/classloader/DefaultInterfaceMethods/sharedgenerics/sharedgenerics_r.ilproj b/tests/src/Loader/classloader/DefaultInterfaceMethods/sharedgenerics/sharedgenerics_r.ilproj
index 8894a008937a..45d186c15f3a 100644
--- a/tests/src/Loader/classloader/DefaultInterfaceMethods/sharedgenerics/sharedgenerics_r.ilproj
+++ b/tests/src/Loader/classloader/DefaultInterfaceMethods/sharedgenerics/sharedgenerics_r.ilproj
@@ -15,8 +15,6 @@
Exe
BuildAndRun
0
-
- true