From cd3829627d20f1e009dbbe2fe9dfefc839a4ac81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= <andre.bargull@gmail.com> Date: Mon, 18 May 2015 18:30:36 +0200 Subject: [PATCH] MOP operations on non-configurable arguments-object property Mapped arguments property is changed to non-configurable. Check arguments mapping works correctly when applying various MOP methods. --- .../mapped-arguments-nonconfigurable.js | 322 ++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100755 test/language/arguments-object/mapped-arguments-nonconfigurable.js diff --git a/test/language/arguments-object/mapped-arguments-nonconfigurable.js b/test/language/arguments-object/mapped-arguments-nonconfigurable.js new file mode 100755 index 0000000000..cf797a15a5 --- /dev/null +++ b/test/language/arguments-object/mapped-arguments-nonconfigurable.js @@ -0,0 +1,322 @@ +// Copyright (C) 2015 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +info: Mapped arguments object with non-configurable property +description: > + Mapped arguments property is changed to non-configurable. Check + arguments mapping works correctly when applying various MOP + methods. +includes: [assert.js] +flags: [noStrict] +---*/ + + +function argumentsNonConfigurable(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Mapping values are not changed when property was made non-configurable. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); +} +argumentsNonConfigurable(1); + +function argumentsAndSetMutableBinding(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Mapping works when property is non-configurable, variable is changed with SetMutableBinding. + a = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndSetMutableBinding(1); + +function argumentsAndDefineOwnProperty(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Mapping works when property is non-configurable, arguments property is changed with [[DefineOwnProperty]]. + Object.defineProperty(arguments, "0", {value: 2}); + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndDefineOwnProperty(1); + +function argumentsAndSet(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Mapping works when property is non-configurable, arguments property is changed with [[Set]]. + arguments[0] = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndSet(1); + +function argumentsAndDelete(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Property is non-configurable, [[Delete]] returns false. + assert.sameValue(delete arguments[0], false); + + // Mapping works when property is non-configurable, arguments property was not deleted. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); +} +argumentsAndDelete(1); + +function argumentsAndDeleteSetMutableBinding(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Property is non-configurable, [[Delete]] returns false. + assert.sameValue(delete arguments[0], false); + + // Mapping works when property is non-configurable, arguments property was not deleted. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Mapping works when property is non-configurable, variable is changed with SetMutableBinding. + a = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndDeleteSetMutableBinding(1); + +function argumentsAndDeleteDefineOwnProperty(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Property is non-configurable, [[Delete]] returns false. + assert.sameValue(delete arguments[0], false); + + // Mapping works when property is non-configurable, arguments property was not deleted. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Mapping works when property is non-configurable, arguments property is changed with [[DefineOwnProperty]]. + Object.defineProperty(arguments, "0", {value: 2}); + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndDeleteDefineOwnProperty(1); + +function argumentsAndDeleteSet(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Property is non-configurable, [[Delete]] returns false. + assert.sameValue(delete arguments[0], false); + + // Mapping works when property is non-configurable, arguments property was not deleted. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Mapping works when property is non-configurable, arguments property is changed with [[DefineOwnProperty]]. + arguments[0] = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndDeleteSet(1); + +function argumentsAndStrictDelete(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Property is non-configurable, [[Delete]] throws TypeError in strict mode. + var args = arguments; + assert.throws(TypeError, function() { "use strict"; delete args[0]; }); + + // Mapping works when property is non-configurable, arguments property was not deleted. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); +} +argumentsAndStrictDelete(1); + +function argumentsAndStrictDeleteSetMutableBinding(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Property is non-configurable, [[Delete]] throws TypeError in strict mode. + var args = arguments; + assert.throws(TypeError, function() { "use strict"; delete args[0]; }); + + // Mapping works when property is non-configurable, arguments property was not deleted. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Mapping works when property is non-configurable, variable is changed with SetMutableBinding. + a = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndStrictDeleteSetMutableBinding(1); + +function argumentsAndStrictDeleteDefineOwnProperty(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Property is non-configurable, [[Delete]] throws TypeError in strict mode. + var args = arguments; + assert.throws(TypeError, function() { "use strict"; delete args[0]; }); + + // Mapping works when property is non-configurable, arguments property was not deleted. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Mapping works when property is non-configurable, arguments property is changed with [[DefineOwnProperty]]. + Object.defineProperty(arguments, "0", {value: 2}); + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndStrictDeleteDefineOwnProperty(1); + +function argumentsAndStrictDeleteSet(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + + // Property is non-configurable, [[Delete]] throws TypeError in strict mode. + var args = arguments; + assert.throws(TypeError, function() { "use strict"; delete args[0]; }); + + // Mapping works when property is non-configurable, arguments property was not deleted. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Mapping works when property is non-configurable, arguments property is changed with [[DefineOwnProperty]]. + arguments[0] = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); +} +argumentsAndStrictDeleteSet(1); + +function argumentsNonConfigurableAndNonWritable(a) { + Object.defineProperty(arguments, "0", {configurable: false, writable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Arguments property is no longer mapped. + a = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 1); +} +argumentsNonConfigurableAndNonWritable(1); + +function argumentsNonConfigurableThenNonWritable(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + Object.defineProperty(arguments, "0", {writable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Arguments property is no longer mapped. + a = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 1); +} +argumentsNonConfigurableThenNonWritable(1); + +function argumentsNonConfigurableThenNonWritableWithInterveningSetMutableBinding(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + a = 2; + Object.defineProperty(arguments, "0", {writable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 1); + + // Arguments property is no longer mapped. + a = 3; + assert.sameValue(a, 3); + assert.sameValue(arguments[0], 1); +} +argumentsNonConfigurableThenNonWritableWithInterveningSetMutableBinding(1); + +function argumentsNonConfigurableThenNonWritableWithInterveningSet(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + arguments[0] = 2; + Object.defineProperty(arguments, "0", {writable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); + + // Arguments property is no longer mapped. + a = 3; + assert.sameValue(a, 3); + assert.sameValue(arguments[0], 2); +} +argumentsNonConfigurableThenNonWritableWithInterveningSet(1); + +function argumentsNonConfigurableThenNonWritableWithDefineOwnProperty(a) { + Object.defineProperty(arguments, "0", {configurable: false}); + Object.defineProperty(arguments, "0", {value: 2}); + Object.defineProperty(arguments, "0", {writable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 2); + + // Arguments property is no longer mapped. + a = 3; + assert.sameValue(a, 3); + assert.sameValue(arguments[0], 2); +} +argumentsNonConfigurableThenNonWritableWithDefineOwnProperty(1); + +function argumentsNonWritableThenNonConfigurable(a) { + Object.defineProperty(arguments, "0", {writable: false}); + Object.defineProperty(arguments, "0", {configurable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Arguments property is no longer mapped. + a = 2; + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 1); +} +argumentsNonWritableThenNonConfigurable(1); + +function argumentsNonWritableThenNonConfigurableWithInterveningSetMutableBinding(a) { + Object.defineProperty(arguments, "0", {writable: false}); + a = 2; + Object.defineProperty(arguments, "0", {configurable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 2); + assert.sameValue(arguments[0], 1); + + // Arguments property is no longer mapped. + a = 3; + assert.sameValue(a, 3); + assert.sameValue(arguments[0], 1); +} +argumentsNonWritableThenNonConfigurableWithInterveningSetMutableBinding(1); + +function argumentsNonWritableThenNonConfigurableWithInterveningSet(a) { + Object.defineProperty(arguments, "0", {writable: false}); + arguments[0] = 2; + Object.defineProperty(arguments, "0", {configurable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 1); + + // Arguments property is no longer mapped. + a = 3; + assert.sameValue(a, 3); + assert.sameValue(arguments[0], 1); +} +argumentsNonWritableThenNonConfigurableWithInterveningSet(1); + +function argumentsNonWritableThenNonConfigurableWithInterveningDefineOwnProperty(a) { + Object.defineProperty(arguments, "0", {writable: false}); + Object.defineProperty(arguments, "0", {value: 2}); + Object.defineProperty(arguments, "0", {configurable: false}); + + // Mapping is removed when property was made non-writable, values are not changed. + assert.sameValue(a, 1); + assert.sameValue(arguments[0], 2); + + // Arguments property is no longer mapped. + a = 3; + assert.sameValue(a, 3); + assert.sameValue(arguments[0], 2); +} +argumentsNonWritableThenNonConfigurableWithInterveningDefineOwnProperty(1); -- GitLab