OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --harmony-default-parameters --harmony-arrow-functions | 5 // Flags: --harmony-default-parameters --harmony-arrow-functions |
6 // Flags: --harmony-rest-parameters --harmony-destructuring | 6 // Flags: --harmony-rest-parameters --harmony-destructuring |
7 | 7 |
8 | 8 |
9 (function TestDefaults() { | 9 (function TestDefaults() { |
10 function f1(x = 1) { return x } | 10 function f1(x = 1) { return x } |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 | 74 |
75 | 75 |
76 (function TestEvalInParameters() { | 76 (function TestEvalInParameters() { |
77 function f1(x = eval(0)) { return x } | 77 function f1(x = eval(0)) { return x } |
78 assertEquals(0, f1()); | 78 assertEquals(0, f1()); |
79 function f2(x = () => eval(1)) { return x() } | 79 function f2(x = () => eval(1)) { return x() } |
80 assertEquals(1, f2()); | 80 assertEquals(1, f2()); |
81 })(); | 81 })(); |
82 | 82 |
83 | 83 |
84 (function TestParameterScoping() { | 84 (function TestParameterScopingSloppy() { |
85 var x = 1; | 85 var x = 1; |
86 | 86 |
87 function f1(a = x) { var x = 2; return a; } | 87 function f1(a = x) { var x = 2; return a; } |
88 assertEquals(1, f1()); | 88 assertEquals(1, f1()); |
89 function f2(a = x) { function x() {}; return a; } | 89 function f2(a = x) { function x() {}; return a; } |
90 assertEquals(1, f2()); | 90 assertEquals(1, f2()); |
91 function f3(a = x) { 'use strict'; let x = 2; return a; } | 91 function f3(a = eval("x")) { var x; return a; } |
92 assertEquals(1, f3()); | 92 assertEquals(1, f3()); |
93 function f4(a = x) { 'use strict'; const x = 2; return a; } | 93 function f31(a = eval("'use strict'; x")) { var x; return a; } |
| 94 assertEquals(1, f31()); |
| 95 function f4(a = function() { return x }) { var x; return a(); } |
94 assertEquals(1, f4()); | 96 assertEquals(1, f4()); |
95 function f5(a = x) { 'use strict'; function x() {}; return a; } | 97 function f5(a = () => x) { var x; return a(); } |
96 assertEquals(1, f5()); | 98 assertEquals(1, f5()); |
97 function f6(a = eval("x")) { var x; return a; } | 99 function f6(a = () => eval("x")) { var x; return a(); } |
98 assertEquals(1, f6()); | 100 assertEquals(1, f6()); |
99 function f61(a = eval("x")) { 'use strict'; var x; return a; } | 101 function f61(a = () => { 'use strict'; return eval("x") }) { var x; return a()
; } |
100 assertEquals(1, f61()); | 102 assertEquals(1, f61()); |
101 function f62(a = eval("'use strict'; x")) { var x; return a; } | 103 function f62(a = () => eval("'use strict'; x")) { var x; return a(); } |
102 assertEquals(1, f62()); | 104 assertEquals(1, f62()); |
103 function f7(a = function() { return x }) { var x; return a(); } | |
104 assertEquals(1, f7()); | |
105 function f8(a = () => x) { var x; return a(); } | |
106 assertEquals(1, f8()); | |
107 function f9(a = () => eval("x")) { var x; return a(); } | |
108 assertEquals(1, f9()); | |
109 function f91(a = () => eval("x")) { 'use strict'; var x; return a(); } | |
110 assertEquals(1, f91()); | |
111 function f92(a = () => { 'use strict'; return eval("x") }) { var x; return a()
; } | |
112 assertEquals(1, f92()); | |
113 function f93(a = () => eval("'use strict'; x")) { var x; return a(); } | |
114 assertEquals(1, f93()); | |
115 | 105 |
116 var g1 = (a = x) => { var x = 2; return a; }; | 106 var g1 = (a = x) => { var x = 2; return a; }; |
117 assertEquals(1, g1()); | 107 assertEquals(1, g1()); |
118 var g2 = (a = x) => { function x() {}; return a; }; | 108 var g2 = (a = x) => { function x() {}; return a; }; |
119 assertEquals(1, g2()); | 109 assertEquals(1, g2()); |
120 var g3 = (a = x) => { 'use strict'; let x = 2; return a; }; | 110 var g3 = (a = eval("x")) => { var x; return a; }; |
121 assertEquals(1, g3()); | 111 assertEquals(1, g3()); |
122 var g4 = (a = x) => { 'use strict'; const x = 2; return a; }; | 112 var g31 = (a = eval("'use strict'; x")) => { var x; return a; }; |
| 113 assertEquals(1, g31()); |
| 114 var g4 = (a = function() { return x }) => { var x; return a(); }; |
123 assertEquals(1, g4()); | 115 assertEquals(1, g4()); |
124 var g5 = (a = x) => { 'use strict'; function x() {}; return a; }; | 116 var g5 = (a = () => x) => { var x; return a(); }; |
125 assertEquals(1, g5()); | 117 assertEquals(1, g5()); |
126 var g6 = (a = eval("x")) => { var x; return a; }; | 118 var g6 = (a = () => eval("x")) => { var x; return a(); }; |
127 assertEquals(1, g6()); | 119 assertEquals(1, g6()); |
128 var g61 = (a = eval("x")) => { 'use strict'; var x; return a; }; | 120 var g61 = (a = () => { 'use strict'; return eval("x") }) => { var x; return a(
); }; |
129 assertEquals(1, g61()); | 121 assertEquals(1, g61()); |
130 var g62 = (a = eval("'use strict'; x")) => { var x; return a; }; | 122 var g62 = (a = () => eval("'use strict'; x")) => { var x; return a(); }; |
131 assertEquals(1, g62()); | 123 assertEquals(1, g62()); |
132 var g7 = (a = function() { return x }) => { var x; return a(); }; | |
133 assertEquals(1, g7()); | |
134 var g8 = (a = () => x) => { var x; return a(); }; | |
135 assertEquals(1, g8()); | |
136 var g9 = (a = () => eval("x")) => { var x; return a(); }; | |
137 assertEquals(1, g9()); | |
138 var g91 = (a = () => eval("x")) => { 'use strict'; var x; return a(); }; | |
139 assertEquals(1, g91()); | |
140 var g92 = (a = () => { 'use strict'; return eval("x") }) => { var x; return a(
); }; | |
141 assertEquals(1, g92()); | |
142 var g93 = (a = () => eval("'use strict'; x")) => { var x; return a(); }; | |
143 assertEquals(1, g93()); | |
144 | 124 |
145 var f11 = function f(x = f) { var f; return x; } | 125 var f11 = function f(x = f) { var f; return x; } |
146 assertSame(f11, f11()); | 126 assertSame(f11, f11()); |
147 var f12 = function f(x = f) { function f() {}; return x; } | 127 var f12 = function f(x = f) { function f() {}; return x; } |
148 assertSame(f12, f12()); | 128 assertSame(f12, f12()); |
149 var f13 = function f(x = f) { 'use strict'; let f; return x; } | 129 var f13 = function f(f = 7, x = f) { return x; } |
150 assertSame(f13, f13()); | 130 assertSame(7, f13()); |
151 var f14 = function f(x = f) { 'use strict'; const f = 0; return x; } | |
152 assertSame(f14, f14()); | |
153 var f15 = function f(x = f) { 'use strict'; function f() {}; return x; } | |
154 assertSame(f15, f15()); | |
155 var f16 = function f(f = 7, x = f) { return x; } | |
156 assertSame(7, f16()); | |
157 | 131 |
158 var o1 = {f: function(x = this) { return x; }}; | 132 var o1 = {f: function(x = this) { return x; }}; |
159 assertSame(o1, o1.f()); | 133 assertSame(o1, o1.f()); |
160 assertSame(1, o1.f(1)); | 134 assertSame(1, o1.f(1)); |
161 })(); | 135 })(); |
162 | 136 |
| 137 (function TestParameterScopingStrict() { |
| 138 "use strict"; |
| 139 var x = 1; |
| 140 |
| 141 function f1(a = x) { let x = 2; return a; } |
| 142 assertEquals(1, f1()); |
| 143 function f2(a = x) { const x = 2; return a; } |
| 144 assertEquals(1, f2()); |
| 145 function f3(a = x) { function x() {}; return a; } |
| 146 assertEquals(1, f3()); |
| 147 function f4(a = eval("x")) { var x; return a; } |
| 148 assertEquals(1, f4()); |
| 149 function f5(a = () => eval("x")) { var x; return a(); } |
| 150 assertEquals(1, f5()); |
| 151 |
| 152 var g1 = (a = x) => { let x = 2; return a; }; |
| 153 assertEquals(1, g1()); |
| 154 var g2 = (a = x) => { const x = 2; return a; }; |
| 155 assertEquals(1, g2()); |
| 156 var g3 = (a = x) => { function x() {}; return a; }; |
| 157 assertEquals(1, g3()); |
| 158 var g4 = (a = eval("x")) => { var x; return a; }; |
| 159 assertEquals(1, g4()); |
| 160 var g5 = (a = () => eval("x")) => { var x; return a(); }; |
| 161 assertEquals(1, g5()); |
| 162 |
| 163 var f11 = function f(x = f) { let f; return x; } |
| 164 assertSame(f11, f11()); |
| 165 var f12 = function f(x = f) { const f = 0; return x; } |
| 166 assertSame(f12, f12()); |
| 167 var f13 = function f(x = f) { function f() {}; return x; } |
| 168 assertSame(f13, f13()); |
| 169 })(); |
163 | 170 |
164 (function TestSloppyEvalScoping() { | 171 (function TestSloppyEvalScoping() { |
165 var x = 1; | 172 var x = 1; |
166 | 173 |
167 function f1(y = eval("var x = 2")) { with ({}) { return x; } } | 174 function f1(y = eval("var x = 2")) { with ({}) { return x; } } |
168 assertEquals(1, f1()); | 175 assertEquals(1, f1()); |
169 function f2(y = eval("var x = 2"), z = x) { return z; } | 176 function f2(y = eval("var x = 2"), z = x) { return z; } |
170 assertEquals(1, f2()); | 177 assertEquals(1, f2()); |
171 assertEquals(1, f2(0)); | 178 assertEquals(1, f2(0)); |
172 function f3(y = eval("var x = 2"), z = eval("x")) { return z; } | 179 function f3(y = eval("var x = 2"), z = eval("x")) { return z; } |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 assertThrows(f13, ReferenceError); | 286 assertThrows(f13, ReferenceError); |
280 | 287 |
281 function f21(f = () => x) { eval("var x = 2"); return f() } | 288 function f21(f = () => x) { eval("var x = 2"); return f() } |
282 assertEquals(1, f21()); | 289 assertEquals(1, f21()); |
283 assertEquals(3, f21(() => 3)); | 290 assertEquals(3, f21(() => 3)); |
284 function f22(f = () => eval("x")) { eval("var x = 2"); return f() } | 291 function f22(f = () => eval("x")) { eval("var x = 2"); return f() } |
285 assertEquals(1, f22()); | 292 assertEquals(1, f22()); |
286 assertEquals(3, f22(() => 3)); | 293 assertEquals(3, f22(() => 3)); |
287 })(); | 294 })(); |
288 | 295 |
289 | 296 (function TestParameterTDZSloppy() { |
290 (function TestParameterTDZ() { | |
291 function f1(a = x, x) { return a } | 297 function f1(a = x, x) { return a } |
292 assertThrows(() => f1(undefined, 4), ReferenceError); | 298 assertThrows(() => f1(undefined, 4), ReferenceError); |
293 assertEquals(4, f1(4, 5)); | 299 assertEquals(4, f1(4, 5)); |
294 function f2(a = eval("x"), x) { return a } | 300 function f2(a = eval("x"), x) { return a } |
295 assertThrows(() => f2(undefined, 4), ReferenceError); | 301 assertThrows(() => f2(undefined, 4), ReferenceError); |
296 assertEquals(4, f2(4, 5)); | 302 assertEquals(4, f2(4, 5)); |
297 function f3(a = eval("x"), x) { 'use strict'; return a } | 303 function f3(a = eval("'use strict'; x"), x) { return a } |
298 assertThrows(() => f3(undefined, 4), ReferenceError); | 304 assertThrows(() => f3(undefined, 4), ReferenceError); |
299 assertEquals(4, f3(4, 5)); | 305 assertEquals(4, f3(4, 5)); |
300 function f4(a = eval("'use strict'; x"), x) { return a } | 306 function f4(a = () => x, x) { return a() } |
301 assertThrows(() => f4(undefined, 4), ReferenceError); | 307 assertEquals(4, f4(() => 4, 5)); |
302 assertEquals(4, f4(4, 5)); | 308 function f5(a = () => eval("x"), x) { return a() } |
303 | |
304 function f5(a = () => x, x) { return a() } | |
305 assertEquals(4, f5(() => 4, 5)); | 309 assertEquals(4, f5(() => 4, 5)); |
306 function f6(a = () => eval("x"), x) { return a() } | 310 function f6(a = () => eval("'use strict'; x"), x) { return a() } |
307 assertEquals(4, f6(() => 4, 5)); | 311 assertEquals(4, f6(() => 4, 5)); |
308 function f7(a = () => eval("x"), x) { 'use strict'; return a() } | |
309 assertEquals(4, f7(() => 4, 5)); | |
310 function f8(a = () => eval("'use strict'; x"), x) { return a() } | |
311 assertEquals(4, f8(() => 4, 5)); | |
312 | 312 |
313 function f11(a = x, x = 2) { return a } | 313 function f11(a = x, x = 2) { return a } |
314 assertThrows(() => f11(), ReferenceError); | 314 assertThrows(() => f11(), ReferenceError); |
315 assertThrows(() => f11(undefined), ReferenceError); | 315 assertThrows(() => f11(undefined), ReferenceError); |
316 assertThrows(() => f11(undefined, 4), ReferenceError); | 316 assertThrows(() => f11(undefined, 4), ReferenceError); |
317 assertEquals(4, f1(4, 5)); | 317 assertEquals(4, f1(4, 5)); |
318 function f12(a = eval("x"), x = 2) { return a } | 318 function f12(a = eval("x"), x = 2) { return a } |
319 assertThrows(() => f12(), ReferenceError); | 319 assertThrows(() => f12(), ReferenceError); |
320 assertThrows(() => f12(undefined), ReferenceError); | 320 assertThrows(() => f12(undefined), ReferenceError); |
321 assertThrows(() => f12(undefined, 4), ReferenceError); | 321 assertThrows(() => f12(undefined, 4), ReferenceError); |
322 assertEquals(4, f12(4, 5)); | 322 assertEquals(4, f12(4, 5)); |
323 function f13(a = eval("x"), x = 2) { 'use strict'; return a } | 323 function f13(a = eval("'use strict'; x"), x = 2) { return a } |
324 assertThrows(() => f13(), ReferenceError); | 324 assertThrows(() => f13(), ReferenceError); |
325 assertThrows(() => f13(undefined), ReferenceError); | 325 assertThrows(() => f13(undefined), ReferenceError); |
326 assertThrows(() => f13(undefined, 4), ReferenceError); | 326 assertThrows(() => f13(undefined, 4), ReferenceError); |
327 assertEquals(4, f13(4, 5)); | 327 assertEquals(4, f13(4, 5)); |
328 function f14(a = eval("'use strict'; x"), x = 2) { return a } | |
329 assertThrows(() => f14(), ReferenceError); | |
330 assertThrows(() => f14(undefined), ReferenceError); | |
331 assertThrows(() => f14(undefined, 4), ReferenceError); | |
332 assertEquals(4, f14(4, 5)); | |
333 | 328 |
334 function f34(x = function() { return a }, ...a) { return x()[0] } | 329 function f21(x = function() { return a }, ...a) { return x()[0] } |
335 assertEquals(4, f34(undefined, 4)); | 330 assertEquals(4, f21(undefined, 4)); |
336 function f35(x = () => a, ...a) { return x()[0] } | 331 function f22(x = () => a, ...a) { return x()[0] } |
337 assertEquals(4, f35(undefined, 4)); | 332 assertEquals(4, f22(undefined, 4)); |
338 function f36(x = () => eval("a"), ...a) { return x()[0] } | 333 function f23(x = () => eval("a"), ...a) { return x()[0] } |
339 assertEquals(4, f36(undefined, 4)); | 334 assertEquals(4, f23(undefined, 4)); |
340 function f37(x = () => eval("a"), ...a) { 'use strict'; return x()[0] } | 335 function f24(x = () => {'use strict'; return eval("a") }, ...a) { |
341 assertEquals(4, f37(undefined, 4)); | 336 return x()[0] |
342 function f38(x = () => { 'use strict'; return eval("a") }, ...a) { return x()[
0] } | 337 } |
343 assertEquals(4, f38(undefined, 4)); | 338 assertEquals(4, f24(undefined, 4)); |
344 function f39(x = () => eval("'use strict'; a"), ...a) { return x()[0] } | 339 function f25(x = () => eval("'use strict'; a"), ...a) { return x()[0] } |
345 assertEquals(4, f39(undefined, 4)); | 340 assertEquals(4, f25(undefined, 4)); |
346 | 341 |
347 var g34 = (x = function() { return a }, ...a) => { return x()[0] }; | 342 var g1 = (x = function() { return a }, ...a) => { return x()[0] }; |
348 assertEquals(4, g34(undefined, 4)); | 343 assertEquals(4, g1(undefined, 4)); |
349 var g35 = (x = () => a, ...a) => { return x()[0] }; | 344 var g2 = (x = () => a, ...a) => { return x()[0] }; |
350 assertEquals(4, g35(undefined, 4)); | 345 assertEquals(4, g2(undefined, 4)); |
351 })(); | 346 })(); |
352 | 347 |
| 348 (function TestParameterTDZStrict() { |
| 349 "use strict"; |
| 350 |
| 351 function f1(a = eval("x"), x) { return a } |
| 352 assertThrows(() => f1(undefined, 4), ReferenceError); |
| 353 assertEquals(4, f1(4, 5)); |
| 354 function f2(a = () => eval("x"), x) { return a() } |
| 355 assertEquals(4, f2(() => 4, 5)); |
| 356 |
| 357 function f11(a = eval("x"), x = 2) { return a } |
| 358 assertThrows(() => f11(), ReferenceError); |
| 359 assertThrows(() => f11(undefined), ReferenceError); |
| 360 assertThrows(() => f11(undefined, 4), ReferenceError); |
| 361 assertEquals(4, f11(4, 5)); |
| 362 |
| 363 function f21(x = () => eval("a"), ...a) { return x()[0] } |
| 364 assertEquals(4, f21(undefined, 4)); |
| 365 })(); |
353 | 366 |
354 (function TestArgumentsForNonSimpleParameters() { | 367 (function TestArgumentsForNonSimpleParameters() { |
355 function f1(x = 900) { arguments[0] = 1; return x } | 368 function f1(x = 900) { arguments[0] = 1; return x } |
356 assertEquals(9, f1(9)); | 369 assertEquals(9, f1(9)); |
357 assertEquals(900, f1()); | 370 assertEquals(900, f1()); |
358 function f2(x = 1001) { x = 2; return arguments[0] } | 371 function f2(x = 1001) { x = 2; return arguments[0] } |
359 assertEquals(10, f2(10)); | 372 assertEquals(10, f2(10)); |
360 assertEquals(undefined, f2()); | 373 assertEquals(undefined, f2()); |
361 }()); | 374 }()); |
362 | 375 |
363 | 376 |
364 (function TestFunctionLength() { | 377 (function TestFunctionLength() { |
365 // TODO(rossberg): Fix arity. | 378 // TODO(rossberg): Fix arity. |
366 // assertEquals(0, (function(x = 1) {}).length); | 379 // assertEquals(0, (function(x = 1) {}).length); |
367 // assertEquals(0, (function(x = 1, ...a) {}).length); | 380 // assertEquals(0, (function(x = 1, ...a) {}).length); |
368 // assertEquals(1, (function(x, y = 1) {}).length); | 381 // assertEquals(1, (function(x, y = 1) {}).length); |
369 // assertEquals(1, (function(x, y = 1, ...a) {}).length); | 382 // assertEquals(1, (function(x, y = 1, ...a) {}).length); |
370 // assertEquals(2, (function(x, y, z = 1) {}).length); | 383 // assertEquals(2, (function(x, y, z = 1) {}).length); |
371 // assertEquals(2, (function(x, y, z = 1, ...a) {}).length); | 384 // assertEquals(2, (function(x, y, z = 1, ...a) {}).length); |
372 // assertEquals(1, (function(x, y = 1, z) {}).length); | 385 // assertEquals(1, (function(x, y = 1, z) {}).length); |
373 // assertEquals(1, (function(x, y = 1, z, ...a) {}).length); | 386 // assertEquals(1, (function(x, y = 1, z, ...a) {}).length); |
374 // assertEquals(1, (function(x, y = 1, z, v = 2) {}).length); | 387 // assertEquals(1, (function(x, y = 1, z, v = 2) {}).length); |
375 // assertEquals(1, (function(x, y = 1, z, v = 2, ...a) {}).length); | 388 // assertEquals(1, (function(x, y = 1, z, v = 2, ...a) {}).length); |
376 })(); | 389 })(); |
| 390 |
| 391 (function TestDirectiveThrows() { |
| 392 "use strict"; |
| 393 |
| 394 assertThrows(function(){ eval("function(x=1){'use strict';}") }, SyntaxError); |
| 395 assertThrows(function(){ eval("(x=1) => {'use strict';}") }, SyntaxError); |
| 396 assertThrows( |
| 397 function(){ eval("(class{foo(x=1) {'use strict';}});") }, SyntaxError); |
| 398 |
| 399 assertThrows( |
| 400 function(){ eval("function(a, x=1){'use strict';}") }, SyntaxError); |
| 401 assertThrows(function(){ eval("(a, x=1) => {'use strict';}") }, SyntaxError); |
| 402 assertThrows( |
| 403 function(){ eval("(class{foo(a, x=1) {'use strict';}});") }, SyntaxError); |
| 404 })(); |
OLD | NEW |