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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 assertThrows(f13, ReferenceError); | 342 assertThrows(f13, ReferenceError); |
336 | 343 |
337 function f21(f = () => x) { eval("var x = 2"); return f() } | 344 function f21(f = () => x) { eval("var x = 2"); return f() } |
338 assertEquals(1, f21()); | 345 assertEquals(1, f21()); |
339 assertEquals(3, f21(() => 3)); | 346 assertEquals(3, f21(() => 3)); |
340 function f22(f = () => eval("x")) { eval("var x = 2"); return f() } | 347 function f22(f = () => eval("x")) { eval("var x = 2"); return f() } |
341 assertEquals(1, f22()); | 348 assertEquals(1, f22()); |
342 assertEquals(3, f22(() => 3)); | 349 assertEquals(3, f22(() => 3)); |
343 })(); | 350 })(); |
344 | 351 |
345 | 352 (function TestParameterTDZSloppy() { |
346 (function TestParameterTDZ() { | |
347 function f1(a = x, x) { return a } | 353 function f1(a = x, x) { return a } |
348 assertThrows(() => f1(undefined, 4), ReferenceError); | 354 assertThrows(() => f1(undefined, 4), ReferenceError); |
349 assertEquals(4, f1(4, 5)); | 355 assertEquals(4, f1(4, 5)); |
350 function f2(a = eval("x"), x) { return a } | 356 function f2(a = eval("x"), x) { return a } |
351 assertThrows(() => f2(undefined, 4), ReferenceError); | 357 assertThrows(() => f2(undefined, 4), ReferenceError); |
352 assertEquals(4, f2(4, 5)); | 358 assertEquals(4, f2(4, 5)); |
353 function f3(a = eval("x"), x) { 'use strict'; return a } | 359 function f3(a = eval("'use strict'; x"), x) { return a } |
354 assertThrows(() => f3(undefined, 4), ReferenceError); | 360 assertThrows(() => f3(undefined, 4), ReferenceError); |
355 assertEquals(4, f3(4, 5)); | 361 assertEquals(4, f3(4, 5)); |
356 function f4(a = eval("'use strict'; x"), x) { return a } | 362 function f4(a = () => x, x) { return a() } |
357 assertThrows(() => f4(undefined, 4), ReferenceError); | 363 assertEquals(4, f4(() => 4, 5)); |
358 assertEquals(4, f4(4, 5)); | 364 function f5(a = () => eval("x"), x) { return a() } |
359 | |
360 function f5(a = () => x, x) { return a() } | |
361 assertEquals(4, f5(() => 4, 5)); | 365 assertEquals(4, f5(() => 4, 5)); |
362 function f6(a = () => eval("x"), x) { return a() } | 366 function f6(a = () => eval("'use strict'; x"), x) { return a() } |
363 assertEquals(4, f6(() => 4, 5)); | 367 assertEquals(4, f6(() => 4, 5)); |
364 function f7(a = () => eval("x"), x) { 'use strict'; return a() } | |
365 assertEquals(4, f7(() => 4, 5)); | |
366 function f8(a = () => eval("'use strict'; x"), x) { return a() } | |
367 assertEquals(4, f8(() => 4, 5)); | |
368 | 368 |
369 function f11(a = x, x = 2) { return a } | 369 function f11(a = x, x = 2) { return a } |
370 assertThrows(() => f11(), ReferenceError); | 370 assertThrows(() => f11(), ReferenceError); |
371 assertThrows(() => f11(undefined), ReferenceError); | 371 assertThrows(() => f11(undefined), ReferenceError); |
372 assertThrows(() => f11(undefined, 4), ReferenceError); | 372 assertThrows(() => f11(undefined, 4), ReferenceError); |
373 assertEquals(4, f1(4, 5)); | 373 assertEquals(4, f1(4, 5)); |
374 function f12(a = eval("x"), x = 2) { return a } | 374 function f12(a = eval("x"), x = 2) { return a } |
375 assertThrows(() => f12(), ReferenceError); | 375 assertThrows(() => f12(), ReferenceError); |
376 assertThrows(() => f12(undefined), ReferenceError); | 376 assertThrows(() => f12(undefined), ReferenceError); |
377 assertThrows(() => f12(undefined, 4), ReferenceError); | 377 assertThrows(() => f12(undefined, 4), ReferenceError); |
378 assertEquals(4, f12(4, 5)); | 378 assertEquals(4, f12(4, 5)); |
379 function f13(a = eval("x"), x = 2) { 'use strict'; return a } | 379 function f13(a = eval("'use strict'; x"), x = 2) { return a } |
380 assertThrows(() => f13(), ReferenceError); | 380 assertThrows(() => f13(), ReferenceError); |
381 assertThrows(() => f13(undefined), ReferenceError); | 381 assertThrows(() => f13(undefined), ReferenceError); |
382 assertThrows(() => f13(undefined, 4), ReferenceError); | 382 assertThrows(() => f13(undefined, 4), ReferenceError); |
383 assertEquals(4, f13(4, 5)); | 383 assertEquals(4, f13(4, 5)); |
384 function f14(a = eval("'use strict'; x"), x = 2) { return a } | |
385 assertThrows(() => f14(), ReferenceError); | |
386 assertThrows(() => f14(undefined), ReferenceError); | |
387 assertThrows(() => f14(undefined, 4), ReferenceError); | |
388 assertEquals(4, f14(4, 5)); | |
389 | 384 |
390 function f34(x = function() { return a }, ...a) { return x()[0] } | 385 function f21(x = function() { return a }, ...a) { return x()[0] } |
391 assertEquals(4, f34(undefined, 4)); | 386 assertEquals(4, f21(undefined, 4)); |
392 function f35(x = () => a, ...a) { return x()[0] } | 387 function f22(x = () => a, ...a) { return x()[0] } |
393 assertEquals(4, f35(undefined, 4)); | 388 assertEquals(4, f22(undefined, 4)); |
394 function f36(x = () => eval("a"), ...a) { return x()[0] } | 389 function f23(x = () => eval("a"), ...a) { return x()[0] } |
395 assertEquals(4, f36(undefined, 4)); | 390 assertEquals(4, f23(undefined, 4)); |
396 function f37(x = () => eval("a"), ...a) { 'use strict'; return x()[0] } | 391 function f24(x = () => {'use strict'; return eval("a") }, ...a) { |
397 assertEquals(4, f37(undefined, 4)); | 392 return x()[0] |
398 function f38(x = () => { 'use strict'; return eval("a") }, ...a) { return x()[
0] } | 393 } |
399 assertEquals(4, f38(undefined, 4)); | 394 assertEquals(4, f24(undefined, 4)); |
400 function f39(x = () => eval("'use strict'; a"), ...a) { return x()[0] } | 395 function f25(x = () => eval("'use strict'; a"), ...a) { return x()[0] } |
401 assertEquals(4, f39(undefined, 4)); | 396 assertEquals(4, f25(undefined, 4)); |
402 | 397 |
403 var g34 = (x = function() { return a }, ...a) => { return x()[0] }; | 398 var g1 = (x = function() { return a }, ...a) => { return x()[0] }; |
404 assertEquals(4, g34(undefined, 4)); | 399 assertEquals(4, g1(undefined, 4)); |
405 var g35 = (x = () => a, ...a) => { return x()[0] }; | 400 var g2 = (x = () => a, ...a) => { return x()[0] }; |
406 assertEquals(4, g35(undefined, 4)); | 401 assertEquals(4, g2(undefined, 4)); |
407 })(); | 402 })(); |
408 | 403 |
| 404 (function TestParameterTDZStrict() { |
| 405 "use strict"; |
| 406 |
| 407 function f1(a = eval("x"), x) { return a } |
| 408 assertThrows(() => f1(undefined, 4), ReferenceError); |
| 409 assertEquals(4, f1(4, 5)); |
| 410 function f2(a = () => eval("x"), x) { return a() } |
| 411 assertEquals(4, f2(() => 4, 5)); |
| 412 |
| 413 function f11(a = eval("x"), x = 2) { return a } |
| 414 assertThrows(() => f11(), ReferenceError); |
| 415 assertThrows(() => f11(undefined), ReferenceError); |
| 416 assertThrows(() => f11(undefined, 4), ReferenceError); |
| 417 assertEquals(4, f11(4, 5)); |
| 418 |
| 419 function f21(x = () => eval("a"), ...a) { return x()[0] } |
| 420 assertEquals(4, f21(undefined, 4)); |
| 421 })(); |
409 | 422 |
410 (function TestArgumentsForNonSimpleParameters() { | 423 (function TestArgumentsForNonSimpleParameters() { |
411 function f1(x = 900) { arguments[0] = 1; return x } | 424 function f1(x = 900) { arguments[0] = 1; return x } |
412 assertEquals(9, f1(9)); | 425 assertEquals(9, f1(9)); |
413 assertEquals(900, f1()); | 426 assertEquals(900, f1()); |
414 function f2(x = 1001) { x = 2; return arguments[0] } | 427 function f2(x = 1001) { x = 2; return arguments[0] } |
415 assertEquals(10, f2(10)); | 428 assertEquals(10, f2(10)); |
416 assertEquals(undefined, f2()); | 429 assertEquals(undefined, f2()); |
417 }()); | 430 }()); |
418 | 431 |
419 | 432 |
420 (function TestFunctionLength() { | 433 (function TestFunctionLength() { |
421 assertEquals(0, (function(x = 1) {}).length); | 434 assertEquals(0, (function(x = 1) {}).length); |
422 assertEquals(0, (function(x = 1, ...a) {}).length); | 435 assertEquals(0, (function(x = 1, ...a) {}).length); |
423 assertEquals(1, (function(x, y = 1) {}).length); | 436 assertEquals(1, (function(x, y = 1) {}).length); |
424 assertEquals(1, (function(x, y = 1, ...a) {}).length); | 437 assertEquals(1, (function(x, y = 1, ...a) {}).length); |
425 assertEquals(2, (function(x, y, z = 1) {}).length); | 438 assertEquals(2, (function(x, y, z = 1) {}).length); |
426 assertEquals(2, (function(x, y, z = 1, ...a) {}).length); | 439 assertEquals(2, (function(x, y, z = 1, ...a) {}).length); |
427 assertEquals(1, (function(x, y = 1, z) {}).length); | 440 assertEquals(1, (function(x, y = 1, z) {}).length); |
428 assertEquals(1, (function(x, y = 1, z, ...a) {}).length); | 441 assertEquals(1, (function(x, y = 1, z, ...a) {}).length); |
429 assertEquals(1, (function(x, y = 1, z, v = 2) {}).length); | 442 assertEquals(1, (function(x, y = 1, z, v = 2) {}).length); |
430 assertEquals(1, (function(x, y = 1, z, v = 2, ...a) {}).length); | 443 assertEquals(1, (function(x, y = 1, z, v = 2, ...a) {}).length); |
431 })(); | 444 })(); |
| 445 |
| 446 (function TestDirectiveThrows() { |
| 447 "use strict"; |
| 448 |
| 449 assertThrows(function(){ eval("function(x=1){'use strict';}") }, SyntaxError); |
| 450 assertThrows(function(){ eval("(x=1) => {'use strict';}") }, SyntaxError); |
| 451 assertThrows( |
| 452 function(){ eval("(class{foo(x=1) {'use strict';}});") }, SyntaxError); |
| 453 |
| 454 assertThrows( |
| 455 function(){ eval("function(a, x=1){'use strict';}") }, SyntaxError); |
| 456 assertThrows(function(){ eval("(a, x=1) => {'use strict';}") }, SyntaxError); |
| 457 assertThrows( |
| 458 function(){ eval("(class{foo(a, x=1) {'use strict';}});") }, SyntaxError); |
| 459 })(); |
OLD | NEW |