Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions src/coreclr/vm/exceptionhandling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3899,15 +3899,19 @@ CLR_BOOL SfiNextWorker(StackFrameIterator* pThis, uint* uExCollideClauseIdx, CLR
bool doingFuncletUnwind = pThis->m_crawl.IsFunclet();
PCODE preUnwindControlPC = pThis->m_crawl.GetRegisterSet()->ControlPC;

bool isNativeTransition;

retVal = pThis->Next();
if (retVal == SWA_FAILED)
{
EH_LOG((LL_INFO100, "SfiNext (pass=%d): failed to get next frame", pTopExInfo->m_passNumber));
goto Exit;
}

isNativeTransition = (pThis->GetFrameState() == StackFrameIterator::SFITER_NATIVE_MARKER_FRAME);

#ifdef FEATURE_INTERPRETER
if ((pThis->GetFrameState() == StackFrameIterator::SFITER_NATIVE_MARKER_FRAME) &&
if (isNativeTransition &&
(GetIP(pThis->m_crawl.GetRegisterSet()->pCurrentContext) == InterpreterFrame::DummyCallerIP))
{
// The callerIP is InterpreterFrame::DummyCallerIP when we are going to unwind from the first interpreted frame belonging to an InterpreterFrame.
Expand All @@ -3931,15 +3935,16 @@ CLR_BOOL SfiNextWorker(StackFrameIterator* pThis, uint* uExCollideClauseIdx, CLR
pInterpreterFrame->UpdateRegDisplay(pThis->m_crawl.GetRegisterSet(), /* updateFloats */ true);
}
}
else
{
// The caller of the interpreted code is managed.
isNativeTransition = false;
}
}
#endif // FEATURE_INTERPRETER

// Check for reverse pinvoke or CallDescrWorkerInternal.
if ((pThis->GetFrameState() == StackFrameIterator::SFITER_NATIVE_MARKER_FRAME)
#ifdef FEATURE_INTERPRETER
|| (pThis->GetFrameState() == StackFrameIterator::SFITER_DONE)
#endif // FEATURE_INTERPRETER
)
if (isNativeTransition)
{
EECodeInfo codeInfo(preUnwindControlPC);
#ifdef USE_GC_INFO_DECODER
Expand Down