function bytecode(f) { if (typeof disassemble !== "function") return "unavailable"; var d = disassemble(f); return d.slice(d.indexOf("main:"), d.indexOf("\n\n")); } function hasGname(f, v) { // Do a try-catch that prints the full stack, so we can tell // _which_ part of this test failed. try { var b = bytecode(f); if (b != "unavailable") { assertEq(b.includes(`getgname "${v}"`), true); assertEq(b.includes(`getname "${v}"`), false); } } catch (e) { print(e.stack); throw e; } } var x = "outer"; var f1 = new Function("assertEq(x, 'outer')"); f1(); hasGname(f1, 'x'); setLazyParsingDisabled(true); var f2 = new Function("assertEq(x, 'outer')"); f2(); hasGname(f2, 'x'); setLazyParsingDisabled(false); { let x = "inner"; var f3 = new Function("assertEq(x, 'outer')"); f3(); hasGname(f3, 'x'); } setLazyParsingDisabled(true); { let x = "inner"; var f4 = new Function("assertEq(x, 'outer')"); f4(); hasGname(f4, 'x'); } setLazyParsingDisabled(false);