eval-scopes.js (1740B)
1 function bytecode(f) { 2 if (typeof disassemble !== "function") 3 return "unavailable"; 4 var d = disassemble(f); 5 return d.slice(d.indexOf("main:"), d.indexOf("\n\n")); 6 } 7 8 function hasGname(f, v, hasIt = true) { 9 // Do a try-catch that prints the full stack, so we can tell 10 // _which_ part of this test failed. 11 try { 12 var b = bytecode(f); 13 if (b != "unavailable") { 14 assertEq(b.includes(`GetGName "${v}"`), hasIt); 15 assertEq(b.includes(`GetName "${v}"`), !hasIt); 16 } 17 } catch (e) { 18 print(e.stack); 19 throw e; 20 } 21 } 22 23 var x = "outer"; 24 25 { 26 let x = "inner"; 27 eval("function h() { assertEq(x, 'inner');} h()"); 28 eval("function h2() { (function nest() { assertEq(x, 'inner'); })(); } h2()"); 29 } 30 31 // GNAME optimizations should work through lazy parsing. 32 eval(` 33 function h3() { 34 assertEq(x, 'outer'); 35 } 36 h3(); 37 hasGname(h3, 'x', true); 38 `); 39 eval(` 40 function h4() { 41 function nest() { assertEq(x, 'outer'); } 42 nest(); 43 return nest; 44 } 45 hasGname(h4(), 'x', true); 46 `); 47 48 with ({}) { 49 let x = "inner"; 50 eval("function j() { assertEq(x, 'inner');} j()"); 51 eval("function j2() { (function nest() { assertEq(x, 'inner'); })(); } j2()"); 52 } 53 54 (function () { 55 let x = "inner"; 56 eval("function l() { assertEq(x, 'inner');} l()"); 57 eval("function l2() { (function nest() { assertEq(x, 'inner'); })(); } l2()"); 58 })(); 59 60 var y1 = 5; 61 eval(` 62 'use strict'; 63 var y1 = 6; 64 assertEq(y1, 6); 65 (function() { assertEq(y1, 6); })() 66 `); 67 assertEq(y1, 5); 68 69 eval(` 70 'use strict'; 71 var y2 = 6; 72 assertEq(y2, 6); 73 (function() { assertEq(y2, 6); })() 74 `);