Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| --setpref=objectfuse_for_global=true
function markConstant(obj, key) {
assertEq(getObjectFuseState(obj).properties[key], "Untracked");
// This relies on the fact that storing to an Untracked property marks it
// Constant. Use getOwnPropertyDescriptor to prevent interacting with JIT
// optimizations.
obj[key] = Object.getOwnPropertyDescriptor(obj, key).value;
}
function testGlobal() {
var g = newGlobal({sameCompartmentAs: this, useWindowProxy: false});
assertEq(getObjectFuseState(g).generation, 0);
// Ensure global variables are marked untracked or constant.
g.evaluate("var foo = 1; var bar; bar = function() {}; function baz() {};");
var state = getObjectFuseState(g);
assertEq(state.properties.foo, "Constant");
assertEq(state.properties.bar, "Constant");
assertEq(state.properties.baz, "Untracked");
// Shadowing a non-constant global on the lexical environment doesn't change
// the generation.
g.evaluate("let Object = {};");
assertEq(getObjectFuseState(g).generation, 0);
// Shadowing a constant property does change the generation.
markConstant(g, "Function");
g.evaluate("let Function = {};");
assertEq(getObjectFuseState(g).generation, 1);
// Shadowing a no-longer-constant property must also change the generation because
// IC stubs may still have guards for this property.
g.Math = 1;
g.Math = 2;
g.evaluate("let Math = {};");
assertEq(getObjectFuseState(g).generation, 2);
}
testGlobal();
testGlobal();