| Index: test/mjsunit/object-seal.js
|
| diff --git a/test/mjsunit/object-seal.js b/test/mjsunit/object-seal.js
|
| index 3afddb9d60ccbcdf273e349618a4e353724a4114..3c46ab236cda0154e0ba71311bcc04123eab2735 100644
|
| --- a/test/mjsunit/object-seal.js
|
| +++ b/test/mjsunit/object-seal.js
|
| @@ -267,3 +267,132 @@ assertDoesNotThrow(function() { obj.splice(1,2,1,2); });
|
| assertDoesNotThrow(function() { obj.splice(1,2000,1,2); });
|
| assertThrows(function() { obj.splice(0,0,1); }, TypeError);
|
| assertThrows(function() { obj.splice(1,2000,1,2,3); }, TypeError);
|
| +
|
| +// Test that the enumerable attribute is unperturbed by sealing.
|
| +obj = { x: 42, y: 'foo' };
|
| +Object.defineProperty(obj, 'y', {enumerable: false});
|
| +Object.seal(obj);
|
| +assertTrue(Object.isSealed(obj));
|
| +assertFalse(Object.isFrozen(obj));
|
| +desc = Object.getOwnPropertyDescriptor(obj, 'x');
|
| +assertTrue(desc.enumerable);
|
| +desc = Object.getOwnPropertyDescriptor(obj, 'y');
|
| +assertFalse(desc.enumerable);
|
| +
|
| +// Fast properties should remain fast
|
| +obj = { x: 42, y: 'foo' };
|
| +assertTrue(%HasFastProperties(obj));
|
| +Object.seal(obj);
|
| +assertTrue(Object.isSealed(obj));
|
| +assertFalse(Object.isFrozen(obj));
|
| +assertTrue(%HasFastProperties(obj));
|
| +
|
| +// Sealed objects should share maps where possible
|
| +obj = { prop1: 1, prop2: 2 };
|
| +obj2 = { prop1: 3, prop2: 4 };
|
| +assertTrue(%HaveSameMap(obj, obj2));
|
| +Object.seal(obj);
|
| +Object.seal(obj2);
|
| +assertTrue(Object.isSealed(obj));
|
| +assertTrue(Object.isSealed(obj2));
|
| +assertFalse(Object.isFrozen(obj));
|
| +assertFalse(Object.isFrozen(obj2));
|
| +assertTrue(%HaveSameMap(obj, obj2));
|
| +
|
| +// Sealed objects should share maps even when they have elements
|
| +obj = { prop1: 1, prop2: 2, 75: 'foo' };
|
| +obj2 = { prop1: 3, prop2: 4, 150: 'bar' };
|
| +assertTrue(%HaveSameMap(obj, obj2));
|
| +Object.seal(obj);
|
| +Object.seal(obj2);
|
| +assertTrue(Object.isSealed(obj));
|
| +assertTrue(Object.isSealed(obj2));
|
| +assertFalse(Object.isFrozen(obj));
|
| +assertFalse(Object.isFrozen(obj));
|
| +assertTrue(%HaveSameMap(obj, obj2));
|
| +
|
| +// Setting elements after sealing should not be allowed
|
| +obj = { prop: 'thing' };
|
| +Object.seal(obj);
|
| +assertTrue(Object.isSealed(obj));
|
| +assertFalse(Object.isFrozen(obj));
|
| +obj[0] = 'hello';
|
| +assertFalse(obj.hasOwnProperty(0));
|
| +
|
| +// Sealing an object in dictionary mode should work
|
| +// Also testing that getter/setter properties work after sealing
|
| +obj = { };
|
| +for (var i = 0; i < 100; ++i) {
|
| + obj['x' + i] = i;
|
| +}
|
| +var accessorDidRun = false;
|
| +Object.defineProperty(obj, 'accessor', {
|
| + get: function() { return 42 },
|
| + set: function() { accessorDidRun = true },
|
| + configurable: true,
|
| + enumerable: true
|
| +});
|
| +
|
| +assertFalse(%HasFastProperties(obj));
|
| +Object.seal(obj);
|
| +assertFalse(%HasFastProperties(obj));
|
| +assertTrue(Object.isSealed(obj));
|
| +assertFalse(Object.isFrozen(obj));
|
| +assertFalse(Object.isExtensible(obj));
|
| +for (var i = 0; i < 100; ++i) {
|
| + desc = Object.getOwnPropertyDescriptor(obj, 'x' + i);
|
| + assertFalse(desc.configurable);
|
| +}
|
| +assertEquals(42, obj.accessor);
|
| +assertFalse(accessorDidRun);
|
| +obj.accessor = 'ignored value';
|
| +assertTrue(accessorDidRun);
|
| +
|
| +// Sealing arguments should work
|
| +var func = function(arg) {
|
| + Object.seal(arguments);
|
| + assertTrue(Object.isSealed(arguments));
|
| +};
|
| +func('hello', 'world');
|
| +func('goodbye', 'world');
|
| +
|
| +// Sealing sparse arrays
|
| +var sparseArr = [0, 1];
|
| +sparseArr[10000] = 10000;
|
| +Object.seal(sparseArr);
|
| +assertTrue(Object.isSealed(sparseArr));
|
| +
|
| +// Accessors on fast object should behavior properly after sealing
|
| +obj = {};
|
| +Object.defineProperty(obj, 'accessor', {
|
| + get: function() { return 42 },
|
| + set: function() { accessorDidRun = true },
|
| + configurable: true,
|
| + enumerable: true
|
| +});
|
| +assertTrue(%HasFastProperties(obj));
|
| +Object.seal(obj);
|
| +assertTrue(Object.isSealed(obj));
|
| +assertTrue(%HasFastProperties(obj));
|
| +assertEquals(42, obj.accessor);
|
| +accessorDidRun = false;
|
| +obj.accessor = 'ignored value';
|
| +assertTrue(accessorDidRun);
|
| +
|
| +// Test for regression in mixed accessor/data property objects.
|
| +// The strict function is one such object.
|
| +assertTrue(Object.isSealed(Object.seal(function(){"use strict";})));
|
| +
|
| +// Also test a simpler case
|
| +obj = {};
|
| +Object.defineProperty(obj, 'accessor2', {
|
| + get: function() { return 42 },
|
| + set: function() { accessorDidRun = true },
|
| + configurable: true,
|
| + enumerable: true
|
| +});
|
| +obj.data = 'foo';
|
| +assertTrue(%HasFastProperties(obj));
|
| +Object.seal(obj);
|
| +assertTrue(%HasFastProperties(obj));
|
| +assertTrue(Object.isSealed(obj));
|
|
|