/* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ * Contributor: * Jeff Walden */ //----------------------------------------------------------------------------- var BUGNUMBER = 858381; var summary = "Array length redefinition behavior with non-configurable elements"; print(BUGNUMBER + ": " + summary); /************** * BEGIN TEST * **************/ function addDataProperty(obj, prop, value, enumerable, configurable, writable) { var desc = { enumerable: enumerable, configurable: configurable, writable: writable, value: value }; Object.defineProperty(obj, prop, desc); } function nonstrict() { var arr = [0, , 2, , , 5]; addDataProperty(arr, 31415926, "foo", true, true, true); addDataProperty(arr, 123456789, "bar", true, true, false); addDataProperty(arr, 8675309, "qux", false, true, true); addDataProperty(arr, 1735039, "eit", false, true, false); addDataProperty(arr, 987654321, "fun", false, true, false); // non-array indexes to spice things up addDataProperty(arr, "foopy", "sdfsd", false, false, false); addDataProperty(arr, 4294967296, "psych", true, false, false); addDataProperty(arr, 4294967295, "psych", true, false, false); addDataProperty(arr, 27182818, "eep", false, false, false); // Truncate...but only as far as possible. arr.length = 1; assertEq(arr.length, 27182819); var props = Object.getOwnPropertyNames(arr).sort(); var expected = ["0", "2", "5", "1735039", "8675309", "27182818", "foopy", "4294967296", "4294967295", "length"].sort(); assertEq(props.length, expected.length); for (var i = 0; i < props.length; i++) assertEq(props[i], expected[i], "unexpected property: " + props[i]); } nonstrict(); function strict() { "use strict"; var arr = [0, , 2, , , 5]; addDataProperty(arr, 31415926, "foo", true, true, true); addDataProperty(arr, 123456789, "bar", true, true, false); addDataProperty(arr, 8675309, "qux", false, true, true); addDataProperty(arr, 1735039, "eit", false, true, false); addDataProperty(arr, 987654321, "fun", false, true, false); // non-array indexes to spice things up addDataProperty(arr, "foopy", "sdfsd", false, false, false); addDataProperty(arr, 4294967296, "psych", true, false, false); addDataProperty(arr, 4294967295, "psych", true, false, false); addDataProperty(arr, 27182818, "eep", false, false, false); try { arr.length = 1; throw new Error("didn't throw?!"); } catch (e) { assertEq(e instanceof TypeError, true, "non-configurable property should trigger TypeError, got " + e); } assertEq(arr.length, 27182819); var props = Object.getOwnPropertyNames(arr).sort(); var expected = ["0", "2", "5", "1735039", "8675309", "27182818", "foopy", "4294967296", "4294967295", "length"].sort(); assertEq(props.length, expected.length); for (var i = 0; i < props.length; i++) assertEq(props[i], expected[i], "unexpected property: " + props[i]); } strict(); /******************************************************************************/ if (typeof reportCompare === "function") reportCompare(true, true); print("Tests complete");