Source code

Revision control

Copy as Markdown

Other Tools

function testNonExtensibleStoreFallibleT() {
// Create an array with initialized-length = capacity = 2.
var x = [8, 0];
// Make it non-extensible.
Object.preventExtensions(x);
// Now reduce initialized-length by one, so that initialized-length < capacity is true.
x.length = 1;
// There's enough capacity in the elements storage to save the new element,
// but we still need to reject the store since the object is non-extensible.
x[1] = 4;
assertEq(x.length, 1);
assertEq(x[0], 8);
}
for (var i = 0; i < 15; ++i)
testNonExtensibleStoreFallibleT();
// Repeat testNonExtensibleStoreFallibleT for the MIRType::Value specialization.
function testNonExtensibleStoreFallibleV(i) {
// Create an array with initialized-length = capacity = 2.
var x = [8, ""];
// Make it non-extensible.
Object.preventExtensions(x);
// Now reduce initialized-length by one, so that initialized-length < capacity is true.
x.length = 1;
// There's enough capacity in the elements storage to save the new element,
// but we still need to reject the store since the object is non-extensible.
x[1] = [true, 1][i & 1];
assertEq(x.length, 1);
assertEq(x[0], 8);
}
for (var i = 0; i < 15; ++i)
testNonExtensibleStoreFallibleV(i);
function testForInIterationNonExtensibleStoreFallibleT() {
// Create an array with initialized-length = capacity = 2.
var x = [8, 0];
// Make it non-extensible.
Object.preventExtensions(x);
// Modifying an array's length takes a different path during for-in
// iteration of the array.
for (var k in x) {
// Now reduce initialized-length by one, so that initialized-length < capacity is true.
x.length = 1;
}
// There's enough capacity in the elements storage to save the new element,
// but we still need to reject the store since the object is non-extensible.
x[1] = 4;
assertEq(x.length, 1);
assertEq(x[0], 8);
}
for (var i = 0; i < 15; ++i)
testForInIterationNonExtensibleStoreFallibleT();
// Repeat testForInIterationNonExtensibleStoreFallibleT for the MIRType::Value specialization.
function testForInIterationNonExtensibleStoreFallibleV(i) {
// Create an array with initialized-length = capacity = 2.
var x = [8, ""];
// Make it non-extensible.
Object.preventExtensions(x);
// Modifying an array's length takes a different path during for-in
// iteration of the array.
for (var k in x) {
// Now reduce initialized-length by one, so that initialized-length < capacity is true.
x.length = 1;
break;
}
// There's enough capacity in the elements storage to save the new element,
// but we still need to reject the store since the object is non-extensible.
x[1] = [true, 1][i & 1];
assertEq(x.length, 1);
assertEq(x[0], 8);
}
for (var i = 0; i < 15; ++i)
testForInIterationNonExtensibleStoreFallibleV(i);
function testNonExtensibleArrayPop() {
// Create an array with initialized-length = capacity = 2.
var x = [8, 0];
// Make it non-extensible.
Object.preventExtensions(x);
// Now reduce initialized-length by one, so that initialized-length < capacity is true.
x.pop();
// There's enough capacity in the elements storage to save the new element,
// but we still need to reject the store since the object is non-extensible.
x[1] = 4;
assertEq(x.length, 1);
assertEq(x[0], 8);
}
for (var i = 0; i < 15; ++i)
testNonExtensibleArrayPop();
function testNonExtensibleArrayPopNonWritable() {
// Create an array with initialized-length = capacity = 2.
var x = [8, 0];
// Make it non-extensible.
Object.preventExtensions(x);
// And make the "length" property non-writable.
Object.defineProperty(x, "length", {writable: false});
// Now reduce initialized-length by one, so that initialized-length < capacity is true.
// This doesn't update |x.length|, because the "length" property is non-writable.
try {
x.pop();
} catch {}
// There's enough capacity in the elements storage to save the new element,
// but we still need to reject the store since the object is non-extensible.
for (var i = 0; i < 100; ++i)
x[1] = 4;
assertEq(x.length, 2);
assertEq(x[0], 8);
assertEq(x[1], undefined);
assertEq(1 in x, false);
}
for (var i = 0; i < 15; ++i)
testNonExtensibleArrayPopNonWritable();
function testNonExtensibleArrayShift() {
// Create an array with initialized-length = capacity = 2.
var x = [8, 0];
// Make it non-extensible.
Object.preventExtensions(x);
// Now reduce initialized-length by one, so that initialized-length < capacity is true.
x.shift();
// There's enough capacity in the elements storage to save the new element,
// but we still need to reject the store since the object is non-extensible.
x[1] = 4;
assertEq(x.length, 1);
assertEq(x[0], 0);
}
for (var i = 0; i < 15; ++i)
testNonExtensibleArrayShift();
function testNonExtensibleArraySplice() {
// Create an array with initialized-length = capacity = 2.
var x = [8, 0];
// Make it non-extensible.
Object.preventExtensions(x);
// Now reduce initialized-length by one, so that initialized-length < capacity is true.
x.splice(1, 1);
// There's enough capacity in the elements storage to save the new element,
// but we still need to reject the store since the object is non-extensible.
x[1] = 4;
assertEq(x.length, 1);
assertEq(x[0], 8);
}
for (var i = 0; i < 15; ++i)
testNonExtensibleArraySplice();