ProcessFuncletsForGCReporting:
do
{
- fRecheckCurrentFrame = false;
-
// When enumerating GC references for "liveness" reporting, depending upon the architecture,
// the responsibility of who reports what varies:
//
// only source of evidence about it.
// This is different from Windows where the full stack is preserved until an exception is fully handled
// and so we can detect it just from walking the stack.
- if (!fSkippingFunclet && (pTracker != NULL))
+ if (!fRecheckCurrentFrame && !fSkippingFunclet && (pTracker != NULL))
{
// The stack walker is not skipping frames now, which means it didn't find a funclet frame that
// would require skipping the current frame. If we find a tracker with caller of actual handling
{
if (hasFuncletStarted)
{
- sfFuncletParent = pCurrTracker->GetCallerOfActualHandlingFrame();
+ sfFuncletParent = pCurrTracker->GetCallerOfEnclosingClause();
if (!sfFuncletParent.IsNull() && ExceptionTracker::IsUnwoundToTargetParentFrame(&m_crawl, sfFuncletParent))
{
break;
}
}
- sfFuncletParent = pCurrTracker->GetCallerOfCollapsedActualHandlingFrame();
+ sfFuncletParent = pCurrTracker->GetCallerOfCollapsedEnclosingClause();
if (!sfFuncletParent.IsNull() && ExceptionTracker::IsUnwoundToTargetParentFrame(&m_crawl, sfFuncletParent))
{
break;
m_sfFuncletParent = sfFuncletParent;
m_fProcessNonFilterFunclet = true;
m_fDidFuncletReportGCReferences = false;
+ fSkippingFunclet = true;
}
}
#endif // FEATURE_PAL
+
+ fRecheckCurrentFrame = false;
// Do we already have a reference to a funclet parent?
if (!m_sfFuncletParent.IsNull())
{
// Since we are in GC reference reporting mode,
// then avoid code duplication and go to
// funclet processing.
+ fRecheckCurrentFrame = true;
goto ProcessFuncletsForGCReporting;
}
}
// If we are in GC reference reporting mode,
// then avoid code duplication and go to
// funclet processing.
+ fRecheckCurrentFrame = true;
goto ProcessFuncletsForGCReporting;
}
else