default-parameters.js 12.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.


(function TestDefaults() {
  function f1(x = 1) { return x }
  assertEquals(1, f1());
  assertEquals(1, f1(undefined));
  assertEquals(2, f1(2));
  assertEquals(null, f1(null));

  function f2(x, y = x) { return x + y; }
  assertEquals(8, f2(4));
  assertEquals(8, f2(4, undefined));
  assertEquals(6, f2(4, 2));

  function f3(x = 1, y) { return x + y; }
  assertEquals(8, f3(5, 3));
  assertEquals(3, f3(undefined, 2));
  assertEquals(6, f3(4, 2));

  function f4(x = () => 1) { return x() }
  assertEquals(1, f4());
  assertEquals(1, f4(undefined));
  assertEquals(2, f4(() => 2));
  assertThrows(() => f4(null), TypeError);

  function f5(x, y = () => x) { return x + y(); }
  assertEquals(8, f5(4));
  assertEquals(8, f5(4, undefined));
  assertEquals(6, f5(4, () => 2));

  function f6(x = {a: 1, m() { return 2 }}) { return x.a + x.m(); }
  assertEquals(3, f6());
  assertEquals(3, f6(undefined));
  assertEquals(5, f6({a: 2, m() { return 3 }}));

  var g1 = (x = 1) => { return x };
  assertEquals(1, g1());
  assertEquals(1, g1(undefined));
  assertEquals(2, g1(2));
  assertEquals(null, g1(null));

  var g2 = (x, y = x) => { return x + y; };
  assertEquals(8, g2(4));
  assertEquals(8, g2(4, undefined));
  assertEquals(6, g2(4, 2));

  var g3 = (x = 1, y) => { return x + y; };
  assertEquals(8, g3(5, 3));
  assertEquals(3, g3(undefined, 2));
  assertEquals(6, g3(4, 2));

  var g4 = (x = () => 1) => { return x() };
  assertEquals(1, g4());
  assertEquals(1, g4(undefined));
  assertEquals(2, g4(() => 2));
  assertThrows(() => g4(null), TypeError);

  var g5 = (x, y = () => x) => { return x + y(); };
  assertEquals(8, g5(4));
  assertEquals(8, g5(4, undefined));
  assertEquals(6, g5(4, () => 2));

  var g6 = (x = {a: 1, m() { return 2 }}) => { return x.a + x.m(); };
  assertEquals(3, g6());
  assertEquals(3, g6(undefined));
  assertEquals(5, g6({a: 2, m() { return 3 }}));
}());


(function TestEvalInParameters() {
  function f1(x = eval(0)) { return x }
  assertEquals(0, f1());
  function f2(x = () => eval(1)) { return x() }
  assertEquals(1, f2());
})();


81
(function TestParameterScopingSloppy() {
82 83 84 85 86 87
  var x = 1;

  function f1(a = x) { var x = 2; return a; }
  assertEquals(1, f1());
  function f2(a = x) { function x() {}; return a; }
  assertEquals(1, f2());
88
  function f3(a = eval("x")) { var x; return a; }
89
  assertEquals(1, f3());
90 91 92
  function f31(a = eval("'use strict'; x")) { var x; return a; }
  assertEquals(1, f31());
  function f4(a = function() { return x }) { var x; return a(); }
93
  assertEquals(1, f4());
94
  function f5(a = () => x) { var x; return a(); }
95
  assertEquals(1, f5());
96
  function f6(a = () => eval("x")) { var x; return a(); }
97
  assertEquals(1, f6());
98
  function f61(a = () => { 'use strict'; return eval("x") }) { var x; return a(); }
99
  assertEquals(1, f61());
100
  function f62(a = () => eval("'use strict'; x")) { var x; return a(); }
101 102 103 104 105 106
  assertEquals(1, f62());

  var g1 = (a = x) => { var x = 2; return a; };
  assertEquals(1, g1());
  var g2 = (a = x) => { function x() {}; return a; };
  assertEquals(1, g2());
107
  var g3 = (a = eval("x")) => { var x; return a; };
108
  assertEquals(1, g3());
109 110 111
  var g31 = (a = eval("'use strict'; x")) => { var x; return a; };
  assertEquals(1, g31());
  var g4 = (a = function() { return x }) => { var x; return a(); };
112
  assertEquals(1, g4());
113
  var g5 = (a = () => x) => { var x; return a(); };
114
  assertEquals(1, g5());
115
  var g6 = (a = () => eval("x")) => { var x; return a(); };
116
  assertEquals(1, g6());
117
  var g61 = (a = () => { 'use strict'; return eval("x") }) => { var x; return a(); };
118
  assertEquals(1, g61());
119
  var g62 = (a = () => eval("'use strict'; x")) => { var x; return a(); };
120 121 122 123 124 125
  assertEquals(1, g62());

  var f11 = function f(x = f) { var f; return x; }
  assertSame(f11, f11());
  var f12 = function f(x = f) { function f() {}; return x; }
  assertSame(f12, f12());
126 127
  var f13 = function f(f = 7, x = f) { return x; }
  assertSame(7, f13());
128 129 130 131 132 133

  var o1 = {f: function(x = this) { return x; }};
  assertSame(o1, o1.f());
  assertSame(1, o1.f(1));
})();

