Skip to content

Commit 2abdaab

Browse files
committed
[MERGE #4591 @kfarnung] Fixing TTD regressions from JsObject* function refactor
Merge pull request #4591 from kfarnung:ttdobjects When the JsObject* functions were added to JSRT there was an attempt to refactor the TTD instrumentation into a common method. The refactor caused a regression in cross-context scenarios where the record was capturing both the result of the function as well as any marshalling necessary to get the result. This change reverts the behavior of the existing methods (e.g. JsSetProperty and friends) to capture the record before any marshalling can occur (VALIDATE_INCOMING_OBJECT will marshal the object if necessary). For the new JsObject* functions I've added an assert to ensure that once they are used they will cause TTD record to fail with an actionable message.
2 parents b244840 + e54e87a commit 2abdaab

File tree

1 file changed

+47
-44
lines changed

1 file changed

+47
-44
lines changed

lib/Jsrt/Jsrt.cpp

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,11 +1422,8 @@ CHAKRA_API JsPreventExtension(_In_ JsValueRef object)
14221422
}
14231423

14241424
CHAKRA_API JsHasOwnPropertyCommon(Js::ScriptContext * scriptContext, _In_ JsValueRef object,
1425-
_In_ const Js::PropertyRecord * propertyRecord, _Out_ bool *hasOwnProperty,
1426-
TTDRecorder& _actionEntryPopper)
1425+
_In_ const Js::PropertyRecord * propertyRecord, _Out_ bool *hasOwnProperty)
14271426
{
1428-
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTHasOwnProperty, propertyRecord, object);
1429-
14301427
*hasOwnProperty = Js::JavascriptOperators::OP_HasOwnProperty(object,
14311428
propertyRecord->GetPropertyId(), scriptContext) != 0;
14321429

@@ -1438,14 +1435,15 @@ CHAKRA_API JsHasOwnProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propert
14381435
{
14391436
return ContextAPIWrapper<true>([&] (Js::ScriptContext *scriptContext,
14401437
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1438+
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTHasOwnProperty, (const Js::PropertyRecord *)propertyId, object);
14411439

14421440
VALIDATE_INCOMING_OBJECT(object, scriptContext);
14431441
VALIDATE_INCOMING_PROPERTYID(propertyId);
14441442
PARAM_NOT_NULL(hasOwnProperty);
14451443
*hasOwnProperty = false;
14461444

14471445
return JsHasOwnPropertyCommon(scriptContext, object,
1448-
(const Js::PropertyRecord *)propertyId, hasOwnProperty, _actionEntryPopper);
1446+
(const Js::PropertyRecord *)propertyId, hasOwnProperty);
14491447
});
14501448
}
14511449

@@ -1476,6 +1474,7 @@ CHAKRA_API JsObjectHasOwnProperty(_In_ JsValueRef object, _In_ JsValueRef proper
14761474
{
14771475
return ContextAPIWrapper<true>([&] (Js::ScriptContext *scriptContext,
14781476
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1477+
PERFORM_JSRT_TTD_RECORD_ACTION_NOT_IMPLEMENTED(scriptContext);
14791478

14801479
VALIDATE_INCOMING_OBJECT(object, scriptContext);
14811480
VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext);
@@ -1491,40 +1490,41 @@ CHAKRA_API JsObjectHasOwnProperty(_In_ JsValueRef object, _In_ JsValueRef proper
14911490
return errorValue;
14921491
}
14931492

1494-
return JsHasOwnPropertyCommon(scriptContext, object, propertyRecord, hasOwnProperty, _actionEntryPopper);
1493+
return JsHasOwnPropertyCommon(scriptContext, object, propertyRecord, hasOwnProperty);
14951494
});
14961495
}
14971496
#endif
14981497

