@@ -292,7 +292,7 @@ BailOutRecord::BailOutRecord(uint32 bailOutOffset, uint bailOutCacheIndex, IR::B
292292 argOutOffsetInfo(nullptr ), bailOutOffset(bailOutOffset),
293293 bailOutCount(0 ), polymorphicCacheIndex(bailOutCacheIndex), bailOutKind(kind),
294294 branchValueRegSlot(Js::Constants::NoRegister),
295- ehBailoutData(nullptr ), m_bailOutRecordId(0 )
295+ ehBailoutData(nullptr ), m_bailOutRecordId(0 ), type(Normal)
296296#if DBG
297297 , inlineDepth(0 )
298298#endif
@@ -1279,9 +1279,9 @@ BailOutRecord::BailOutFromLoopBodyHelper(Js::JavascriptCallStackLayout * layout,
12791279 return bailOutOffset;
12801280}
12811281
1282- void BailOutRecord::UpdatePolymorphicFieldAccess (Js::JavascriptFunction * function, BailOutRecord const * bailOutRecord)
1282+ void BailOutRecord::UpdatePolymorphicFieldAccess (Js::JavascriptFunction * function, BailOutRecord const * bailOutRecord)
12831283{
1284- Js::FunctionBody * executeFunction = function->GetFunctionBody ();
1284+ Js::FunctionBody * executeFunction = bailOutRecord-> type == Shared ? ((SharedBailOutRecord*)bailOutRecord)-> functionBody : function->GetFunctionBody ();
12851285 Js::DynamicProfileInfo *dynamicProfileInfo = nullptr ;
12861286 if (executeFunction->HasDynamicProfileInfo ())
12871287 {
@@ -1290,7 +1290,7 @@ void BailOutRecord::UpdatePolymorphicFieldAccess(Js::JavascriptFunction * funct
12901290
12911291 if (bailOutRecord->polymorphicCacheIndex != (uint)-1 )
12921292 {
1293- dynamicProfileInfo->RecordPolymorphicFieldAccess (function-> GetFunctionBody () , bailOutRecord->polymorphicCacheIndex );
1293+ dynamicProfileInfo->RecordPolymorphicFieldAccess (executeFunction , bailOutRecord->polymorphicCacheIndex );
12941294 if (IR::IsEquivalentTypeCheckBailOutKind (bailOutRecord->bailOutKind ))
12951295 {
12961296 // If we've already got a polymorphic inline cache, and if we've got an equivalent type check
@@ -2546,6 +2546,7 @@ BranchBailOutRecord::BranchBailOutRecord(uint32 trueBailOutOffset, uint32 falseB
25462546 : BailOutRecord(trueBailOutOffset, (uint)-1, kind, bailOutFunc), falseBailOutOffset(falseBailOutOffset)
25472547{
25482548 branchValueRegSlot = resultByteCodeReg;
2549+ type = BailoutRecordType::Branch;
25492550};
25502551
25512552Js::Var BranchBailOutRecord::BailOut (BranchBailOutRecord const * bailOutRecord, BOOL cond)
@@ -2633,6 +2634,13 @@ BranchBailOutRecord::BailOutFromLoopBodyInlined(Js::JavascriptCallStackLayout *
26332634 return __super::BailOutFromLoopBodyInlinedCommon (layout, bailOutRecord, bailOutOffset, returnAddress, bailOutRecord->bailOutKind , branchValue);
26342635}
26352636
2637+ SharedBailOutRecord::SharedBailOutRecord (uint32 bailOutOffset, uint bailOutCacheIndex, IR::BailOutKind kind, Func *bailOutFunc)
2638+ : BailOutRecord(bailOutOffset, bailOutCacheIndex, kind, bailOutFunc)
2639+ {
2640+ this ->functionBody = nullptr ;
2641+ this ->type = BailoutRecordType::Shared;
2642+ }
2643+
26362644void LazyBailOutRecord::SetBailOutKind ()
26372645{
26382646 this ->bailoutRecord ->SetBailOutKind (IR::BailOutKind::LazyBailOut);
0 commit comments