/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ var out = {}; function arr() { return Object.defineProperty([1, 2, 3, 4], 2, {configurable: false}); } function nonStrict1(out) { var a = out.array = arr(); a.length = 2; } function strict1(out) { "use strict"; var a = out.array = arr(); a.length = 2; return a; } out.array = null; nonStrict1(out); assertEq(deepEqual(out.array, [1, 2, 3]), true); out.array = null; try { strict1(out); throw "no error"; } catch (e) { assertEq(e instanceof TypeError, true, "expected TypeError, got " + e); } assertEq(deepEqual(out.array, [1, 2, 3]), true); // Internally, SpiderMonkey has two representations for arrays: // fast-but-inflexible, and slow-but-flexible. Adding a non-index property // to an array turns it into the latter. We should test on both kinds. function addx(obj) { obj.x = 5; return obj; } function nonStrict2(out) { var a = out.array = addx(arr()); a.length = 2; } function strict2(out) { "use strict"; var a = out.array = addx(arr()); a.length = 2; } out.array = null; nonStrict2(out); assertEq(deepEqual(out.array, addx([1, 2, 3])), true); out.array = null; try { strict2(out); throw "no error"; } catch (e) { assertEq(e instanceof TypeError, true, "expected TypeError, got " + e); } assertEq(deepEqual(out.array, addx([1, 2, 3])), true); if (typeof reportCompare === "function") reportCompare(true, true); print("Tests complete");