blob: e8f1007bc31efbee47675e356c8c100329a1af1a [file] [log] [blame]
sbarati@apple.comc0722da2015-11-20 02:37:47 +00001function assert(b) {
2 if (!b)
3 throw new Error("Bad assertion")
4}
5noInline(assert);
6
7function foo(a, ...b) {
8 return b;
9}
10noInline(foo);
11
12function bar(a, ...b) {
13 return a + b[0];
14}
15noInline(bar);
16
17function baz(a, ...b) {
18 function capture() { return b; }
19 assert(b[0] === capture()[0]);
20 return a + b[0];
21}
22noInline(baz);
23
24function jaz(a, ...b) {
25 function capture() { return a + b[0]; }
26 assert(capture() === a + b[0]);
27 return a + b[0];
28}
29noInline(jaz);
30
31function kaz(a = 10, ...b) {
32 return a + b[0]
33}
34noInline(kaz);
35
36function raz(a = 10, ...b) {
37 function capture() { return a + b[0]; }
38 assert(capture() === a + b[0]);
39 return a + b[0];
40}
41noInline(raz);
42
43function restLength(a, ...b) {
44 return b.length;
45}
46noInline(restLength);
47
48function testArgumentsObject(...args) {
49 assert(args.length === arguments.length);
50 for (let i = 0; i < args.length; i++)
51 assert(args[i] === arguments[i]);
52}
53noInline(testArgumentsObject);
54
55function strictModeLikeArgumentsObject(a, ...args) {
56 assert(arguments[0] === a);
57 a = "a";
58 assert(arguments[0] !== a);
59 assert(arguments[0] === 20);
60 assert(arguments.length === 2);
61 assert(args.length === 1);
62 assert(arguments[1] === args[0]);
63 arguments[1] = "b";
64 assert(args[0] !== "b");
65}
66noInline(strictModeLikeArgumentsObject);
67
68for (let i = 0; i < 10000; i++) {
69 let a1 = foo(10, 20);
70 assert(a1 instanceof Array);
71 assert(a1.length === 1);
72 assert(a1[0] === 20);
73
74 let a2 = foo(10);
75 assert(a2 instanceof Array);
76 assert(a2.length === 0);
77
78 let a3 = bar(10, 20);
79 assert(a3 === 30);
80
81 let a4 = baz(10, 20);
82 assert(a4 === 30);
83
84 let a5 = jaz("hello", "world");
85 assert(a5 === "helloworld");
86
87 let a6 = kaz(undefined, 40);
88 assert(a6 === 50);
89
90 let a7 = kaz(undefined, 40);
91 assert(a7 === 50);
92
93 assert(restLength() === 0);
94 assert(restLength(1) === 0);
95 assert(restLength(1, 1) === 1);
96 assert(restLength(1, 1, 1) === 2);
97 assert(restLength(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) === 20);
98
99 let obj = {foo: 40};
100 testArgumentsObject("hello", obj, 100, 12.34, "world", obj, [1, 2, 3]);
101
102 strictModeLikeArgumentsObject(20, 30);
103}