js/src/tests/ecma_5/Function/strict-arguments.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /*
michael@0 2 * Any copyright is dedicated to the Public Domain.
michael@0 3 * http://creativecommons.org/licenses/publicdomain/
michael@0 4 */
michael@0 5
michael@0 6 var gTestfile = 'strict-arguments.js';
michael@0 7 var BUGNUMBER = 516255;
michael@0 8 var summary =
michael@0 9 "ES5 strict mode: arguments objects of strict mode functions must copy " +
michael@0 10 "argument values";
michael@0 11
michael@0 12 print(BUGNUMBER + ": " + summary);
michael@0 13
michael@0 14 /**************
michael@0 15 * BEGIN TEST *
michael@0 16 **************/
michael@0 17
michael@0 18 function arrayEvery(arr, fun)
michael@0 19 {
michael@0 20 return Array.prototype.every.call(arr, fun);
michael@0 21 }
michael@0 22
michael@0 23 function arraysEqual(a1, a2)
michael@0 24 {
michael@0 25 return a1.length === a2.length &&
michael@0 26 arrayEvery(a1, function(v, i) { return v === a2[i]; });
michael@0 27 }
michael@0 28
michael@0 29
michael@0 30 /************************
michael@0 31 * NON-STRICT ARGUMENTS *
michael@0 32 ************************/
michael@0 33
michael@0 34 var obj = {};
michael@0 35
michael@0 36 function noargs() { return arguments; }
michael@0 37
michael@0 38 assertEq(arraysEqual(noargs(), []), true);
michael@0 39 assertEq(arraysEqual(noargs(1), [1]), true);
michael@0 40 assertEq(arraysEqual(noargs(2, obj, 8), [2, obj, 8]), true);
michael@0 41
michael@0 42 function args(a) { return arguments; }
michael@0 43
michael@0 44 assertEq(arraysEqual(args(), []), true);
michael@0 45 assertEq(arraysEqual(args(1), [1]), true);
michael@0 46 assertEq(arraysEqual(args(1, obj), [1, obj]), true);
michael@0 47 assertEq(arraysEqual(args("foopy"), ["foopy"]), true);
michael@0 48
michael@0 49 function assign(a)
michael@0 50 {
michael@0 51 a = 17;
michael@0 52 return arguments;
michael@0 53 }
michael@0 54
michael@0 55 assertEq(arraysEqual(assign(1), [17]), true);
michael@0 56
michael@0 57 function getLaterAssign(a)
michael@0 58 {
michael@0 59 var o = arguments;
michael@0 60 a = 17;
michael@0 61 return o;
michael@0 62 }
michael@0 63
michael@0 64 assertEq(arraysEqual(getLaterAssign(1), [17]), true);
michael@0 65
michael@0 66 function assignElementGetParameter(a)
michael@0 67 {
michael@0 68 arguments[0] = 17;
michael@0 69 return a;
michael@0 70 }
michael@0 71
michael@0 72 assertEq(assignElementGetParameter(42), 17);
michael@0 73
michael@0 74 function assignParameterGetElement(a)
michael@0 75 {
michael@0 76 a = 17;
michael@0 77 return arguments[0];
michael@0 78 }
michael@0 79
michael@0 80 assertEq(assignParameterGetElement(42), 17);
michael@0 81
michael@0 82 function assignArgSub(x, y)
michael@0 83 {
michael@0 84 arguments[0] = 3;
michael@0 85 return arguments[0];
michael@0 86 }
michael@0 87
michael@0 88 assertEq(assignArgSub(1), 3);
michael@0 89
michael@0 90 function assignArgSubParamUse(x, y)
michael@0 91 {
michael@0 92 arguments[0] = 3;
michael@0 93 assertEq(x, 3);
michael@0 94 return arguments[0];
michael@0 95 }
michael@0 96
michael@0 97 assertEq(assignArgSubParamUse(1), 3);
michael@0 98
michael@0 99 function assignArgumentsElement(x, y)
michael@0 100 {
michael@0 101 arguments[0] = 3;
michael@0 102 return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
michael@0 103 }
michael@0 104
michael@0 105 assertEq(assignArgumentsElement(1), 3);
michael@0 106
michael@0 107 function assignArgumentsElementParamUse(x, y)
michael@0 108 {
michael@0 109 arguments[0] = 3;
michael@0 110 assertEq(x, 3);
michael@0 111 return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
michael@0 112 }
michael@0 113
michael@0 114 assertEq(assignArgumentsElementParamUse(1), 3);
michael@0 115
michael@0 116 /********************
michael@0 117 * STRICT ARGUMENTS *
michael@0 118 ********************/
michael@0 119
michael@0 120 function strictNoargs()
michael@0 121 {
michael@0 122 "use strict";
michael@0 123 return arguments;
michael@0 124 }
michael@0 125
michael@0 126 assertEq(arraysEqual(strictNoargs(), []), true);
michael@0 127 assertEq(arraysEqual(strictNoargs(1), [1]), true);
michael@0 128 assertEq(arraysEqual(strictNoargs(1, obj), [1, obj]), true);
michael@0 129
michael@0 130 function strictArgs(a)
michael@0 131 {
michael@0 132 "use strict";
michael@0 133 return arguments;
michael@0 134 }
michael@0 135
michael@0 136 assertEq(arraysEqual(strictArgs(), []), true);
michael@0 137 assertEq(arraysEqual(strictArgs(1), [1]), true);
michael@0 138 assertEq(arraysEqual(strictArgs(1, obj), [1, obj]), true);
michael@0 139
michael@0 140 function strictAssign(a)
michael@0 141 {
michael@0 142 "use strict";
michael@0 143 a = 17;
michael@0 144 return arguments;
michael@0 145 }
michael@0 146
michael@0 147 assertEq(arraysEqual(strictAssign(), []), true);
michael@0 148 assertEq(arraysEqual(strictAssign(1), [1]), true);
michael@0 149 assertEq(arraysEqual(strictAssign(1, obj), [1, obj]), true);
michael@0 150
michael@0 151 var upper;
michael@0 152 function strictAssignAfter(a)
michael@0 153 {
michael@0 154 "use strict";
michael@0 155 upper = arguments;
michael@0 156 a = 42;
michael@0 157 return upper;
michael@0 158 }
michael@0 159
michael@0 160 assertEq(arraysEqual(strictAssignAfter(), []), true);
michael@0 161 assertEq(arraysEqual(strictAssignAfter(17), [17]), true);
michael@0 162 assertEq(arraysEqual(strictAssignAfter(obj), [obj]), true);
michael@0 163
michael@0 164 function strictMaybeAssignOuterParam(p)
michael@0 165 {
michael@0 166 "use strict";
michael@0 167 function inner() { p = 17; }
michael@0 168 return arguments;
michael@0 169 }
michael@0 170
michael@0 171 assertEq(arraysEqual(strictMaybeAssignOuterParam(), []), true);
michael@0 172 assertEq(arraysEqual(strictMaybeAssignOuterParam(42), [42]), true);
michael@0 173 assertEq(arraysEqual(strictMaybeAssignOuterParam(obj), [obj]), true);
michael@0 174
michael@0 175 function strictAssignOuterParam(p)
michael@0 176 {
michael@0 177 "use strict";
michael@0 178 function inner() { p = 17; }
michael@0 179 inner();
michael@0 180 return arguments;
michael@0 181 }
michael@0 182
michael@0 183 assertEq(arraysEqual(strictAssignOuterParam(), []), true);
michael@0 184 assertEq(arraysEqual(strictAssignOuterParam(17), [17]), true);
michael@0 185 assertEq(arraysEqual(strictAssignOuterParam(obj), [obj]), true);
michael@0 186
michael@0 187 function strictAssignOuterParamPSYCH(p)
michael@0 188 {
michael@0 189 "use strict";
michael@0 190 function inner(p) { p = 17; }
michael@0 191 inner();
michael@0 192 return arguments;
michael@0 193 }
michael@0 194
michael@0 195 assertEq(arraysEqual(strictAssignOuterParamPSYCH(), []), true);
michael@0 196 assertEq(arraysEqual(strictAssignOuterParamPSYCH(17), [17]), true);
michael@0 197 assertEq(arraysEqual(strictAssignOuterParamPSYCH(obj), [obj]), true);
michael@0 198
michael@0 199 function strictEval(code, p)
michael@0 200 {
michael@0 201 "use strict";
michael@0 202 eval(code);
michael@0 203 return arguments;
michael@0 204 }
michael@0 205
michael@0 206 assertEq(arraysEqual(strictEval("1", 2), ["1", 2]), true);
michael@0 207 assertEq(arraysEqual(strictEval("arguments"), ["arguments"]), true);
michael@0 208 assertEq(arraysEqual(strictEval("p = 2"), ["p = 2"]), true);
michael@0 209 assertEq(arraysEqual(strictEval("p = 2", 17), ["p = 2", 17]), true);
michael@0 210 assertEq(arraysEqual(strictEval("arguments[0] = 17"), [17]), true);
michael@0 211 assertEq(arraysEqual(strictEval("arguments[0] = 17", 42), [17, 42]), true);
michael@0 212
michael@0 213 function strictMaybeNestedEval(code, p)
michael@0 214 {
michael@0 215 "use strict";
michael@0 216 function inner() { eval(code); }
michael@0 217 return arguments;
michael@0 218 }
michael@0 219
michael@0 220 assertEq(arraysEqual(strictMaybeNestedEval("1", 2), ["1", 2]), true);
michael@0 221 assertEq(arraysEqual(strictMaybeNestedEval("arguments"), ["arguments"]), true);
michael@0 222 assertEq(arraysEqual(strictMaybeNestedEval("p = 2"), ["p = 2"]), true);
michael@0 223 assertEq(arraysEqual(strictMaybeNestedEval("p = 2", 17), ["p = 2", 17]), true);
michael@0 224
michael@0 225 function strictNestedEval(code, p)
michael@0 226 {
michael@0 227 "use strict";
michael@0 228 function inner() { eval(code); }
michael@0 229 inner();
michael@0 230 return arguments;
michael@0 231 }
michael@0 232
michael@0 233 assertEq(arraysEqual(strictNestedEval("1", 2), ["1", 2]), true);
michael@0 234 assertEq(arraysEqual(strictNestedEval("arguments"), ["arguments"]), true);
michael@0 235 assertEq(arraysEqual(strictNestedEval("p = 2"), ["p = 2"]), true);
michael@0 236 assertEq(arraysEqual(strictNestedEval("p = 2", 17), ["p = 2", 17]), true);
michael@0 237 assertEq(arraysEqual(strictNestedEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
michael@0 238 assertEq(arraysEqual(strictNestedEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
michael@0 239
michael@0 240 function strictAssignArguments(a)
michael@0 241 {
michael@0 242 "use strict";
michael@0 243 arguments[0] = 42;
michael@0 244 return a;
michael@0 245 }
michael@0 246
michael@0 247 assertEq(strictAssignArguments(), undefined);
michael@0 248 assertEq(strictAssignArguments(obj), obj);
michael@0 249 assertEq(strictAssignArguments(17), 17);
michael@0 250
michael@0 251 function strictAssignParameterGetElement(a)
michael@0 252 {
michael@0 253 "use strict";
michael@0 254 a = 17;
michael@0 255 return arguments[0];
michael@0 256 }
michael@0 257
michael@0 258 assertEq(strictAssignParameterGetElement(42), 42);
michael@0 259
michael@0 260 function strictAssignArgSub(x, y)
michael@0 261 {
michael@0 262 "use strict";
michael@0 263 arguments[0] = 3;
michael@0 264 return arguments[0];
michael@0 265 }
michael@0 266
michael@0 267 assertEq(strictAssignArgSub(1), 3);
michael@0 268
michael@0 269 function strictAssignArgSubParamUse(x, y)
michael@0 270 {
michael@0 271 "use strict";
michael@0 272 arguments[0] = 3;
michael@0 273 assertEq(x, 1);
michael@0 274 return arguments[0];
michael@0 275 }
michael@0 276
michael@0 277 assertEq(strictAssignArgSubParamUse(1), 3);
michael@0 278
michael@0 279 function strictAssignArgumentsElement(x, y)
michael@0 280 {
michael@0 281 "use strict";
michael@0 282 arguments[0] = 3;
michael@0 283 return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
michael@0 284 }
michael@0 285
michael@0 286 assertEq(strictAssignArgumentsElement(1), 3);
michael@0 287
michael@0 288 function strictAssignArgumentsElementParamUse(x, y)
michael@0 289 {
michael@0 290 "use strict";
michael@0 291 arguments[0] = 3;
michael@0 292 assertEq(x, 1);
michael@0 293 return arguments[Math.random() ? "0" : 0]; // nix arguments[const] optimizations
michael@0 294 }
michael@0 295
michael@0 296 assertEq(strictAssignArgumentsElementParamUse(1), 3);
michael@0 297
michael@0 298 function strictNestedAssignShadowVar(p)
michael@0 299 {
michael@0 300 "use strict";
michael@0 301 function inner()
michael@0 302 {
michael@0 303 var p = 12;
michael@0 304 function innermost() { p = 1776; return 12; }
michael@0 305 return innermost();
michael@0 306 }
michael@0 307 return arguments;
michael@0 308 }
michael@0 309
michael@0 310 assertEq(arraysEqual(strictNestedAssignShadowVar(), []), true);
michael@0 311 assertEq(arraysEqual(strictNestedAssignShadowVar(99), [99]), true);
michael@0 312 assertEq(arraysEqual(strictNestedAssignShadowVar(""), [""]), true);
michael@0 313 assertEq(arraysEqual(strictNestedAssignShadowVar(obj), [obj]), true);
michael@0 314
michael@0 315 function strictNestedAssignShadowCatch(p)
michael@0 316 {
michael@0 317 "use strict";
michael@0 318 function inner()
michael@0 319 {
michael@0 320 try
michael@0 321 {
michael@0 322 }
michael@0 323 catch (p)
michael@0 324 {
michael@0 325 var f = function innermost() { p = 1776; return 12; };
michael@0 326 f();
michael@0 327 }
michael@0 328 }
michael@0 329 return arguments;
michael@0 330 }
michael@0 331
michael@0 332 assertEq(arraysEqual(strictNestedAssignShadowCatch(), []), true);
michael@0 333 assertEq(arraysEqual(strictNestedAssignShadowCatch(99), [99]), true);
michael@0 334 assertEq(arraysEqual(strictNestedAssignShadowCatch(""), [""]), true);
michael@0 335 assertEq(arraysEqual(strictNestedAssignShadowCatch(obj), [obj]), true);
michael@0 336
michael@0 337 function strictNestedAssignShadowCatchCall(p)
michael@0 338 {
michael@0 339 "use strict";
michael@0 340 function inner()
michael@0 341 {
michael@0 342 try
michael@0 343 {
michael@0 344 }
michael@0 345 catch (p)
michael@0 346 {
michael@0 347 var f = function innermost() { p = 1776; return 12; };
michael@0 348 f();
michael@0 349 }
michael@0 350 }
michael@0 351 inner();
michael@0 352 return arguments;
michael@0 353 }
michael@0 354
michael@0 355 assertEq(arraysEqual(strictNestedAssignShadowCatchCall(), []), true);
michael@0 356 assertEq(arraysEqual(strictNestedAssignShadowCatchCall(99), [99]), true);
michael@0 357 assertEq(arraysEqual(strictNestedAssignShadowCatchCall(""), [""]), true);
michael@0 358 assertEq(arraysEqual(strictNestedAssignShadowCatchCall(obj), [obj]), true);
michael@0 359
michael@0 360 function strictNestedAssignShadowFunction(p)
michael@0 361 {
michael@0 362 "use strict";
michael@0 363 function inner()
michael@0 364 {
michael@0 365 function p() { }
michael@0 366 p = 1776;
michael@0 367 }
michael@0 368 return arguments;
michael@0 369 }
michael@0 370
michael@0 371 assertEq(arraysEqual(strictNestedAssignShadowFunction(), []), true);
michael@0 372 assertEq(arraysEqual(strictNestedAssignShadowFunction(99), [99]), true);
michael@0 373 assertEq(arraysEqual(strictNestedAssignShadowFunction(""), [""]), true);
michael@0 374 assertEq(arraysEqual(strictNestedAssignShadowFunction(obj), [obj]), true);
michael@0 375
michael@0 376 function strictNestedAssignShadowFunctionCall(p)
michael@0 377 {
michael@0 378 "use strict";
michael@0 379 function inner()
michael@0 380 {
michael@0 381 function p() { }
michael@0 382 p = 1776;
michael@0 383 }
michael@0 384 return arguments;
michael@0 385 }
michael@0 386
michael@0 387 assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(), []), true);
michael@0 388 assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(99), [99]), true);
michael@0 389 assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(""), [""]), true);
michael@0 390 assertEq(arraysEqual(strictNestedAssignShadowFunctionCall(obj), [obj]), true);
michael@0 391
michael@0 392 function strictNestedShadowAndMaybeEval(code, p)
michael@0 393 {
michael@0 394 "use strict";
michael@0 395 function inner(p) { eval(code); }
michael@0 396 return arguments;
michael@0 397 }
michael@0 398
michael@0 399 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("1", 2), ["1", 2]), true);
michael@0 400 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments"), ["arguments"]), true);
michael@0 401 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("p = 2"), ["p = 2"]), true);
michael@0 402 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("p = 2", 17), ["p = 2", 17]), true);
michael@0 403 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
michael@0 404 assertEq(arraysEqual(strictNestedShadowAndMaybeEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
michael@0 405
michael@0 406 function strictNestedShadowAndEval(code, p)
michael@0 407 {
michael@0 408 "use strict";
michael@0 409 function inner(p) { eval(code); }
michael@0 410 return arguments;
michael@0 411 }
michael@0 412
michael@0 413 assertEq(arraysEqual(strictNestedShadowAndEval("1", 2), ["1", 2]), true);
michael@0 414 assertEq(arraysEqual(strictNestedShadowAndEval("arguments"), ["arguments"]), true);
michael@0 415 assertEq(arraysEqual(strictNestedShadowAndEval("p = 2"), ["p = 2"]), true);
michael@0 416 assertEq(arraysEqual(strictNestedShadowAndEval("p = 2", 17), ["p = 2", 17]), true);
michael@0 417 assertEq(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17"), ["arguments[0] = 17"]), true);
michael@0 418 assertEq(arraysEqual(strictNestedShadowAndEval("arguments[0] = 17", 42), ["arguments[0] = 17", 42]), true);
michael@0 419
michael@0 420 function strictEvalContainsMutation(code)
michael@0 421 {
michael@0 422 "use strict";
michael@0 423 return eval(code);
michael@0 424 }
michael@0 425
michael@0 426 assertEq(arraysEqual(strictEvalContainsMutation("code = 17; arguments"), ["code = 17; arguments"]), true);
michael@0 427 assertEq(arraysEqual(strictEvalContainsMutation("arguments[0] = 17; arguments"), [17]), true);
michael@0 428 assertEq(strictEvalContainsMutation("arguments[0] = 17; code"), "arguments[0] = 17; code");
michael@0 429
michael@0 430 function strictNestedAssignShadowFunctionName(p)
michael@0 431 {
michael@0 432 "use strict";
michael@0 433 function inner()
michael@0 434 {
michael@0 435 function p() { p = 1776; }
michael@0 436 p();
michael@0 437 }
michael@0 438 inner();
michael@0 439 return arguments;
michael@0 440 }
michael@0 441
michael@0 442 assertEq(arraysEqual(strictNestedAssignShadowFunctionName(), []), true);
michael@0 443 assertEq(arraysEqual(strictNestedAssignShadowFunctionName(99), [99]), true);
michael@0 444 assertEq(arraysEqual(strictNestedAssignShadowFunctionName(""), [""]), true);
michael@0 445 assertEq(arraysEqual(strictNestedAssignShadowFunctionName(obj), [obj]), true);
michael@0 446
michael@0 447
michael@0 448 /******************************************************************************/
michael@0 449
michael@0 450 if (typeof reportCompare === "function")
michael@0 451 reportCompare(true, true);
michael@0 452
michael@0 453 print("All tests passed!");

mercurial