Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| --fast-warmup
function testMegamorphic(proto) {
var g = newGlobal();
g.evaluate(`
function setElem(o, i, v) {
o[i] = v;
}
function getElem(o, i) {
return o[i];
}
function push(a, v) {
return a.push(v);
}
var objs = [];
for (var i = 0; i < 20; i++) {
var o = {};
o["p" + i] = i;
objs.push(o);
var a = [];
a["q" + i] = i;
objs.push(a);
}
for (var i = 0; i < 100; i++) {
for (var o of objs) {
setElem(o, 0, i);
assertEq(getElem(o, 1), undefined);
if (Array.isArray(o)) {
push(o, i);
o.length = 1;
}
}
}
var state = getFuseState();
assertEq(state.ObjectProtoHasNoIndexedPropsFuse.intact, true);
assertEq(state.ArrayProtoHasNoIndexedPropsFuse.intact, true);
if (${proto} === Array.prototype) {
push(Array.prototype, "x");
}
setElem(${proto}, 1, "x");
state = getFuseState();
assertEq(state.ObjectProtoHasNoIndexedPropsFuse.intact,
${proto} !== Object.prototype);
assertEq(state.ArrayProtoHasNoIndexedPropsFuse.intact, false);
for (var o of objs) {
var expected = (${proto} === Object.prototype || Array.isArray(o))
? "x" : undefined;
assertEq(getElem(o, 1), expected);
}
`);
}
testMegamorphic("Array.prototype");
testMegamorphic("Object.prototype");