//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- function write(v) { WScript.Echo(v + ""); } // Change arguments inside eval function ArgInEval1() { var old = arguments; eval('arguments="test1"'); write("old.length : " + old.length); write("arguments.length : " + arguments.length); write("Compare the two : " + (old === arguments)); } ArgInEval1(10); function ArgInEval2() { var old = arguments; eval('write(arguments); var arguments = "test2"; write(arguments);'); write("old.length : " + old.length); write("arguments.length : " + arguments.length); write("Compare the two : " + (old === arguments)); } ArgInEval2(10); function sameNameFormal(x, x) { var x = 999; write(arguments[0]); write(arguments[1]); } sameNameFormal(1, 2); function bug1127540(a, b, c, d) { eval("function foo(){return arguments.caller;}"); write("bug1127540: " + (foo() === arguments)); } bug1127540(1, 2, 3, 4) function DelArgs(a) { write(arguments[0]); delete arguments[0]; write(arguments[0]); arguments[0] = 2; write(arguments[0]); delete arguments[0]; write(arguments[0]); } DelArgs(1); // Parent function doesn't use arguments. Modify function.arguments in child function Func1(a, b, c) { a = "assignToFormal"; Func1.arguments[1] = "funcArgs[1]"; Func1_Helper(); write("Arguments : " + Func1.arguments[0] + " " + Func1.arguments[1] + " " + Func1.arguments[2]); write("Formals : " + a + " " + b + " " + c); } function Func1_Helper() { Func1.arguments[2] = "nested[2]"; write("In Helper : " + Func1.arguments[0] + " " + Func1.arguments[1] + " " + Func1.arguments[2]); } Func1("arg1", "arg2", "arg3"); // Parent function uses arguments. Modify function.arguments in child function Func2(a, b, c) { a = "assignToFormal"; Func2.arguments[1] = "funcArgs[1]"; arguments[2] = "arguments[2]"; Func2_Helper(); write("Arguments : " + Func2.arguments[0] + " " + Func2.arguments[1] + " " + Func2.arguments[2]); write("Formals : " + a + " " + b + " " + c); } function Func2_Helper() { Func2.arguments[2] = "nested[2]"; write("In Helper : " + Func2.arguments[0] + " " + Func2.arguments[1] + " " + Func2.arguments[2]); } Func2("arg1", "arg2", "arg3"); function argEscapes(x) { return arguments; } do { // Put this in a loop so we'll try to apply the scope-caching optimization. var argSave = argEscapes('First call'); WScript.Echo(argSave[0]); var argSave2 = argEscapes('Second call'); WScript.Echo(argSave[0]); WScript.Echo(argSave2[0]); } while(0); function argEscapesViaEval(x) { return eval('arguments'); } do { // Put this in a loop so we'll try to apply the scope-caching optimization. var argSave = argEscapesViaEval('First call'); WScript.Echo(argSave[0]); var argSave2 = argEscapesViaEval('Second call'); WScript.Echo(argSave[0]); WScript.Echo(argSave2[0]); } while(0);