14991498
static JsErrorCode JsGetPropertyCommon(Js::ScriptContext * scriptContext,
15001499
_In_ Js::RecyclableObject * object,
1501-
_In_ const Js::PropertyRecord * propertyRecord, _Out_ JsValueRef *value,
1502-
TTDRecorder& _actionEntryPopper)
1500+
_In_ const Js::PropertyRecord * propertyRecord, _Out_ JsValueRef *value)
15031501
{
15041502
AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!");
1505-
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetProperty, propertyRecord, object);
15061503

15071504
*value = Js::JavascriptOperators::GetPropertyNoCache(object, propertyRecord->GetPropertyId(), scriptContext);
15081505
Assert(*value == nullptr || !Js::CrossSite::NeedMarshalVar(*value, scriptContext));
15091506

1510-
PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, value);
1511-
15121507
return JsNoError;
15131508
}
15141509

15151510
CHAKRA_API JsGetProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _Out_ JsValueRef *value)
15161511
{
15171512
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
15181513
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1514+
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetProperty, (const Js::PropertyRecord *)propertyId, object);
15191515

15201516
VALIDATE_INCOMING_OBJECT(object, scriptContext);
15211517
VALIDATE_INCOMING_PROPERTYID(propertyId);
15221518
PARAM_NOT_NULL(value);
15231519
*value = nullptr;
15241520

15251521
Js::RecyclableObject * instance = Js::RecyclableObject::FromVar(object);
1526-
return JsGetPropertyCommon(scriptContext, instance, (const Js::PropertyRecord *)propertyId,
1527-
value, _actionEntryPopper);
1522+
JsErrorCode err = JsGetPropertyCommon(scriptContext, instance, (const Js::PropertyRecord *)propertyId,
1523+
value);
1524+
1525+
PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, value);
1526+
1527+
return err;
15281528
});
15291529
}
15301530

@@ -1533,6 +1533,7 @@ CHAKRA_API JsObjectGetProperty(_In_ JsValueRef object, _In_ JsValueRef propertyI
15331533
{
15341534
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
15351535
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1536+
PERFORM_JSRT_TTD_RECORD_ACTION_NOT_IMPLEMENTED(scriptContext);
15361537

15371538
VALIDATE_INCOMING_OBJECT(object, scriptContext);
15381539
VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext);
@@ -1551,17 +1552,15 @@ CHAKRA_API JsObjectGetProperty(_In_ JsValueRef object, _In_ JsValueRef propertyI
15511552
Assert(propertyRecord != nullptr);
15521553

15531554
Js::RecyclableObject * instance = Js::RecyclableObject::FromVar(object);
1554-
return JsGetPropertyCommon(scriptContext, instance, propertyRecord, value, _actionEntryPopper);
1555+
return JsGetPropertyCommon(scriptContext, instance, propertyRecord, value);
15551556
});
15561557
}
15571558
#endif
15581559

15591560
static JsErrorCode JsGetOwnPropertyDescriptorCommon(Js::ScriptContext * scriptContext,
1560-
_In_ JsValueRef object, _In_ const Js::PropertyRecord * propertyRecord, _Out_ JsValueRef *propertyDescriptor,
1561-
TTDRecorder& _actionEntryPopper)
1561+
_In_ JsValueRef object, _In_ const Js::PropertyRecord * propertyRecord, _Out_ JsValueRef *propertyDescriptor)
15621562
{
15631563
AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!");
1564-
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetOwnPropertyInfo, propertyRecord, object);
15651564

15661565
Js::PropertyDescriptor propertyDescriptorValue;
15671566
if (Js::JavascriptOperators::GetOwnPropertyDescriptor(Js::RecyclableObject::FromVar(object),
@@ -1575,21 +1574,25 @@ static JsErrorCode JsGetOwnPropertyDescriptorCommon(Js::ScriptContext * scriptCo
15751574
}
15761575
Assert(*propertyDescriptor == nullptr || !Js::CrossSite::NeedMarshalVar(*propertyDescriptor, scriptContext));
15771576

1578-
PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, propertyDescriptor);
1579-
15801577
return JsNoError;
15811578
}
15821579

