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