blob: 684c43a990737ef9f7ac5f570e44cdb2ced0afff [file] [log] [blame]
description(
"Tests that constant folding an access to an uncaptured variable that is captured later in the same basic block doesn't lead to assertion failures."
);
var thingy = 456;
function bar() {
return thingy;
}
function baz(a) {
if (a) // Here we have an access to r2. The bug was concerned with our assertions thinking that this access was invalid.
return arguments; // Force r2 (see below) to get captured.
}
function foo(p, a) {
// The temporary variable corresponding to the 'bar' callee coming out of the ternary expression will be allocated by
// the bytecompiler to some virtual register, say r2. This expression is engineered so that (1) the virtual register
// chosen for the callee here is the same as the one that will be chosen for the first non-this argument below,
// (2) that the callee ends up being constant but requires CFA to prove it, and (3) that we actually load that constant
// using GetLocal (which happens because of the CheckFunction to check the callee).
var x = (a + 1) + (p ? bar : bar)();
// The temporary variable corresponding to the first non-this argument to baz will be allocated to the same virtual
// register (i.e. r2).
return baz(x);
}
dfgShouldBe(foo, "foo(true, 5)[0]", "462");