134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
(function TestParameterScopingStrict() {
  "use strict";
  var x = 1;

  function f1(a = x) { let x = 2; return a; }
  assertEquals(1, f1());
  function f2(a = x) { const x = 2; return a; }
  assertEquals(1, f2());
  function f3(a = x) { function x() {}; return a; }
  assertEquals(1, f3());
  function f4(a = eval("x")) { var x; return a; }
  assertEquals(1, f4());
  function f5(a = () => eval("x")) { var x; return a(); }
  assertEquals(1, f5());

  var g1 = (a = x) => { let x = 2; return a; };
  assertEquals(1, g1());
  var g2 = (a = x) => { const x = 2; return a; };
  assertEquals(1, g2());
  var g3 = (a = x) => { function x() {}; return a; };
  assertEquals(1, g3());
  var g4 = (a = eval("x")) => { var x; return a; };
  assertEquals(1, g4());
  var g5 = (a = () => eval("x")) => { var x; return a(); };
  assertEquals(1, g5());

  var f11 = function f(x = f) { let f; return x; }
  assertSame(f11, f11());
  var f12 = function f(x = f) { const f = 0; return x; }
  assertSame(f12, f12());
  var f13 = function f(x = f) { function f() {}; return x; }
  assertSame(f13, f13());
})();
167

168 169 170 171
(function TestSloppyEvalScoping() {
  var x = 1;

  function f1(y = eval("var x = 2")) { with ({}) { return x; } }
172
  assertEquals(2, f1());
173
  function f2(y = eval("var x = 2"), z = x) { return z; }
174
  assertEquals(2, f2());
175 176
  assertEquals(1, f2(0));
  function f3(y = eval("var x = 2"), z = eval("x")) { return z; }
177
  assertEquals(2, f3());
178 179 180 181 182 183
  assertEquals(1, f3(0));
  function f8(y = (eval("var x = 2"), x)) { return y; }
  assertEquals(2, f8());
  assertEquals(0, f8(0));

  function f11(z = eval("var y = 2")) { return y; }
184 185 186 187 188
  assertEquals(2, f11());
  function f12(z = eval("var y = 2"), b = y) { return b; }
  assertEquals(2, f12());
  function f13(z = eval("var y = 2"), b = eval("y")) { return b; }
  assertEquals(2, f13());
189 190 191 192 193 194 195

  function f21(f = () => x) { eval("var x = 2"); return f() }
  assertEquals(1, f21());
  assertEquals(3, f21(() => 3));
  function f22(f = () => eval("x")) { eval("var x = 2"); return f() }
  assertEquals(1, f22());
  assertEquals(3, f22(() => 3));
196 197

  var g1 = (y = eval("var x = 2")) => { with ({}) { return x; } };
198
  assertEquals(2, g1());
199
  var g2 = (y = eval("var x = 2"), z = x) => { return z; };
200
  assertEquals(2, g2());
201 202
  assertEquals(1, g2(0));
  var g3 = (y = eval("var x = 2"), z = eval("x")) => { return z; };
203
  assertEquals(2, g3());
204 205 206 207 208 209
  assertEquals(1, g3(0));
  var g8 = (y = (eval("var x = 2"), x)) => { return y; };
  assertEquals(2, g8());
  assertEquals(0, g8(0));

  var g11 = (z = eval("var y = 2")) => { return y; };
210 211 212 213 214
  assertEquals(2, g11());
  var g12 = (z = eval("var y = 2"), b = y) => { return b; };
  assertEquals(2, g12());
  var g13 = (z = eval("var y = 2"), b = eval("y")) => { return b; };
  assertEquals(2, g13());
215 216 217 218 219 220 221

  var g21 = (f = () => x) => { eval("var x = 2"); return f() };
  assertEquals(1, g21());
  assertEquals(3, g21(() => 3));
  var g22 = (f = () => eval("x")) => { eval("var x = 2"); return f() };
  assertEquals(1, g22());
  assertEquals(3, g22(() => 3));
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
})();


