// 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");
Messung V0.5
¤ Dauer der Verarbeitung: 0.19 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.