[JSC] AI should not propagate AbstractValue relying on constant folding phase
[WebKit-https.git] / JSTests / stress / array-slice-osr-exit-2.js
1 function assert(b, ...m) {
2     if (!b)
3         throw new Error("Bad: ", ...m)
4 }
5 noInline(assert);
6
7 class Foo extends Array {
8     constructor(...args) {
9         super(...args);
10     }
11 };
12 function shallowEq(a, b) {
13     assert(a.length === b.length, a, b);
14     for (let i = 0; i < a.length; i++)
15         assert(a[i] === b[i], a, b);
16 }
17 noInline(shallowEq);
18
19 let tests = [
20     [[1,2,3,4,5], [1,2,3,4,5], 0, 5],
21     [[1,2,3,4,5], [1,2,3,4,5], 0],
22     [[1,2,3,4,5], [4], -2, -1],
23     [[1,2,3,4,5], [5], -1],
24     [[1,2,3,4,5], [5], -1, 5],
25     [[1,2,3,4,5], [], -10, -20],
26     [[1,2,3,4,5], [], -20, -10],
27     [[1,2,3,4,5], [], 6, 4],
28     [[1,2,3,4,5], [], 3, 2],
29     [[1,2,3,4,5], [4,5], 3, 10],
30     [[1,2,3,4,5], [3,4,5], 2, 10],
31     [[1,2,3,4,5], [1,2,3,4,5], -10, 10],
32     [[1,2,3,4,5], [1,2,3,4,5], -5, 10],
33     [[1,2,3,4,5], [2,3,4,5], -4, 10],
34 ];
35
36 function runTest1(a, b) {
37     let result = a.slice(b);
38     assert(a instanceof Foo === result instanceof Foo);
39     return result;
40 }
41 noInline(runTest1);
42
43 function runTest2(a, b, c) {
44     let result = a.slice(b, c);
45     assert(a instanceof Foo === result instanceof Foo);
46     return result;
47 }
48 noInline(runTest2);
49
50 function addRandomProperties(input) {
51     for (let i = 0; i < 4; i++) {
52         input["prop" + i + ((Math.random() * 100000) | 0)] = i;
53     }
54 }
55 noInline(addRandomProperties);
56
57 function runTests() {
58     for (let i = 0; i < 10000; i++) {
59         for (let [input, output, ...args] of tests) {
60             addRandomProperties(input);
61             assert(args.length === 1 || args.length === 2);
62             if (args.length === 1)
63                 shallowEq(runTest1(input, args[0]), output);
64             else
65                 shallowEq(runTest2(input, args[0], args[1]), output);
66         }
67     }
68 }
69
70 runTests();
71
72 tests.push([new Foo(1,2,3,4,5), [1,2,3,4,5], -10, 10]);
73 tests.push([new Foo(1,2,3,4,5), [1,2,3,4,5], -5, 10]);
74 tests.push([new Foo(1,2,3,4,5), [2,3,4,5], -4, 10]);
75 tests.push([new Foo(1,2,3,4,5), [2,3,4,5], -4]);
76 runTests();