// check value of arguments inside recursion
var expected = [null,99,1,2,3,3,2,1,99,null];
var expno = 0;
var x = 0;
shouldBe("mf.arguments", "expected[expno++]");
function mf(a,b) {
shouldBe("mf.arguments[0]", "expected[expno++]");
x++;
if (x < 4)
mf(x,1);
shouldBe("mf.arguments[0]", "expected[expno++]");
return b;
}
mf(99);
shouldBe("mf.arguments", "expected[expno++]");
// check internal properties of arguments
// Delete
// DontEnum
var foundArgs = false;
var ReadOnlyOK = false;
var DontDeleteOK = false;
var DontEnumOK = false;
function f(a,b,c) {
// ReadOnly
var newargs = new Object();
f.arguments = newargs;
ReadOnlyOK = (f.arguments != newargs);
// DontDelete
DontDeleteOK = !delete(f.arguments);
if (f.arguments == undefined || !f.hasOwnProperty("arguments"))
DontDeleteOK = false;
// DontEnum
var foundArgs = false;
for (i in f) {
if (f == "arguments")
foundArgs = true;
}
DontEnumOK = !foundArgs;
}
f(1,2,3);
shouldBeTrue("ReadOnlyOK");
shouldBeTrue("DontDeleteOK");
shouldBeTrue("DontEnumOK");
// Check that parameter variables are bound to the corresponding
// elements in the arguments array
var arg0 = null;
var arg1 = null;
var arg2 = null;
var newarg0 = null;
var newarg1 = null;
var newarg2 = null;
var newx = null;
var arglength = 0;
function dupargs(x,x,x)
{
arg0 = arguments[0];
arg1 = arguments[1];
arg2 = arguments[2];
arglength = arguments.length;
x = 999;
newarg0 = arguments[0];
newarg1 = arguments[1];
newarg2 = arguments[2];
arguments[2] = 888;
newx = x;
}
dupargs(1,2,3);
shouldBe("arg0","1");
shouldBe("arg1","2");
shouldBe("arg2","3");
shouldBe("arglength","3");
shouldBe("newarg0","1");
shouldBe("newarg1","2");
shouldBe("newarg2","999");
shouldBe("newx","888");