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 | 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 } |
11 assertEquals(1, f1()); | 11 assertEquals(1, f1()); |
12 assertEquals(1, f1(undefined)); | 12 assertEquals(1, f1(undefined)); |
13 assertEquals(2, f1(2)); | 13 assertEquals(2, f1(2)); |
14 assertEquals(null, f1(null)); | 14 assertEquals(null, f1(null)); |
15 | 15 |
16 function f2(x, y = x) { return x + y; } | 16 function f2(x, y = x) { return x + y; } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 TestParameterScoping() { |
85 // TODO(rossberg): Add checks for variable declarations in defaults. | |
86 var x = 1; | 85 var x = 1; |
87 | 86 |
88 function f1(a = x) { var x = 2; return a; } | 87 function f1(a = x) { var x = 2; return a; } |
89 assertEquals(1, f1()); | 88 assertEquals(1, f1()); |
90 function f2(a = x) { function x() {}; return a; } | 89 function f2(a = x) { function x() {}; return a; } |
91 assertEquals(1, f2()); | 90 assertEquals(1, f2()); |
92 function f3(a = x) { 'use strict'; let x = 2; return a; } | 91 function f3(a = x) { 'use strict'; let x = 2; return a; } |
93 assertEquals(1, f3()); | 92 assertEquals(1, f3()); |
94 function f4(a = x) { 'use strict'; const x = 2; return a; } | 93 function f4(a = x) { 'use strict'; const x = 2; return a; } |
95 assertEquals(1, f4()); | 94 assertEquals(1, f4()); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 assertSame(f15, f15()); | 154 assertSame(f15, f15()); |
156 var f16 = function f(f = 7, x = f) { return x; } | 155 var f16 = function f(f = 7, x = f) { return x; } |
157 assertSame(7, f16()); | 156 assertSame(7, f16()); |
158 | 157 |
159 var o1 = {f: function(x = this) { return x; }}; | 158 var o1 = {f: function(x = this) { return x; }}; |
160 assertSame(o1, o1.f()); | 159 assertSame(o1, o1.f()); |
161 assertSame(1, o1.f(1)); | 160 assertSame(1, o1.f(1)); |
162 })(); | 161 })(); |
163 | 162 |
164 | 163 |
| 164 (function TestSloppyEvalScoping() { |
| 165 var x = 1; |
| 166 |
| 167 function f1(y = eval("var x = 2")) { with ({}) { return x; } } |
| 168 assertEquals(1, f1()); |
| 169 function f2(y = eval("var x = 2"), z = x) { return z; } |
| 170 assertEquals(1, f2()); |
| 171 assertEquals(1, f2(0)); |
| 172 function f3(y = eval("var x = 2"), z = eval("x")) { return z; } |
| 173 assertEquals(1, f3()); |
| 174 assertEquals(1, f3(0)); |
| 175 // TODO(rossberg): eval inside patterns is not recognized yet. |
| 176 // function f41({[eval("var x = 2; 'a'")]: w}, z = x)) { return z; } |
| 177 // assertEquals(1, f41({})); |
| 178 // assertEquals(1, f41({a: 0})); |
| 179 // function f42({[eval("var x = 2; 'a'")]: w}, z = eval("x")) { return z; } |
| 180 // assertEquals(1, f42({})); |
| 181 // assertEquals(1, f42({a: 0})); |
| 182 // function f43({a: w = eval("var x = 2")}, z = x) { return z; } |
| 183 // assertEquals(1, f43({})); |
| 184 // assertEquals(1, f43({a: 0})); |
| 185 // function f44({a: w = eval("var x = 2")}, z = eval("x")) { return z; } |
| 186 // assertEquals(1, f44({})); |
| 187 // assertEquals(1, f44({a: 0})); |
| 188 |
| 189 function f5({a = eval("var x = 2"), b = x}) { return b; } |
| 190 assertEquals(2, f5({})); |
| 191 assertEquals(1, f5({a: 0})); |
| 192 function f6({a = eval("var x = 2"), b = eval("x")}) { return b; } |
| 193 assertEquals(2, f6({})); |
| 194 assertEquals(1, f6({a: 0})); |
| 195 function f71({[eval("var x = 2; 'a'")]: w, b = x}) { return b; } |
| 196 assertEquals(2, f71({})); |
| 197 assertEquals(2, f71({a: 0})); |
| 198 function f72({[eval("var x = 2; 'a'")]: w, b = eval("x")}) { return b; } |
| 199 assertEquals(2, f72({})); |
| 200 assertEquals(2, f72({a: 0})); |
| 201 function f73({a: w = eval("var x = 2"), b = x}) { return b; } |
| 202 assertEquals(2, f73({})); |
| 203 assertEquals(1, f73({a: 0})); |
| 204 function f74({a: w = eval("var x = 2"), b = eval("x")}) { return b; } |
| 205 assertEquals(2, f74({})); |
| 206 assertEquals(1, f74({a: 0})); |
| 207 function f8(y = (eval("var x = 2"), x)) { return y; } |
| 208 assertEquals(2, f8()); |
| 209 assertEquals(0, f8(0)); |
| 210 |
| 211 function f11(z = eval("var y = 2")) { return y; } |
| 212 assertThrows(f11, ReferenceError); |
| 213 function f12(z = eval("var y = 2"), b = y) {} |
| 214 assertThrows(f12, ReferenceError); |
| 215 function f13(z = eval("var y = 2"), b = eval("y")) {} |
| 216 assertThrows(f13, ReferenceError); |
| 217 |
| 218 function f21(f = () => x) { eval("var x = 2"); return f() } |
| 219 assertEquals(1, f21()); |
| 220 assertEquals(3, f21(() => 3)); |
| 221 function f22(f = () => eval("x")) { eval("var x = 2"); return f() } |
| 222 assertEquals(1, f22()); |
| 223 assertEquals(3, f22(() => 3)); |
| 224 })(); |
| 225 |
| 226 |
| 227 (function TestStrictEvalScoping() { |
| 228 'use strict'; |
| 229 var x = 1; |
| 230 |
| 231 function f1(y = eval("var x = 2")) { return x; } |
| 232 assertEquals(1, f1()); |
| 233 function f2(y = eval("var x = 2"), z = x) { return z; } |
| 234 assertEquals(1, f2()); |
| 235 assertEquals(1, f2(0)); |
| 236 function f3(y = eval("var x = 2"), z = eval("x")) { return z; } |
| 237 assertEquals(1, f3()); |
| 238 assertEquals(1, f3(0)); |
| 239 function f41({[eval("var x = 2; 'a'")]: w}, z = x) { return z; } |
| 240 assertEquals(1, f41({})); |
| 241 assertEquals(1, f41({a: 0})); |
| 242 function f42({[eval("var x = 2; 'a'")]: w}, z = eval("x")) { return z; } |
| 243 assertEquals(1, f42({})); |
| 244 assertEquals(1, f42({a: 0})); |
| 245 function f43({a: w = eval("var x = 2")}, z = x) { return z; } |
| 246 assertEquals(1, f43({})); |
| 247 assertEquals(1, f43({a: 0})); |
| 248 function f44({a: w = eval("var x = 2")}, z = eval("x")) { return z; } |
| 249 assertEquals(1, f44({})); |
| 250 assertEquals(1, f44({a: 0})); |
| 251 |
| 252 function f5({a = eval("var x = 2"), b = x}) { return b; } |
| 253 assertEquals(1, f5({})); |
| 254 assertEquals(1, f5({a: 0})); |
| 255 function f6({a = eval("var x = 2"), b = eval("x")}) { return b; } |
| 256 assertEquals(1, f6({})); |
| 257 assertEquals(1, f6({a: 0})); |
| 258 function f71({[eval("var x = 2; 'a'")]: w, b = x}) { return b; } |
| 259 assertEquals(1, f71({})); |
| 260 assertEquals(1, f71({a: 0})); |
| 261 function f72({[eval("var x = 2; 'a'")]: w, b = eval("x")}) { return b; } |
| 262 assertEquals(1, f72({})); |
| 263 assertEquals(1, f72({a: 0})); |
| 264 function f73({a: w = eval("var x = 2"), b = x}) { return b; } |
| 265 assertEquals(1, f73({})); |
| 266 assertEquals(1, f73({a: 0})); |
| 267 function f74({a: w = eval("var x = 2"), b = eval("x")}) { return b; } |
| 268 assertEquals(1, f74({})); |
| 269 assertEquals(1, f74({a: 0})); |
| 270 function f8(y = (eval("var x = 2"), x)) { return y; } |
| 271 assertEquals(1, f8()); |
| 272 assertEquals(0, f8(0)); |
| 273 |
| 274 function f11(z = eval("var y = 2")) { return y; } |
| 275 assertThrows(f11, ReferenceError); |
| 276 function f12(z = eval("var y = 2"), b = y) {} |
| 277 assertThrows(f12, ReferenceError); |
| 278 function f13(z = eval("var y = 2"), b = eval("y")) {} |
| 279 assertThrows(f13, ReferenceError); |
| 280 |
| 281 function f21(f = () => x) { eval("var x = 2"); return f() } |
| 282 assertEquals(1, f21()); |
| 283 assertEquals(3, f21(() => 3)); |
| 284 function f22(f = () => eval("x")) { eval("var x = 2"); return f() } |
| 285 assertEquals(1, f22()); |
| 286 assertEquals(3, f22(() => 3)); |
| 287 })(); |
| 288 |
| 289 |
165 (function TestParameterTDZ() { | 290 (function TestParameterTDZ() { |
166 function f1(a = x, x) { return a } | 291 function f1(a = x, x) { return a } |
167 assertThrows(() => f1(undefined, 4), ReferenceError); | 292 assertThrows(() => f1(undefined, 4), ReferenceError); |
168 assertEquals(4, f1(4, 5)); | 293 assertEquals(4, f1(4, 5)); |
169 function f2(a = eval("x"), x) { return a } | 294 function f2(a = eval("x"), x) { return a } |
170 assertThrows(() => f2(undefined, 4), ReferenceError); | 295 assertThrows(() => f2(undefined, 4), ReferenceError); |
171 assertEquals(4, f2(4, 5)); | 296 assertEquals(4, f2(4, 5)); |
172 function f3(a = eval("x"), x) { 'use strict'; return a } | 297 function f3(a = eval("x"), x) { 'use strict'; return a } |
173 assertThrows(() => f3(undefined, 4), ReferenceError); | 298 assertThrows(() => f3(undefined, 4), ReferenceError); |
174 assertEquals(4, f3(4, 5)); | 299 assertEquals(4, f3(4, 5)); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 // assertEquals(0, (function(x = 1, ...a) {}).length); | 367 // assertEquals(0, (function(x = 1, ...a) {}).length); |
243 // assertEquals(1, (function(x, y = 1) {}).length); | 368 // assertEquals(1, (function(x, y = 1) {}).length); |
244 // assertEquals(1, (function(x, y = 1, ...a) {}).length); | 369 // assertEquals(1, (function(x, y = 1, ...a) {}).length); |
245 // assertEquals(2, (function(x, y, z = 1) {}).length); | 370 // assertEquals(2, (function(x, y, z = 1) {}).length); |
246 // assertEquals(2, (function(x, y, z = 1, ...a) {}).length); | 371 // assertEquals(2, (function(x, y, z = 1, ...a) {}).length); |
247 // assertEquals(1, (function(x, y = 1, z) {}).length); | 372 // assertEquals(1, (function(x, y = 1, z) {}).length); |
248 // assertEquals(1, (function(x, y = 1, z, ...a) {}).length); | 373 // assertEquals(1, (function(x, y = 1, z, ...a) {}).length); |
249 // assertEquals(1, (function(x, y = 1, z, v = 2) {}).length); | 374 // assertEquals(1, (function(x, y = 1, z, v = 2) {}).length); |
250 // assertEquals(1, (function(x, y = 1, z, v = 2, ...a) {}).length); | 375 // assertEquals(1, (function(x, y = 1, z, v = 2, ...a) {}).length); |
251 })(); | 376 })(); |
OLD | NEW |