| Index: test/webkit/fast/js/arguments.js
|
| diff --git a/test/webkit/fast/js/arguments.js b/test/webkit/fast/js/arguments.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f5b3abfdfb5078e69e31456a8344b494d0a67a51
|
| --- /dev/null
|
| +++ b/test/webkit/fast/js/arguments.js
|
| @@ -0,0 +1,689 @@
|
| +// Copyright 2013 the V8 project authors. All rights reserved.
|
| +// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
|
| +//
|
| +// Redistribution and use in source and binary forms, with or without
|
| +// modification, are permitted provided that the following conditions
|
| +// are met:
|
| +// 1. Redistributions of source code must retain the above copyright
|
| +// notice, this list of conditions and the following disclaimer.
|
| +// 2. Redistributions in binary form must reproduce the above copyright
|
| +// notice, this list of conditions and the following disclaimer in the
|
| +// documentation and/or other materials provided with the distribution.
|
| +//
|
| +// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
|
| +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
| +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
| +// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
| +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
| +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
| +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
| +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
| +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +description(
|
| +"This test thoroughly checks the behaviour of the 'arguments' object."
|
| +);
|
| +
|
| +function access_1(a, b, c)
|
| +{
|
| + return arguments[0];
|
| +}
|
| +
|
| +function access_2(a, b, c)
|
| +{
|
| + return arguments[1];
|
| +}
|
| +
|
| +function access_3(a, b, c)
|
| +{
|
| + return arguments[2];
|
| +}
|
| +
|
| +function access_4(a, b, c)
|
| +{
|
| + return arguments[3];
|
| +}
|
| +
|
| +function access_5(a, b, c)
|
| +{
|
| + return arguments[4];
|
| +}
|
| +
|
| +function argumentLengthIs5() {
|
| + arguments.length = 5;
|
| + return arguments.length;
|
| +}
|
| +
|
| +function duplicateArgumentAndReturnLast_call(a) {
|
| + Array.prototype.push.call(arguments, a);
|
| + return arguments[1];
|
| +}
|
| +
|
| +function duplicateArgumentAndReturnFirst_call(a) {
|
| + Array.prototype.push.call(arguments, a);
|
| + return arguments[0];
|
| +}
|
| +
|
| +function duplicateArgumentAndReturnLast_apply(a) {
|
| + Array.prototype.push.apply(arguments, arguments);
|
| + return arguments[1];
|
| +}
|
| +
|
| +function duplicateArgumentAndReturnFirst_apply(a) {
|
| + Array.prototype.push.apply(arguments, arguments);
|
| + return arguments[0];
|
| +}
|
| +
|
| +shouldBe("access_1(1, 2, 3)", "1");
|
| +shouldBe("access_2(1, 2, 3)", "2");
|
| +shouldBe("access_3(1, 2, 3)", "3");
|
| +shouldBe("access_4(1, 2, 3)", "undefined");
|
| +shouldBe("access_5(1, 2, 3)", "undefined");
|
| +
|
| +shouldBe("access_1(1)", "1");
|
| +shouldBe("access_2(1)", "undefined");
|
| +shouldBe("access_3(1)", "undefined");
|
| +shouldBe("access_4(1)", "undefined");
|
| +shouldBe("access_5(1)", "undefined");
|
| +
|
| +shouldBe("access_1(1, 2, 3, 4, 5)", "1");
|
| +shouldBe("access_2(1, 2, 3, 4, 5)", "2");
|
| +shouldBe("access_3(1, 2, 3, 4, 5)", "3");
|
| +shouldBe("access_4(1, 2, 3, 4, 5)", "4");
|
| +shouldBe("access_5(1, 2, 3, 4, 5)", "5");
|
| +
|
| +shouldBe("argumentLengthIs5()", "5");
|
| +shouldBe("argumentLengthIs5(1,2,3,4,5)", "5");
|
| +shouldBe("argumentLengthIs5(1,2,3,4,5,6,7,8,9,10)", "5");
|
| +shouldBe("duplicateArgumentAndReturnLast_call(1)", "1");
|
| +shouldBe("duplicateArgumentAndReturnFirst_call(1)", "1");
|
| +shouldBe("duplicateArgumentAndReturnLast_apply(1)", "1");
|
| +shouldBe("duplicateArgumentAndReturnFirst_apply(1)", "1");
|
| +
|
| +function f(a, b, c)
|
| +{
|
| + return arguments;
|
| +}
|
| +
|
| +function tear_off_equal_access_1(a, b, c)
|
| +{
|
| + return f(a, b, c)[0];
|
| +}
|
| +
|
| +function tear_off_equal_access_2(a, b, c)
|
| +{
|
| + return f(a, b, c)[1];
|
| +}
|
| +
|
| +function tear_off_equal_access_3(a, b, c)
|
| +{
|
| + return f(a, b, c)[2];
|
| +}
|
| +
|
| +function tear_off_equal_access_4(a, b, c)
|
| +{
|
| + return f(a, b, c)[3];
|
| +}
|
| +
|
| +function tear_off_equal_access_5(a, b, c)
|
| +{
|
| + return f(a, b, c)[4];
|
| +}
|
| +
|
| +shouldBe("tear_off_equal_access_1(1, 2, 3)", "1");
|
| +shouldBe("tear_off_equal_access_2(1, 2, 3)", "2");
|
| +shouldBe("tear_off_equal_access_3(1, 2, 3)", "3");
|
| +shouldBe("tear_off_equal_access_4(1, 2, 3)", "undefined");
|
| +shouldBe("tear_off_equal_access_5(1, 2, 3)", "undefined");
|
| +
|
| +function tear_off_too_few_access_1(a)
|
| +{
|
| + return f(a)[0];
|
| +}
|
| +
|
| +function tear_off_too_few_access_2(a)
|
| +{
|
| + return f(a)[1];
|
| +}
|
| +
|
| +function tear_off_too_few_access_3(a)
|
| +{
|
| + return f(a)[2];
|
| +}
|
| +
|
| +function tear_off_too_few_access_4(a)
|
| +{
|
| + return f(a)[3];
|
| +}
|
| +
|
| +function tear_off_too_few_access_5(a)
|
| +{
|
| + return f(a)[4];
|
| +}
|
| +
|
| +shouldBe("tear_off_too_few_access_1(1)", "1");
|
| +shouldBe("tear_off_too_few_access_2(1)", "undefined");
|
| +shouldBe("tear_off_too_few_access_3(1)", "undefined");
|
| +shouldBe("tear_off_too_few_access_4(1)", "undefined");
|
| +shouldBe("tear_off_too_few_access_5(1)", "undefined");
|
| +
|
| +function tear_off_too_many_access_1(a, b, c, d, e)
|
| +{
|
| + return f(a, b, c, d, e)[0];
|
| +}
|
| +
|
| +function tear_off_too_many_access_2(a, b, c, d, e)
|
| +{
|
| + return f(a, b, c, d, e)[1];
|
| +}
|
| +
|
| +function tear_off_too_many_access_3(a, b, c, d, e)
|
| +{
|
| + return f(a, b, c, d, e)[2];
|
| +}
|
| +
|
| +function tear_off_too_many_access_4(a, b, c, d, e)
|
| +{
|
| + return f(a, b, c, d, e)[3];
|
| +}
|
| +
|
| +function tear_off_too_many_access_5(a, b, c, d, e)
|
| +{
|
| + return f(a, b, c, d, e)[4];
|
| +}
|
| +
|
| +shouldBe("tear_off_too_many_access_1(1, 2, 3, 4, 5)", "1");
|
| +shouldBe("tear_off_too_many_access_2(1, 2, 3, 4, 5)", "2");
|
| +shouldBe("tear_off_too_many_access_3(1, 2, 3, 4, 5)", "3");
|
| +shouldBe("tear_off_too_many_access_4(1, 2, 3, 4, 5)", "4");
|
| +shouldBe("tear_off_too_many_access_5(1, 2, 3, 4, 5)", "5");
|
| +
|
| +function live_1(a, b, c)
|
| +{
|
| + arguments[0] = 1;
|
| + return a;
|
| +}
|
| +
|
| +function live_2(a, b, c)
|
| +{
|
| + arguments[1] = 2;
|
| + return b;
|
| +}
|
| +
|
| +function live_3(a, b, c)
|
| +{
|
| + arguments[2] = 3;
|
| + return c;
|
| +}
|
| +
|
| +shouldBe("live_1(0, 2, 3)", "1");
|
| +shouldBe("live_2(1, 0, 3)", "2");
|
| +shouldBe("live_3(1, 2, 0)", "3");
|
| +
|
| +// Arguments that were not provided are not live
|
| +shouldBe("live_1(0)", "1");
|
| +shouldBe("live_2(1)", "undefined");
|
| +shouldBe("live_3(1)", "undefined");
|
| +
|
| +shouldBe("live_1(0, 2, 3, 4, 5)", "1");
|
| +shouldBe("live_2(1, 0, 3, 4, 5)", "2");
|
| +shouldBe("live_3(1, 2, 0, 4, 5)", "3");
|
| +
|
| +function extra_args_modify_4(a, b, c)
|
| +{
|
| + arguments[3] = 4;
|
| + return arguments[3];
|
| +}
|
| +
|
| +function extra_args_modify_5(a, b, c)
|
| +{
|
| + arguments[4] = 5;
|
| + return arguments[4];
|
| +}
|
| +
|
| +shouldBe("extra_args_modify_4(1, 2, 3, 0, 5)", "4");
|
| +shouldBe("extra_args_modify_5(1, 2, 3, 4, 0)", "5");
|
| +
|
| +function tear_off_live_1(a, b, c)
|
| +{
|
| + var args = arguments;
|
| + return function()
|
| + {
|
| + args[0] = 1;
|
| + return a;
|
| + };
|
| +}
|
| +
|
| +function tear_off_live_2(a, b, c)
|
| +{
|
| + var args = arguments;
|
| + return function()
|
| + {
|
| + args[1] = 2;
|
| + return b;
|
| + };
|
| +}
|
| +
|
| +function tear_off_live_3(a, b, c)
|
| +{
|
| + var args = arguments;
|
| + return function()
|
| + {
|
| + args[2] = 3;
|
| + return c;
|
| + };
|
| +}
|
| +
|
| +shouldBe("tear_off_live_1(0, 2, 3)()", "1");
|
| +shouldBe("tear_off_live_2(1, 0, 3)()", "2");
|
| +shouldBe("tear_off_live_3(1, 2, 0)()", "3");
|
| +
|
| +// Arguments that were not provided are not live
|
| +shouldBe("tear_off_live_1(0)()", "1");
|
| +shouldBe("tear_off_live_2(1)()", "undefined");
|
| +shouldBe("tear_off_live_3(1)()", "undefined");
|
| +
|
| +shouldBe("tear_off_live_1(0, 2, 3, 4, 5)()", "1");
|
| +shouldBe("tear_off_live_2(1, 0, 3, 4, 5)()", "2");
|
| +shouldBe("tear_off_live_3(1, 2, 0, 4, 5)()", "3");
|
| +
|
| +function tear_off_extra_args_modify_4(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + arguments[3] = 4;
|
| + return arguments[3];
|
| + }
|
| +}
|
| +
|
| +function tear_off_extra_args_modify_5(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + arguments[4] = 5;
|
| + return arguments[4];
|
| + }
|
| +}
|
| +
|
| +shouldBe("tear_off_extra_args_modify_4(1, 2, 3, 0, 5)()", "4");
|
| +shouldBe("tear_off_extra_args_modify_5(1, 2, 3, 4, 0)()", "5");
|
| +
|
| +function delete_1(a, b, c)
|
| +{
|
| + delete arguments[0];
|
| + return arguments[0];
|
| +}
|
| +
|
| +function delete_2(a, b, c)
|
| +{
|
| + delete arguments[1];
|
| + return arguments[1];
|
| +}
|
| +
|
| +function delete_3(a, b, c)
|
| +{
|
| + delete arguments[2];
|
| + return arguments[2];
|
| +}
|
| +
|
| +function delete_4(a, b, c)
|
| +{
|
| + delete arguments[3];
|
| + return arguments[3];
|
| +}
|
| +
|
| +function delete_5(a, b, c)
|
| +{
|
| + delete arguments[4];
|
| + return arguments[4];
|
| +}
|
| +
|
| +shouldBe("delete_1(1, 2, 3)", "undefined");
|
| +shouldBe("delete_2(1, 2, 3)", "undefined");
|
| +shouldBe("delete_3(1, 2, 3)", "undefined");
|
| +shouldBe("delete_4(1, 2, 3)", "undefined");
|
| +shouldBe("delete_5(1, 2, 3)", "undefined");
|
| +
|
| +shouldBe("delete_1(1)", "undefined");
|
| +shouldBe("delete_2(1)", "undefined");
|
| +shouldBe("delete_3(1)", "undefined");
|
| +shouldBe("delete_4(1)", "undefined");
|
| +shouldBe("delete_5(1)", "undefined");
|
| +
|
| +shouldBe("delete_1(1, 2, 3, 4, 5)", "undefined");
|
| +shouldBe("delete_2(1, 2, 3, 4, 5)", "undefined");
|
| +shouldBe("delete_3(1, 2, 3, 4, 5)", "undefined");
|
| +shouldBe("delete_4(1, 2, 3, 4, 5)", "undefined");
|
| +shouldBe("delete_5(1, 2, 3, 4, 5)", "undefined");
|
| +
|
| +function tear_off_delete_1(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + delete arguments[0];
|
| + return arguments[0];
|
| + };
|
| +}
|
| +
|
| +function tear_off_delete_2(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + delete arguments[1];
|
| + return arguments[1];
|
| + };
|
| +}
|
| +
|
| +function tear_off_delete_3(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + delete arguments[2];
|
| + return arguments[2];
|
| + };
|
| +}
|
| +
|
| +function tear_off_delete_4(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + delete arguments[3];
|
| + return arguments[3];
|
| + };
|
| +}
|
| +
|
| +function tear_off_delete_5(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + delete arguments[4];
|
| + return arguments[4];
|
| + };
|
| +}
|
| +
|
| +shouldBe("tear_off_delete_1(1, 2, 3)()", "undefined");
|
| +shouldBe("tear_off_delete_2(1, 2, 3)()", "undefined");
|
| +shouldBe("tear_off_delete_3(1, 2, 3)()", "undefined");
|
| +shouldBe("tear_off_delete_4(1, 2, 3)()", "undefined");
|
| +shouldBe("tear_off_delete_5(1, 2, 3)()", "undefined");
|
| +
|
| +shouldBe("tear_off_delete_1(1)()", "undefined");
|
| +shouldBe("tear_off_delete_2(1)()", "undefined");
|
| +shouldBe("tear_off_delete_3(1)()", "undefined");
|
| +shouldBe("tear_off_delete_4(1)()", "undefined");
|
| +shouldBe("tear_off_delete_5(1)()", "undefined");
|
| +
|
| +shouldBe("tear_off_delete_1(1, 2, 3, 4, 5)()", "undefined");
|
| +shouldBe("tear_off_delete_2(1, 2, 3, 4, 5)()", "undefined");
|
| +shouldBe("tear_off_delete_3(1, 2, 3, 4, 5)()", "undefined");
|
| +shouldBe("tear_off_delete_4(1, 2, 3, 4, 5)()", "undefined");
|
| +shouldBe("tear_off_delete_5(1, 2, 3, 4, 5)()", "undefined");
|
| +
|
| +function delete_not_live_1(a, b, c)
|
| +{
|
| + delete arguments[0];
|
| + return a;
|
| +}
|
| +
|
| +function delete_not_live_2(a, b, c)
|
| +{
|
| + delete arguments[1];
|
| + return b;
|
| +}
|
| +
|
| +function delete_not_live_3(a, b, c)
|
| +{
|
| + delete arguments[2];
|
| + return c;
|
| +}
|
| +
|
| +shouldBe("delete_not_live_1(1, 2, 3)", "1");
|
| +shouldBe("delete_not_live_2(1, 2, 3)", "2");
|
| +shouldBe("delete_not_live_3(1, 2, 3)", "3");
|
| +
|
| +shouldBe("delete_not_live_1(1)", "1");
|
| +shouldBe("delete_not_live_2(1)", "undefined");
|
| +shouldBe("delete_not_live_3(1)", "undefined");
|
| +
|
| +shouldBe("delete_not_live_1(1, 2, 3, 4, 5)", "1");
|
| +shouldBe("delete_not_live_2(1, 2, 3, 4, 5)", "2");
|
| +shouldBe("delete_not_live_3(1, 2, 3, 4, 5)", "3");
|
| +
|
| +function tear_off_delete_not_live_1(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + delete arguments[0];
|
| + return a;
|
| + };
|
| +}
|
| +
|
| +function tear_off_delete_not_live_2(a, b, c)
|
| +{
|
| + return function ()
|
| + {
|
| + delete arguments[1];
|
| + return b;
|
| + };
|
| +}
|
| +
|
| +function tear_off_delete_not_live_3(a, b, c)
|
| +{
|
| + return function()
|
| + {
|
| + delete arguments[2];
|
| + return c;
|
| + };
|
| +}
|
| +
|
| +shouldBe("tear_off_delete_not_live_1(1, 2, 3)()", "1");
|
| +shouldBe("tear_off_delete_not_live_2(1, 2, 3)()", "2");
|
| +shouldBe("tear_off_delete_not_live_3(1, 2, 3)()", "3");
|
| +
|
| +shouldBe("tear_off_delete_not_live_1(1)()", "1");
|
| +shouldBe("tear_off_delete_not_live_2(1)()", "undefined");
|
| +shouldBe("tear_off_delete_not_live_3(1)()", "undefined");
|
| +
|
| +shouldBe("tear_off_delete_not_live_1(1, 2, 3, 4, 5)()", "1");
|
| +shouldBe("tear_off_delete_not_live_2(1, 2, 3, 4, 5)()", "2");
|
| +shouldBe("tear_off_delete_not_live_3(1, 2, 3, 4, 5)()", "3");
|
| +
|
| +function access_after_delete_named_2(a, b, c)
|
| +{
|
| + delete arguments[0];
|
| + return b;
|
| +}
|
| +
|
| +function access_after_delete_named_3(a, b, c)
|
| +{
|
| + delete arguments[0];
|
| + return c;
|
| +}
|
| +
|
| +function access_after_delete_named_4(a, b, c)
|
| +{
|
| + delete arguments[0];
|
| + return arguments[3];
|
| +}
|
| +
|
| +shouldBe("access_after_delete_named_2(1, 2, 3)", "2");
|
| +shouldBe("access_after_delete_named_3(1, 2, 3)", "3");
|
| +shouldBe("access_after_delete_named_4(1, 2, 3)", "undefined");
|
| +
|
| +shouldBe("access_after_delete_named_2(1)", "undefined");
|
| +shouldBe("access_after_delete_named_3(1)", "undefined");
|
| +shouldBe("access_after_delete_named_4(1)", "undefined");
|
| +
|
| +shouldBe("access_after_delete_named_2(1, 2, 3, 4)", "2");
|
| +shouldBe("access_after_delete_named_3(1, 2, 3, 4)", "3");
|
| +shouldBe("access_after_delete_named_4(1, 2, 3, 4)", "4");
|
| +
|
| +function access_after_delete_extra_1(a, b, c)
|
| +{
|
| + delete arguments[3];
|
| + return a;
|
| +}
|
| +
|
| +function access_after_delete_extra_2(a, b, c)
|
| +{
|
| + delete arguments[3];
|
| + return b;
|
| +}
|
| +
|
| +function access_after_delete_extra_3(a, b, c)
|
| +{
|
| + delete arguments[3];
|
| + return c;
|
| +}
|
| +
|
| +function access_after_delete_extra_5(a, b, c)
|
| +{
|
| + delete arguments[3];
|
| + return arguments[4];
|
| +}
|
| +
|
| +shouldBe("access_after_delete_extra_1(1, 2, 3)", "1");
|
| +shouldBe("access_after_delete_extra_2(1, 2, 3)", "2");
|
| +shouldBe("access_after_delete_extra_3(1, 2, 3)", "3");
|
| +shouldBe("access_after_delete_extra_5(1, 2, 3)", "undefined");
|
| +
|
| +shouldBe("access_after_delete_extra_1(1)", "1");
|
| +shouldBe("access_after_delete_extra_2(1)", "undefined");
|
| +shouldBe("access_after_delete_extra_3(1)", "undefined");
|
| +shouldBe("access_after_delete_extra_5(1)", "undefined");
|
| +
|
| +shouldBe("access_after_delete_extra_1(1, 2, 3, 4, 5)", "1");
|
| +shouldBe("access_after_delete_extra_2(1, 2, 3, 4, 5)", "2");
|
| +shouldBe("access_after_delete_extra_3(1, 2, 3, 4, 5)", "3");
|
| +shouldBe("access_after_delete_extra_5(1, 2, 3, 4, 5)", "5");
|
| +
|
| +function argumentsParam(arguments)
|
| +{
|
| + return arguments;
|
| +}
|
| +shouldBeTrue("argumentsParam(true)");
|
| +
|
| +var argumentsFunctionConstructorParam = new Function("arguments", "return arguments;");
|
| +shouldBeTrue("argumentsFunctionConstructorParam(true)");
|
| +
|
| +function argumentsVarUndefined()
|
| +{
|
| + var arguments;
|
| + return String(arguments);
|
| +}
|
| +shouldBe("argumentsVarUndefined()", "'[object Arguments]'");
|
| +
|
| +function argumentsConstUndefined()
|
| +{
|
| + const arguments;
|
| + return String(arguments);
|
| +}
|
| +shouldBe("argumentsConstUndefined()", "'[object Arguments]'");
|
| +
|
| +function argumentCalleeInException() {
|
| + try {
|
| + throw "";
|
| + } catch (e) {
|
| + return arguments.callee;
|
| + }
|
| +}
|
| +shouldBe("argumentCalleeInException()", "argumentCalleeInException")
|
| +
|
| +function shadowedArgumentsApply(arguments) {
|
| + return function(a){ return a; }.apply(null, arguments);
|
| +}
|
| +
|
| +function shadowedArgumentsLength(arguments) {
|
| + return arguments.length;
|
| +}
|
| +
|
| +function shadowedArgumentsCallee(arguments) {
|
| + return arguments.callee;
|
| +}
|
| +
|
| +function shadowedArgumentsIndex(arguments) {
|
| + return arguments[0]
|
| +}
|
| +
|
| +shouldBeTrue("shadowedArgumentsApply([true])");
|
| +shouldBe("shadowedArgumentsLength([])", '0');
|
| +shouldThrow("shadowedArgumentsLength()");
|
| +shouldBeUndefined("shadowedArgumentsCallee([])");
|
| +shouldBeTrue("shadowedArgumentsIndex([true])");
|
| +
|
| +descriptor = (function(){ return Object.getOwnPropertyDescriptor(arguments, 1); })("zero","one","two");
|
| +shouldBe("descriptor.value", '"one"');
|
| +shouldBe("descriptor.writable", 'true');
|
| +shouldBe("descriptor.enumerable", 'true');
|
| +shouldBe("descriptor.configurable", 'true');
|
| +
|
| +// Test cases for [[DefineOwnProperty]] applied to the arguments object.
|
| +(function(a0,a1,a2,a3){
|
| + Object.defineProperties(arguments, {
|
| + 1: { get: function(){ return 201; } },
|
| + 2: { value: 202, writable: false },
|
| + 3: { writable: false },
|
| + });
|
| +
|
| + // Test a0 is a live mapped argument.
|
| + shouldBeTrue(String( a0 === 100 ));
|
| + shouldBeTrue(String( arguments[0] === 100 ));
|
| + a0 = 300;
|
| + shouldBeTrue(String( a0 === 300 ));
|
| + shouldBeTrue(String( arguments[0] === 300 ));
|
| + arguments[0] = 400;
|
| + shouldBeTrue(String( a0 === 400 ));
|
| + shouldBeTrue(String( arguments[0] === 400 ));
|
| +
|
| + // When a1 is redefined as an accessor, it is no longer live.
|
| + shouldBeTrue(String( a1 === 101 ));
|
| + shouldBeTrue(String( arguments[1] === 201 ));
|
| + a1 = 301;
|
| + shouldBeTrue(String( a1 === 301 ));
|
| + shouldBeTrue(String( arguments[1] === 201 ));
|
| + arguments[1] = 401;
|
| + shouldBeTrue(String( a1 === 301 ));
|
| + shouldBeTrue(String( arguments[1] === 201 ));
|
| +
|
| + // When a2 is made read-only the value is set, but it is no longer live.
|
| + // (per 10.6 [[DefineOwnProperty]] 5.b.ii.1)
|
| + shouldBeTrue(String( a2 === 202 ));
|
| + shouldBeTrue(String( arguments[2] === 202 ));
|
| + a2 = 302;
|
| + shouldBeTrue(String( a2 === 302 ));
|
| + shouldBeTrue(String( arguments[2] === 202 ));
|
| + arguments[2] = 402;
|
| + shouldBeTrue(String( a2 === 302 ));
|
| + shouldBeTrue(String( arguments[2] === 202 ));
|
| +
|
| + // When a3 is made read-only, it is no longer live.
|
| + // (per 10.6 [[DefineOwnProperty]] 5.b.ii.1)
|
| + shouldBeTrue(String( a3 === 103 ));
|
| + shouldBeTrue(String( arguments[3] === 103 ));
|
| + a3 = 303;
|
| + shouldBeTrue(String( a3 === 303 ));
|
| + shouldBeTrue(String( arguments[3] === 103 ));
|
| + arguments[3] = 403;
|
| + shouldBeTrue(String( a3 === 303 ));
|
| + shouldBeTrue(String( arguments[3] === 103 ));
|
| +
|
| +})(100,101,102,103);
|
| +
|
| +// Test cases for [[DefineOwnProperty]] applied to the arguments object.
|
| +(function(arg){
|
| + shouldBeTrue(String( Object.getOwnPropertyDescriptor(arguments, 0).writable ));
|
| + shouldBeTrue(String( Object.getOwnPropertyDescriptor(arguments, 0).enumerable ));
|
| + Object.defineProperty(arguments, 0, { writable: false });
|
| + shouldBeFalse(String( Object.getOwnPropertyDescriptor(arguments, 0).writable ));
|
| + shouldBeTrue(String( Object.getOwnPropertyDescriptor(arguments, 0).enumerable ));
|
| + Object.defineProperty(arguments, 0, { enumerable: false });
|
| + shouldBeFalse(String( Object.getOwnPropertyDescriptor(arguments, 0).writable ));
|
| + shouldBeFalse(String( Object.getOwnPropertyDescriptor(arguments, 0).enumerable ));
|
| +
|
| + delete arguments[1];
|
| + shouldBeUndefined(String( Object.getOwnPropertyDescriptor(arguments, 1) ));
|
| + Object.defineProperty(arguments, 1, { writable: true });
|
| + shouldBeTrue(String( Object.getOwnPropertyDescriptor(arguments, 1).writable ));
|
| + shouldBeFalse(String( Object.getOwnPropertyDescriptor(arguments, 1).enumerable ));
|
| +})(0,1);
|
|
|