Skip to content

Commit 2353319

Browse files
committed
[MERGE #5411 @pleath] OS#16092623: When we have an accessor cache hit on a setter, we still need to check for exception conditions such as undefined setter in strict mode
Merge pull request #5411 from pleath:16092623
2 parents b9f60df + 4d0681a commit 2353319

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

lib/Runtime/Language/InlineCache.inl

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,12 @@ namespace Js
340340
}
341341

342342
Assert(setterValue == nullptr || setterValue == function);
343-
Js::JavascriptOperators::CallSetter(function, object, propertyValue, requestContext);
343+
344+
if (!JavascriptError::ThrowIfStrictModeUndefinedSetter(propertyOperationFlags, function, requestContext) &&
345+
!JavascriptError::ThrowIfNotExtensibleUndefinedSetter(propertyOperationFlags, function, requestContext))
346+
{
347+
Js::JavascriptOperators::CallSetter(function, object, propertyValue, requestContext);
348+
}
344349

345350
if (ReturnOperationInfo)
346351
{
@@ -366,7 +371,12 @@ namespace Js
366371
}
367372

368373
Assert(setterValue == nullptr || setterValue == function);
369-
Js::JavascriptOperators::CallSetter(function, object, propertyValue, requestContext);
374+
375+
if (!JavascriptError::ThrowIfStrictModeUndefinedSetter(propertyOperationFlags, function, requestContext) &&
376+
!JavascriptError::ThrowIfNotExtensibleUndefinedSetter(propertyOperationFlags, function, requestContext))
377+
{
378+
Js::JavascriptOperators::CallSetter(function, object, propertyValue, requestContext);
379+
}
370380

371381
if (ReturnOperationInfo)
372382
{

test/es5/rlexe.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,4 +362,9 @@
362362
<files>es5_defineProperty_arrayLength.js</files>
363363
</default>
364364
</test>
365+
<test>
366+
<default>
367+
<files>strictdefaultsetter.js</files>
368+
</default>
369+
</test>
365370
</regress-exe>

test/es5/strictdefaultsetter.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//-------------------------------------------------------------------------------------------------------
2+
// Copyright (C) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4+
//-------------------------------------------------------------------------------------------------------
5+
6+
'use strict';
7+
8+
function f(o) {
9+
o.x = 'me';
10+
}
11+
12+
var o1 = { set x(v) { val = v; } };
13+
var o2 = { get x() { WScript.Echo('get') } };
14+
15+
var val = 'you';
16+
f(o1);
17+
if (val !== 'me') WScript.Echo('fail 1');
18+
val = 'you';
19+
f(o1);
20+
if (val !== 'me') WScript.Echo('fail 2');
21+
try {
22+
f(o2);
23+
}
24+
catch(e) {
25+
val = e;
26+
}
27+
if (val.toString() === 'TypeError: Assignment to read-only properties is not allowed in strict mode')
28+
WScript.Echo('pass');
29+
else
30+
WScript.Echo('fail 3');
31+

0 commit comments

Comments
 (0)