envChain_frame-eval-with-eval.js (2058B)
1 // Verify the environment chain for Debugger.Frame described in 2 // js/src/vm/EnvironmentObject.h. 3 4 const g = newGlobal({ newCompartment: true }); 5 const dbg = Debugger(g); 6 7 dbg.onEnterFrame = frame => { 8 if (frame.script.displayName !== "target") { 9 return; 10 } 11 dbg.onEnterFrame = () => {}; 12 13 const envs = JSON.parse(frame.eval(` 14 // Put direct eval to de-optimize lexical. 15 eval(""); 16 var qualified = 10; 17 unqualified = 20; 18 let lexical = 30; 19 this.prop = 40; 20 21 const envs = []; 22 let env = getInnerMostEnvironmentObject(); 23 while (env) { 24 envs.push({ 25 type: getEnvironmentObjectType(env) || "*global*", 26 qualified: !!Object.getOwnPropertyDescriptor(env, "qualified"), 27 unqualified: !!Object.getOwnPropertyDescriptor(env, "unqualified"), 28 lexical: !!Object.getOwnPropertyDescriptor(env, "lexical"), 29 prop: !!Object.getOwnPropertyDescriptor(env, "prop"), 30 }); 31 32 env = getEnclosingEnvironmentObject(env); 33 } 34 JSON.stringify(envs); 35 `).return); 36 37 assertEq(envs.length, 4); 38 39 let i = 0, env; 40 41 env = envs[i]; i++; 42 assertEq(env.type, "BlockLexicalEnvironmentObject"); 43 assertEq(env.qualified, false); 44 assertEq(env.unqualified, false); 45 assertEq(env.lexical, true, "lexical must live in the BlockLexicalEnvironmentObject"); 46 assertEq(env.prop, false); 47 48 env = envs[i]; i++; 49 assertEq(env.type, "[DebugProxy] CallObject"); 50 assertEq(env.qualified, true, "qualified var must live in the CallObject"); 51 assertEq(env.unqualified, false); 52 assertEq(env.lexical, false); 53 assertEq(env.prop, false); 54 55 env = envs[i]; i++; 56 assertEq(env.type, "[DebugProxy] GlobalLexicalEnvironmentObject"); 57 assertEq(env.qualified, false); 58 assertEq(env.unqualified, false); 59 assertEq(env.lexical, false); 60 assertEq(env.prop, false); 61 62 env = envs[i]; i++; 63 assertEq(env.type, "*global*"); 64 assertEq(env.qualified, false); 65 assertEq(env.unqualified, true, "unqualified name must live in the global"); 66 assertEq(env.lexical, false); 67 assertEq(env.prop, true, "this property must live in the global"); 68 }; 69 70 g.eval(` 71 function target() { 72 } 73 target(); 74 `);