(function TestStrictEvalScoping() {
  'use strict';
  var x = 1;

  function f1(y = eval("var x = 2")) { return x; }
  assertEquals(1, f1());
  function f2(y = eval("var x = 2"), z = x) { return z; }
  assertEquals(1, f2());
  assertEquals(1, f2(0));
  function f3(y = eval("var x = 2"), z = eval("x")) { return z; }
  assertEquals(1, f3());
  assertEquals(1, f3(0));
  function f8(y = (eval("var x = 2"), x)) { return y; }
  assertEquals(1, f8());
  assertEquals(0, f8(0));

  function f11(z = eval("var y = 2")) { return y; }
  assertThrows(f11, ReferenceError);
  function f12(z = eval("var y = 2"), b = y) {}
  assertThrows(f12, ReferenceError);
  function f13(z = eval("var y = 2"), b = eval("y")) {}
  assertThrows(f13, ReferenceError);

  function f21(f = () => x) { eval("var x = 2"); return f() }
  assertEquals(1, f21());
  assertEquals(3, f21(() => 3));
  function f22(f = () => eval("x")) { eval("var x = 2"); return f() }
  assertEquals(1, f22());
  assertEquals(3, f22(() => 3));
})();

256
(function TestParameterTDZSloppy() {
257 258 259 260 261 262
  function f1(a = x, x) { return a }
  assertThrows(() => f1(undefined, 4), ReferenceError);
  assertEquals(4, f1(4, 5));
  function f2(a = eval("x"), x) { return a }
  assertThrows(() => f2(undefined, 4), ReferenceError);
  assertEquals(4, f2(4, 5));
263
  function f3(a = eval("'use strict'; x"), x) { return a }
264 265
  assertThrows(() => f3(undefined, 4), ReferenceError);
  assertEquals(4, f3(4, 5));
266 267 268
  function f4(a = () => x, x) { return a() }
  assertEquals(4, f4(() => 4, 5));
  function f5(a = () => eval("x"), x) { return a() }
269
  assertEquals(4, f5(() => 4, 5));
270
  function f6(a = () => eval("'use strict'; x"), x) { return a() }
271 272 273 274 275 276 277 278 279 280 281 282
  assertEquals(4, f6(() => 4, 5));

  function f11(a = x, x = 2) { return a }
  assertThrows(() => f11(), ReferenceError);
  assertThrows(() => f11(undefined), ReferenceError);
  assertThrows(() => f11(undefined, 4), ReferenceError);
  assertEquals(4, f1(4, 5));
  function f12(a = eval("x"), x = 2) { return a }
  assertThrows(() => f12(), ReferenceError);
  assertThrows(() => f12(undefined), ReferenceError);
  assertThrows(() => f12(undefined, 4), ReferenceError);
  assertEquals(4, f12(4, 5));
283
  function f13(a = eval("'use strict'; x"), x = 2) { return a }
284 285 286 287
  assertThrows(() => f13(), ReferenceError);
  assertThrows(() => f13(undefined), ReferenceError);
  assertThrows(() => f13(undefined, 4), ReferenceError);
  assertEquals(4, f13(4, 5));
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305

  function f21(x = function() { return a }, ...a) { return x()[0] }
  assertEquals(4, f21(undefined, 4));
  function f22(x = () => a, ...a) { return x()[0] }
  assertEquals(4, f22(undefined, 4));
  function f23(x = () => eval("a"), ...a) { return x()[0] }
  assertEquals(4, f23(undefined, 4));
  function f24(x = () => {'use strict'; return eval("a") }, ...a) {
    return x()[0]
  }
  assertEquals(4, f24(undefined, 4));
  function f25(x = () => eval("'use strict'; a"), ...a) { return x()[0] }
  assertEquals(4, f25(undefined, 4));

  var g1 = (x = function() { return a }, ...a) => { return x()[0] };
  assertEquals(4, g1(undefined, 4));
  var g2 = (x = () => a, ...a) => { return x()[0] };
  assertEquals(4, g2(undefined, 4));
306 307
})();