15831580
CHAKRA_API JsGetOwnPropertyDescriptor(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId, _Out_ JsValueRef *propertyDescriptor)
15841581
{
15851582
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1583+
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTGetOwnPropertyInfo, (const Js::PropertyRecord *)propertyId, object);
1584+
15861585
VALIDATE_INCOMING_OBJECT(object, scriptContext);
15871586
VALIDATE_INCOMING_PROPERTYID(propertyId);
15881587
PARAM_NOT_NULL(propertyDescriptor);
15891588
*propertyDescriptor = nullptr;
15901589

1591-
return JsGetOwnPropertyDescriptorCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId,
1592-
propertyDescriptor, _actionEntryPopper);
1590+
JsErrorCode err = JsGetOwnPropertyDescriptorCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId,
1591+
propertyDescriptor);
1592+
1593+
PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, propertyDescriptor);
1594+
1595+
return err;
15931596
});
15941597
}
15951598

@@ -1598,6 +1601,7 @@ CHAKRA_API JsObjectGetOwnPropertyDescriptor(_In_ JsValueRef object, _In_ JsValue
15981601
{
15991602
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
16001603
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1604+
PERFORM_JSRT_TTD_RECORD_ACTION_NOT_IMPLEMENTED(scriptContext);
16011605

16021606
VALIDATE_INCOMING_OBJECT(object, scriptContext);
16031607
VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext);
@@ -1615,18 +1619,15 @@ CHAKRA_API JsObjectGetOwnPropertyDescriptor(_In_ JsValueRef object, _In_ JsValue
16151619

16161620
Assert(propertyRecord != nullptr);
16171621

1618-
return JsGetOwnPropertyDescriptorCommon(scriptContext, object, propertyRecord, propertyDescriptor, _actionEntryPopper);
1622+
return JsGetOwnPropertyDescriptorCommon(scriptContext, object, propertyRecord, propertyDescriptor);
16191623
});
16201624
}
16211625
#endif
16221626

16231627
static JsErrorCode JsSetPropertyCommon(Js::ScriptContext * scriptContext, _In_ JsValueRef object,
1624-
_In_ const Js::PropertyRecord * propertyRecord, _In_ JsValueRef value, _In_ bool useStrictRules,
1625-
TTDRecorder& _actionEntryPopper)
1628+
_In_ const Js::PropertyRecord * propertyRecord, _In_ JsValueRef value, _In_ bool useStrictRules)
16261629
{
16271630
AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!");
1628-
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTSetProperty, object,
1629-
propertyRecord, value, useStrictRules);
16301631

16311632
Js::JavascriptOperators::OP_SetProperty(object, propertyRecord->GetPropertyId(),
16321633
value, scriptContext, nullptr, useStrictRules ? Js::PropertyOperation_StrictMode : Js::PropertyOperation_None);
@@ -1638,13 +1639,14 @@ CHAKRA_API JsSetProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propertyId
16381639
{
16391640
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
16401641
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1642+
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTSetProperty, object, (const Js::PropertyRecord *)propertyId, value, useStrictRules);
16411643

16421644
VALIDATE_INCOMING_OBJECT(object, scriptContext);
16431645
VALIDATE_INCOMING_PROPERTYID(propertyId);
16441646
VALIDATE_INCOMING_REFERENCE(value, scriptContext);
16451647

16461648
return JsSetPropertyCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId,
1647-
value, useStrictRules, _actionEntryPopper);
1649+
value, useStrictRules);
16481650
});
16491651
}
16501652

