66 lines
1000 B
JavaScript
66 lines
1000 B
JavaScript
function assert(b) {
|
|
if (!b)
|
|
throw new Error("bad");
|
|
}
|
|
|
|
let alternateProto = {
|
|
get x() {
|
|
return null;
|
|
}
|
|
};
|
|
|
|
let alternateProto2 = {
|
|
get y() { return 22; },
|
|
get x() {
|
|
return null;
|
|
}
|
|
};
|
|
|
|
Object.defineProperty(Object.prototype, "x", {
|
|
get: function() { return this._x; }
|
|
});
|
|
|
|
function foo() {
|
|
class C {
|
|
constructor() {
|
|
this._x = 42;
|
|
}
|
|
};
|
|
return new C;
|
|
}
|
|
|
|
function validate(o, p) {
|
|
assert(o.x === p);
|
|
}
|
|
noInline(validate);
|
|
|
|
let arr = [];
|
|
foo();
|
|
for (let i = 0; i < 25; ++i)
|
|
arr.push(foo());
|
|
|
|
for (let i = 0; i < 100; ++i) {
|
|
for (let a of arr)
|
|
validate(a, 42);
|
|
}
|
|
|
|
for (let a of arr) {
|
|
a.__proto__ = alternateProto;
|
|
}
|
|
for (let i = 0; i < 100; ++i) {
|
|
for (let a of arr) {
|
|
validate(a, null);
|
|
}
|
|
}
|
|
|
|
for (let a of arr) {
|
|
a.__proto__ = alternateProto2;
|
|
}
|
|
|
|
for (let i = 0; i < 100; ++i) {
|
|
for (let a of arr) {
|
|
validate(a, null);
|
|
assert(a.y === 22);
|
|
}
|
|
}
|