Skip to content

Commit 3c0a6a1

Browse files
committed
Bail out when either operand is not number for float type specialization
1 parent 3321ead commit 3c0a6a1

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10643,6 +10643,18 @@ GlobOpt::TypeSpecializeFloatBinary(IR::Instr *instr, Value *src1Val, Value *src2
1064310643
case Js::OpCode::CmSrEq_A:
1064410644
case Js::OpCode::CmNeq_A:
1064510645
case Js::OpCode::CmSrNeq_A:
10646+
{
10647+
if (src1Val->GetValueInfo()->IsNotNumber() || src2Val->GetValueInfo()->IsNotNumber())
10648+
{
10649+
return false;
10650+
}
10651+
10652+
allowUndefinedOrNullSrc1 = false;
10653+
allowUndefinedOrNullSrc2 = false;
10654+
convertDstToBool = true;
10655+
break;
10656+
}
10657+
1064610658
case Js::OpCode::CmLe_A:
1064710659
case Js::OpCode::CmLt_A:
1064810660
case Js::OpCode::CmGe_A:

test/Basics/FloatComparison.js

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,76 @@ var tests = [
8080
}
8181
test0();
8282
}
83-
}
83+
},
84+
{
85+
name: "Bail out on not number, #1",
86+
body: function() {
87+
var f32 = new Float32Array(256);
88+
assert.isTrue(f32[1] !== (typeof 1 != 'number'));
89+
}
90+
},
91+
{
92+
name: "Bail out on not number, #2",
93+
body: function() {
94+
var obj0 = {};
95+
var obj1 = {};
96+
var func3 = function () {
97+
ary = [];
98+
test = function (list1, list2) {
99+
return list1.splice.apply(list1, [
100+
a,
101+
0
102+
].concat(list2));
103+
};
104+
test(ary, c === a);
105+
};
106+
var func4 = function () {
107+
return func3();
108+
};
109+
obj1.method1 = func4;
110+
var c = -0;
111+
a = obj0 === 1;
112+
var __loopvar2 = 0;
113+
do {
114+
if (__loopvar2 > 7) {
115+
break;
116+
}
117+
__loopvar2 += 2;
118+
obj1.method1();
119+
} while (obj0);
120+
121+
assert.areEqual(ary, [false]);
122+
}
123+
},
124+
{
125+
name: "Bail out on not number, #3",
126+
body: function() {
127+
function test0() {
128+
var GiantPrintArray = [];
129+
var obj1 = {};
130+
var f64 = new Float64Array(1);
131+
function _callback1tmp() {
132+
return function () {
133+
function v0(arg0, arg1, arg2) {
134+
this.v3 = arg2;
135+
}
136+
function v4() {
137+
var v5 = new v0(test0, test0, obj1 <= 1 !== f64[obj1.prop0 & 1]);
138+
GiantPrintArray.push(v5.v3);
139+
}
140+
v4();
141+
v4();
142+
v4();
143+
};
144+
}
145+
_callback1tmp()();
146+
return GiantPrintArray;
147+
}
148+
assert.areEqual(test0(), [true, true, true]);
149+
assert.areEqual(test0(), [true, true, true]);
150+
assert.areEqual(test0(), [true, true, true]);
151+
}
152+
},
84153
];
85154

86155
testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });

0 commit comments

Comments
 (0)