@@ -1653,6 +1655,7 @@ CHAKRA_API JsObjectSetProperty(_In_ JsValueRef object, _In_ JsValueRef propertyI
16531655
{
16541656
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
16551657
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1658+
PERFORM_JSRT_TTD_RECORD_ACTION_NOT_IMPLEMENTED(scriptContext);
16561659

16571660
VALIDATE_INCOMING_OBJECT(object, scriptContext);
16581661
VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext);
@@ -1669,7 +1672,7 @@ CHAKRA_API JsObjectSetProperty(_In_ JsValueRef object, _In_ JsValueRef propertyI
16691672

16701673
Assert(propertyRecord != nullptr);
16711674

1672-
return JsSetPropertyCommon(scriptContext, object, propertyRecord, value, useStrictRules, _actionEntryPopper);
1675+
return JsSetPropertyCommon(scriptContext, object, propertyRecord, value, useStrictRules);
16731676
});
16741677
}
16751678
#endif
@@ -1718,6 +1721,7 @@ CHAKRA_API JsObjectHasProperty(_In_ JsValueRef object, _In_ JsValueRef propertyI
17181721
if (!Js::JavascriptOperators::IsObject(object)) return JsErrorArgumentNotObject;
17191722

17201723
auto internalHasProperty = [&] (Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1724+
PERFORM_JSRT_TTD_RECORD_ACTION_NOT_IMPLEMENTED(scriptContext);
17211725
VALIDATE_INCOMING_OBJECT(object, scriptContext);
17221726
VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext);
17231727
PARAM_NOT_NULL(hasProperty);
@@ -1732,8 +1736,6 @@ CHAKRA_API JsObjectHasProperty(_In_ JsValueRef object, _In_ JsValueRef propertyI
17321736
return errorValue;
17331737
}
17341738

1735-
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTHasProperty, propertyRecord, object);
1736-
17371739
Js::RecyclableObject * instance = Js::RecyclableObject::FromVar(object);
17381740
*hasProperty = Js::JavascriptOperators::HasProperty(instance, propertyRecord->GetPropertyId()) != 0;
17391741

@@ -1760,21 +1762,16 @@ CHAKRA_API JsObjectHasProperty(_In_ JsValueRef object, _In_ JsValueRef propertyI
17601762
#endif
17611763

17621764
static JsErrorCode JsDeletePropertyCommon(Js::ScriptContext * scriptContext, _In_ JsValueRef object,
1763-
_In_ const Js::PropertyRecord * propertyRecord, _In_ bool useStrictRules, _Out_ JsValueRef *result,
1764-
TTDRecorder& _actionEntryPopper)
1765+
_In_ const Js::PropertyRecord * propertyRecord, _In_ bool useStrictRules, _Out_ JsValueRef *result)
17651766
{
17661767
AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!");
1767-
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTDeleteProperty, object,
1768-
propertyRecord, useStrictRules);
17691768

17701769
*result = Js::JavascriptOperators::OP_DeleteProperty((Js::Var)object,
17711770
propertyRecord->GetPropertyId(),
17721771
scriptContext, useStrictRules ? Js::PropertyOperation_StrictMode : Js::PropertyOperation_None);
17731772

17741773
Assert(*result == nullptr || !Js::CrossSite::NeedMarshalVar(*result, scriptContext));
17751774

1776-
PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, result);
1777-
17781775
return JsNoError;
17791776
}
17801777

@@ -1783,14 +1780,19 @@ CHAKRA_API JsDeleteProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propert
17831780
{
17841781
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
17851782
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1783+
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTDeleteProperty, object, (const Js::PropertyRecord *)propertyId, useStrictRules);
17861784

17871785
VALIDATE_INCOMING_OBJECT(object, scriptContext);
17881786
VALIDATE_INCOMING_PROPERTYID(propertyId);
17891787
PARAM_NOT_NULL(result);
17901788
*result = nullptr;
17911789

1792-
return JsDeletePropertyCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId,
1793-
useStrictRules, result, _actionEntryPopper);
1790+
JsErrorCode err = JsDeletePropertyCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId,
1791+
useStrictRules, result);
1792+
1793+
PERFORM_JSRT_TTD_RECORD_ACTION_RESULT(scriptContext, result);
1794+
1795+
return err;
17941796
});
17951797
}
17961798

