| 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 |