@@ -292,7 +292,7 @@ BailOutRecord::BailOutRecord(uint32 bailOutOffset, uint bailOutCacheIndex, IR::B
292
292
argOutOffsetInfo(nullptr ), bailOutOffset(bailOutOffset),
293
293
bailOutCount(0 ), polymorphicCacheIndex(bailOutCacheIndex), bailOutKind(kind),
294
294
branchValueRegSlot(Js::Constants::NoRegister),
295
- ehBailoutData(nullptr ), m_bailOutRecordId(0 )
295
+ ehBailoutData(nullptr ), m_bailOutRecordId(0 ), type(Normal)
296
296
#if DBG
297
297
, inlineDepth(0 )
298
298
#endif
@@ -1279,9 +1279,9 @@ BailOutRecord::BailOutFromLoopBodyHelper(Js::JavascriptCallStackLayout * layout,
1279
1279
return bailOutOffset;
1280
1280
}
1281
1281
1282
- void BailOutRecord::UpdatePolymorphicFieldAccess (Js::JavascriptFunction * function, BailOutRecord const * bailOutRecord)
1282
+ void BailOutRecord::UpdatePolymorphicFieldAccess (Js::JavascriptFunction * function, BailOutRecord const * bailOutRecord)
1283
1283
{
1284
- Js::FunctionBody * executeFunction = function->GetFunctionBody ();
1284
+ Js::FunctionBody * executeFunction = bailOutRecord-> type == Shared ? ((SharedBailOutRecord*)bailOutRecord)-> functionBody : function->GetFunctionBody ();
1285
1285
Js::DynamicProfileInfo *dynamicProfileInfo = nullptr ;
1286
1286
if (executeFunction->HasDynamicProfileInfo ())
1287
1287
{
@@ -1290,7 +1290,7 @@ void BailOutRecord::UpdatePolymorphicFieldAccess(Js::JavascriptFunction * funct
1290
1290
1291
1291
if (bailOutRecord->polymorphicCacheIndex != (uint )-1 )
1292
1292
{
1293
- dynamicProfileInfo->RecordPolymorphicFieldAccess (function-> GetFunctionBody () , bailOutRecord->polymorphicCacheIndex );
1293
+ dynamicProfileInfo->RecordPolymorphicFieldAccess (executeFunction , bailOutRecord->polymorphicCacheIndex );
1294
1294
if (IR::IsEquivalentTypeCheckBailOutKind (bailOutRecord->bailOutKind ))
1295
1295
{
1296
1296
// 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
2546
2546
: BailOutRecord(trueBailOutOffset, (uint )-1, kind, bailOutFunc), falseBailOutOffset(falseBailOutOffset)
2547
2547
{
2548
2548
branchValueRegSlot = resultByteCodeReg;
2549
+ type = BailoutRecordType::Branch;
2549
2550
};
2550
2551
2551
2552
Js::Var BranchBailOutRecord::BailOut (BranchBailOutRecord const * bailOutRecord, BOOL cond)
@@ -2633,6 +2634,13 @@ BranchBailOutRecord::BailOutFromLoopBodyInlined(Js::JavascriptCallStackLayout *
2633
2634
return __super::BailOutFromLoopBodyInlinedCommon (layout, bailOutRecord, bailOutOffset, returnAddress, bailOutRecord->bailOutKind , branchValue);
2634
2635
}
2635
2636
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
+
2636
2644
void LazyBailOutRecord::SetBailOutKind ()
2637
2645
{
2638
2646
this ->bailoutRecord ->SetBailOutKind (IR::BailOutKind::LazyBailOut);
0 commit comments