@@ -1800,6 +1802,7 @@ CHAKRA_API JsObjectDeleteProperty(_In_ JsValueRef object, _In_ JsValueRef proper
18001802
{
18011803
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
18021804
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1805+
PERFORM_JSRT_TTD_RECORD_ACTION_NOT_IMPLEMENTED(scriptContext);
18031806

18041807
VALIDATE_INCOMING_OBJECT(object, scriptContext);
18051808
VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext);
@@ -1818,18 +1821,16 @@ CHAKRA_API JsObjectDeleteProperty(_In_ JsValueRef object, _In_ JsValueRef proper
18181821
Assert(propertyRecord != nullptr);
18191822

18201823
return JsDeletePropertyCommon(scriptContext, object, propertyRecord,
1821-
useStrictRules, result, _actionEntryPopper);
1824+
useStrictRules, result);
18221825
});
18231826
}
18241827
#endif
18251828

18261829
static JsErrorCode JsDefinePropertyCommon(Js::ScriptContext * scriptContext, _In_ JsValueRef object,
18271830
_In_ const Js::PropertyRecord *propertyRecord, _In_ JsValueRef propertyDescriptor,
1828-
_Out_ bool *result, TTDRecorder& _actionEntryPopper)
1831+
_Out_ bool *result)
18291832
{
18301833
AssertMsg(scriptContext->GetThreadContext()->IsScriptActive(), "Caller is expected to be under ContextAPIWrapper!");
1831-
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTDefineProperty, object,
1832-
propertyRecord, propertyDescriptor);
18331834

18341835
Js::PropertyDescriptor propertyDescriptorValue;
18351836
if (!Js::JavascriptOperators::ToPropertyDescriptor(propertyDescriptor, &propertyDescriptorValue, scriptContext))
@@ -1849,6 +1850,7 @@ CHAKRA_API JsDefineProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propert
18491850
{
18501851
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
18511852
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1853+
PERFORM_JSRT_TTD_RECORD_ACTION(scriptContext, RecordJsRTDefineProperty, object, (const Js::PropertyRecord *)propertyId, propertyDescriptor);
18521854

18531855
VALIDATE_INCOMING_OBJECT(object, scriptContext);
18541856
VALIDATE_INCOMING_PROPERTYID(propertyId);
@@ -1857,7 +1859,7 @@ CHAKRA_API JsDefineProperty(_In_ JsValueRef object, _In_ JsPropertyIdRef propert
18571859
*result = false;
18581860

18591861
return JsDefinePropertyCommon(scriptContext, object, (const Js::PropertyRecord *)propertyId,
1860-
propertyDescriptor, result, _actionEntryPopper);
1862+
propertyDescriptor, result);
18611863
});
18621864
}
18631865

@@ -1867,6 +1869,7 @@ CHAKRA_API JsObjectDefineProperty(_In_ JsValueRef object, _In_ JsValueRef proper
18671869
{
18681870
return ContextAPIWrapper<JSRT_MAYBE_TRUE>([&] (Js::ScriptContext *scriptContext,
18691871
TTDRecorder& _actionEntryPopper) -> JsErrorCode {
1872+
PERFORM_JSRT_TTD_RECORD_ACTION_NOT_IMPLEMENTED(scriptContext);
18701873

18711874
VALIDATE_INCOMING_OBJECT(object, scriptContext);
18721875
VALIDATE_INCOMING_RECYCLABLE(propertyId, scriptContext);
@@ -1883,7 +1886,7 @@ CHAKRA_API JsObjectDefineProperty(_In_ JsValueRef object, _In_ JsValueRef proper
18831886
return errorValue;
18841887
}
18851888

1886-
return JsDefinePropertyCommon(scriptContext, object, propertyRecord, propertyDescriptor, result, _actionEntryPopper);
1889+
return JsDefinePropertyCommon(scriptContext, object, propertyRecord, propertyDescriptor, result);
18871890
});
18881891
}
18891892
#endif

0 commit comments

Comments
 (0)