Skip to content

Commit 84bb645

Browse files
committed
Do not type specialize integer computed properties in getters/setters
1 parent 40f36e3 commit 84bb645

File tree

4 files changed

+73
-3
lines changed

4 files changed

+73
-3
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10972,9 +10972,15 @@ GlobOpt::ToTypeSpecIndex(IR::Instr * instr, IR::RegOpnd * indexOpnd, IR::IndirOp
1097210972
{
1097310973
Assert(indirOpnd != nullptr || indexOpnd == instr->GetSrc1());
1097410974

10975+
bool isGetterOrSetter = instr->m_opcode == Js::OpCode::InitGetElemI ||
10976+
instr->m_opcode == Js::OpCode::InitSetElemI ||
10977+
instr->m_opcode == Js::OpCode::InitClassMemberGetComputedName ||
10978+
instr->m_opcode == Js::OpCode::InitClassMemberSetComputedName;
10979+
1097510980
if ((indexOpnd->GetValueType().IsInt()
1097610981
? !IsTypeSpecPhaseOff(func)
10977-
: indexOpnd->GetValueType().IsLikelyInt() && DoAggressiveIntTypeSpec()) && !GetIsAsmJSFunc()) // typespec is disabled for asmjs
10982+
: indexOpnd->GetValueType().IsLikelyInt() && DoAggressiveIntTypeSpec() && !isGetterOrSetter) // typespec is disabled for getters, setters
10983+
&& !GetIsAsmJSFunc()) // typespec is disabled for asmjs
1097810984
{
1097910985
StackSym *const indexVarSym = indexOpnd->m_sym;
1098010986
Value *const indexValue = CurrentBlockData()->FindValue(indexVarSym);

lib/Backend/Lower.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9011,8 +9011,6 @@ Lowerer::LowerStElemI(IR::Instr * instr, Js::PropertyOperationFlags flags, bool
90119011
instr->UnlinkDst();
90129012
instr->UnlinkSrc1();
90139013

9014-
IR::Opnd *indexOpnd = dst->AsIndirOpnd()->UnlinkIndexOpnd();
9015-
90169014
Assert(
90179015
helperMethod == IR::HelperOP_InitElemGetter ||
90189016
helperMethod == IR::HelperOP_InitElemSetter ||
@@ -9023,8 +9021,19 @@ Lowerer::LowerStElemI(IR::Instr * instr, Js::PropertyOperationFlags flags, bool
90239021
helperMethod == IR::HelperOp_InitClassMemberSetComputedName
90249022
);
90259023

9024+
IR::IndirOpnd* dstIndirOpnd = dst->AsIndirOpnd();
9025+
9026+
IR::Opnd *indexOpnd = dstIndirOpnd->UnlinkIndexOpnd();
9027+
90269028
if (indexOpnd && indexOpnd->GetType() != TyVar)
90279029
{
9030+
Assert(
9031+
helperMethod != IR::HelperOP_InitElemGetter &&
9032+
helperMethod != IR::HelperOP_InitElemSetter &&
9033+
helperMethod != IR::HelperOp_InitClassMemberGetComputedName &&
9034+
helperMethod != IR::HelperOp_InitClassMemberSetComputedName
9035+
);
9036+
90289037
if (indexOpnd->GetType() == TyInt32)
90299038
{
90309039
helperMethod =

test/es6/bug_OS16649604.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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+
WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
7+
8+
var tests = [
9+
{
10+
name: "Computed get-set property names",
11+
body: function () {
12+
const n = 1;
13+
const m = 2;
14+
const r = 0.5;
15+
const s = 'prop';
16+
function test2() {
17+
c = class {
18+
get [n]() { return 42; }
19+
set [m](val) { }
20+
get [r]() { return 'a'; }
21+
set [s](val) { }
22+
}
23+
24+
d = {
25+
get [n]() { return 42; },
26+
set [m](val) {},
27+
get [r]() { return 'a'; },
28+
set [s](val) {}
29+
};
30+
}
31+
for (let i = 0; i < 100; ++i) {
32+
test2();
33+
}
34+
35+
assert.areEqual('number', typeof ((new c())[1]), "Integer as class member getter property name");
36+
assert.areEqual('undefined', typeof ((new c())[2]), "Integer as class member setter property name");
37+
assert.areEqual('string', typeof ((new c())[0.5]), "Float as class member getter property name");
38+
assert.areEqual('undefined', typeof ((new c())['prop']), "String as class member setter property name");
39+
40+
assert.areEqual('number', typeof (d[1]), "Integer as getter property name");
41+
assert.areEqual('undefined', typeof (d[2]), "Integer as setter property name");
42+
assert.areEqual('string', typeof (d[0.5]), "Float as getter property name");
43+
assert.areEqual('undefined', typeof (d['prop']), "String as setter property name");
44+
}
45+
},
46+
];
47+
48+
testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });
49+

test/es6/rlexe.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,4 +1480,10 @@
14801480
<baseline>supersetter.baseline</baseline>
14811481
</default>
14821482
</test>
1483+
<test>
1484+
<default>
1485+
<files>bug_OS16649604.js</files>
1486+
<compile-flags>-args summary -endargs</compile-flags>
1487+
</default>
1488+
</test>
14831489
</regress-exe>

0 commit comments

Comments
 (0)