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.

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

mercurial