Source code

Revision control

Copy as Markdown

Other Tools

// Test reading and setting values on "hollow" debug scopes. In testGet and
// testSet below, f and g *must* be called from a non-heavyweight lambda to
// trigger the creation of the "hollow" debug scopes for the missing scopes.
//
// The reason is that a direct call to f or g that accesses a in testGet or
// testSet's frame is actually recoverable. The Debugger can synthesize a scope
// based on the frame. By contorting through a lambda, it becomes unsound to
// synthesize a scope based on the lambda function's frame. Since f and g are
// accessing a, which is itself free inside the lambda, the Debugger has no way
// to tell if the on-stack testGet or testSet frame is the frame that *would
// have* allocated a scope for the lambda, *had the lambda been heavyweight*.
//
// More concretely, if the inner lambda were returned from testGet and testSet,
// then called from a different invocation of testGet or testSet, it becomes
// obvious that it is incorrect to synthesize a scope based on the frame of
// that different invocation.
load(libdir + "evalInFrame.js");
function f() {
// Eval one frame up. Nothing aliases a.
evalInFrame(1, "print(a)");
}
function g() {
evalInFrame(1, "a = 43");
}
function testGet() {
{
let a = 42;
(function () { f(); })();
}
}
function testSet() {
{
let a = 42;
(function () { g(); })();
}
}
var log = "";
try {
testGet();
} catch (e) {
// Throws due to a having been optimized out.
log += "g";
}
try {
testSet();
} catch (e) {
// Throws due to a having been optimized out.
log += "s";
}
assertEq(log, "gs");