@@ -747,8 +747,36 @@ namespace Js
747747 return !!pActiveFuncs->TestAndSet (this ->GetFunctionNumber ());
748748 }
749749
750- void FunctionBody::UpdateActiveFunctionSet (ActiveFunctionSet *pActiveFuncs) const
750+ void FunctionBody::UpdateActiveFunctionsForOneDataSet (ActiveFunctionSet *pActiveFuncs, FunctionCodeGenRuntimeData **dataSet ) const
751751 {
752+ FunctionCodeGenRuntimeData *inlineeData;
753+ for (uint i = 0 ; i < this ->GetProfiledCallSiteCount (); i++)
754+ {
755+ for (inlineeData = dataSet[i]; inlineeData; inlineeData = inlineeData->GetNext ())
756+ {
757+ inlineeData->GetFunctionBody ()->UpdateActiveFunctionSet (pActiveFuncs, inlineeData);
758+ }
759+ }
760+ }
761+
762+ void FunctionBody::UpdateActiveFunctionSet (ActiveFunctionSet *pActiveFuncs, FunctionCodeGenRuntimeData *callSiteData) const
763+ {
764+ // Always walk the inlinee and ldFldInlinee data (if we have them), as they are different at each call site.
765+
766+ if (callSiteData)
767+ {
768+ if (callSiteData->GetInlinees ())
769+ {
770+ this ->UpdateActiveFunctionsForOneDataSet (pActiveFuncs, callSiteData->GetInlinees ());
771+ }
772+ if (callSiteData->GetLdFldInlinees ())
773+ {
774+ this ->UpdateActiveFunctionsForOneDataSet (pActiveFuncs, callSiteData->GetLdFldInlinees ());
775+ }
776+ }
777+
778+ // Now walk the top-level data, but only do it once, since it's always the same.
779+
752780 if (this ->TestAndUpdateActiveFunctions (pActiveFuncs))
753781 {
754782 return ;
@@ -758,13 +786,8 @@ namespace Js
758786 {
759787 return ;
760788 }
761- for (uint i = 0 ; i < this ->GetProfiledCallSiteCount (); i++)
762- {
763- for (FunctionCodeGenRuntimeData *inlineeData = data[i]; inlineeData; inlineeData = inlineeData->GetNext ())
764- {
765- inlineeData->GetFunctionBody ()->UpdateActiveFunctionSet (pActiveFuncs);
766- }
767- }
789+
790+ this ->UpdateActiveFunctionsForOneDataSet (pActiveFuncs, data);
768791 }
769792
770793 bool FunctionBody::DoRedeferFunction (uint inactiveThreshold) const
0 commit comments