1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
load(libdir + "asserts.js");
function test() {
var plainDataProperty = {
value: 0, enumerable: true, configurable: true, writable: true
};
var nonEnumerableProperty = {
value: 0, enumerable: false, configurable: true, writable: true
};
var nonConfigurableProperty = {
value: 0, enumerable: true, configurable: false, writable: true
};
var n = 5000;
for (var i = 0; i < n; ++i) {
var obj = {};
// Create a different shape for each object to ensure JSOP_INITELEM
// below can get into the megamorphic state.
Object.defineProperty(obj, "bar" + i, nonEnumerableProperty);
// Plain data property, will be created through DefineDataProperty,
// which is emitted as JSOP_INITELEM. The object doesn't have a "foo"
// property, so JSOP_INITELEM can simply create a new property.
Object.defineProperty(obj, "foo", plainDataProperty);
// Redefine as a non-data property for the last object.
var desc = (i + 1 !== n) ? plainDataProperty : nonConfigurableProperty;
Object.defineProperty(obj, "foo", desc);
// Again JSOP_INITELEM, but this time JSOP_INITELEM can't simply add a
// property, because "foo" is already present. And for the last object,
// which has a non-configurable "foo" property, this call must throw a
// TypeError exception.
Object.defineProperty(obj, "foo", plainDataProperty);
}
}
for (var i = 0; i < 2; ++i) {
assertThrowsInstanceOf(test, TypeError);
}
|