[JSC] Do not use asArrayModes() with Structures because it discards TypedArray inform...
[WebKit-https.git] / JSTests / stress / arith-add-on-double-array-with-holes.js
1 let testCases = [
2     // Numbers
3     ['1', NaN, NaN, 2, 2],
4     ['1.5', NaN, NaN, 1 + 1.5, 1 + 1.5],
5     [NaN, NaN, NaN, NaN, NaN],
6
7     // Strings.
8     ['""', NaN, NaN, 1, 1],
9     ['new String()', NaN, NaN, 1, 1],
10     ['"WebKit!"', NaN, NaN, NaN, NaN],
11
12     // Objects.
13     ['{ }', NaN, NaN, NaN, NaN],
14     ['{ foo: 1 }', NaN, NaN, NaN, NaN],
15     ['{ toString: function() { return ""; } }', NaN, NaN, 1, 1],
16     ['{ toString: function() { return "WebKit"; } }', NaN, NaN, NaN, NaN],
17
18     // Others.
19     ['null', NaN, NaN, 1, 1],
20     ['undefined', NaN, NaN, NaN, NaN]
21 ];
22
23 for (let testCase of testCases) {
24     let otherOperand = testCase[0];
25     let expectedLeftValueWithHole = testCase[1];
26     let expectedRightValueWithHole = testCase[2];
27     let expectedLeftValue = testCase[3];
28     let expectedRightValue = testCase[4];
29     eval(
30         `// Those holes are not observable by arithmetic operation.
31         // The return value is always going to be NaN.
32         function nonObservableHoleOnLhs(array, otherValue) {
33             return Math.min(array[0]) + Math.min(otherValue);
34         }
35         noInline(nonObservableHoleOnLhs);
36
37         function observableHoleOnLhs(array, otherValue) {
38             let value = array[0];
39             return [Math.min(value) + Math.min(otherValue), value];
40         }
41         noInline(observableHoleOnLhs);
42
43         function nonObservableHoleOnRhs(array, otherValue) {
44             return Math.min(otherValue) + Math.min(array[0]);
45         }
46         noInline(nonObservableHoleOnRhs);
47
48         function observableHoleOnRhs(array, otherValue) {
49             let value = array[0];
50             return [Math.min(otherValue) + Math.min(value), value];
51         }
52         noInline(observableHoleOnRhs);
53
54         let testArray = new Array;
55         for (let i = 1; i < 3; ++i) {
56             testArray[i] = i + 0.5
57         }
58
59         let isEqual = function(a, b) {
60             if (a === a) {
61                 return a === b;
62             }
63             return b !== b;
64         }
65
66         for (let i = 0; i < 1e4; ++i) {
67             let lhsResult1 = nonObservableHoleOnLhs(testArray, ${otherOperand});
68             if (!isEqual(lhsResult1, ${expectedLeftValueWithHole}))
69                 throw "Error on nonObservableHoleOnLhs at i = " + i + " with operand " + ${otherOperand} + " expected " + ${expectedLeftValueWithHole} + " got " + lhsResult1;
70             let lhsResult2 = observableHoleOnLhs(testArray, ${otherOperand});
71             if (!isEqual(lhsResult2[0], ${expectedLeftValueWithHole}) || lhsResult2[1] !== undefined)
72                 throw "Error on observableHoleOnLhs at i = " + i;
73
74             let rhsResult1 = nonObservableHoleOnRhs(testArray, ${otherOperand});
75             if (!isEqual(rhsResult1, ${expectedRightValueWithHole}))
76                 throw "Error on nonObservableHoleOnRhs at i = " + i + " with operand " + ${otherOperand} + " expected " + ${expectedRightValueWithHole} + " got " + rhsResult1;
77             let rhsResult2 = observableHoleOnRhs(testArray, ${otherOperand});
78             if (!isEqual(rhsResult2[0], ${expectedRightValueWithHole}) || rhsResult2[1] !== undefined)
79                 throw "Error on observableHoleOnRhs at i = " + i;
80         }
81
82         // Fill the hole, make sure everything still work correctly.
83         testArray[0] = 1.;
84         for (let i = 0; i < 1e4; ++i) {
85             let lhsResult1 = nonObservableHoleOnLhs(testArray, ${otherOperand});
86             if (!isEqual(lhsResult1, ${expectedLeftValue}))
87                 throw "Error on non hole nonObservableHoleOnLhs at i = " + i + " expected " + ${expectedLeftValue} + " got " + lhsResult1;
88             let lhsResult2 = observableHoleOnLhs(testArray, ${otherOperand});
89             if (!isEqual(lhsResult2[0], ${expectedLeftValue}) || lhsResult2[1] !== 1)
90                 throw "Error on non hole observableHoleOnLhs at i = " + i + " expected " + ${expectedLeftValue} + " got " + lhsResult2[0];
91
92             let rhsResult1 = nonObservableHoleOnRhs(testArray, ${otherOperand});
93             if (!isEqual(rhsResult1, ${expectedRightValue}))
94                 throw "Error on non hole nonObservableHoleOnRhs at i = " + i + " with operand " + ${otherOperand} + " expected " + ${expectedRightValue} + " got " + rhsResult1;
95             let rhsResult2 = observableHoleOnRhs(testArray, ${otherOperand});
96             if (!isEqual(rhsResult2[0], ${expectedRightValue}) || rhsResult2[1] !== 1)
97                 throw "Error on non hole observableHoleOnRhs at i = " + i;
98         }`
99     );
100 }