308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
(function TestParameterTDZStrict() {
  "use strict";

  function f1(a = eval("x"), x) { return a }
  assertThrows(() => f1(undefined, 4), ReferenceError);
  assertEquals(4, f1(4, 5));
  function f2(a = () => eval("x"), x) { return a() }
  assertEquals(4, f2(() => 4, 5));

  function f11(a = eval("x"), x = 2) { return a }
  assertThrows(() => f11(), ReferenceError);
  assertThrows(() => f11(undefined), ReferenceError);
  assertThrows(() => f11(undefined, 4), ReferenceError);
  assertEquals(4, f11(4, 5));

  function f21(x = () => eval("a"), ...a) { return x()[0] }
  assertEquals(4, f21(undefined, 4));
})();
326 327 328 329 330 331 332 333 334 335 336 337

(function TestArgumentsForNonSimpleParameters() {
  function f1(x = 900) { arguments[0] = 1; return x }
  assertEquals(9, f1(9));
  assertEquals(900, f1());
  function f2(x = 1001) { x = 2; return arguments[0] }
  assertEquals(10, f2(10));
  assertEquals(undefined, f2());
}());


(function TestFunctionLength() {
338 339 340 341 342 343 344 345 346 347
   assertEquals(0, (function(x = 1) {}).length);
   assertEquals(0, (function(x = 1, ...a) {}).length);
   assertEquals(1, (function(x, y = 1) {}).length);
   assertEquals(1, (function(x, y = 1, ...a) {}).length);
   assertEquals(2, (function(x, y, z = 1) {}).length);
   assertEquals(2, (function(x, y, z = 1, ...a) {}).length);
   assertEquals(1, (function(x, y = 1, z) {}).length);
   assertEquals(1, (function(x, y = 1, z, ...a) {}).length);
   assertEquals(1, (function(x, y = 1, z, v = 2) {}).length);
   assertEquals(1, (function(x, y = 1, z, v = 2, ...a) {}).length);
348
})();
349 350 351 352

(function TestDirectiveThrows() {
  "use strict";

353 354 355 356 357 358 359 360 361 362 363
  assertThrows("(function(x=1){'use strict';})", SyntaxError);
  assertThrows("(x=1) => {'use strict';}", SyntaxError);
  assertThrows("(class{foo(x=1) {'use strict';}});", SyntaxError);

  assertThrows("(function(a, x=1){'use strict';})", SyntaxError);
  assertThrows("(a, x=1) => {'use strict';}", SyntaxError);
  assertThrows("(class{foo(a, x=1) {'use strict';}});", SyntaxError);

  assertThrows("(function({x}){'use strict';})", SyntaxError);
  assertThrows("({x}) => {'use strict';}", SyntaxError);
  assertThrows("(class{foo({x}) {'use strict';}});", SyntaxError);
364
})();