envChain_frame-eval.js (1793B)
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 var qualified = 10; 15 unqualified = 20; 16 let lexical = 30; 17 this.prop = 40; 18 19 const envs = []; 20 let env = getInnerMostEnvironmentObject(); 21 while (env) { 22 envs.push({ 23 type: getEnvironmentObjectType(env) || "*global*", 24 qualified: !!Object.getOwnPropertyDescriptor(env, "qualified"), 25 unqualified: !!Object.getOwnPropertyDescriptor(env, "unqualified"), 26 lexical: !!Object.getOwnPropertyDescriptor(env, "lexical"), 27 prop: !!Object.getOwnPropertyDescriptor(env, "prop"), 28 }); 29 30 env = getEnclosingEnvironmentObject(env); 31 } 32 JSON.stringify(envs); 33 `).return); 34 35 assertEq(envs.length, 3); 36 37 let i = 0, env; 38 39 // NOTE: lexical is optimized and uses frame slot. 40 41 env = envs[i]; i++; 42 assertEq(env.type, "[DebugProxy] CallObject"); 43 assertEq(env.qualified, true, "qualified var must live in the CallObject"); 44 assertEq(env.unqualified, false); 45 assertEq(env.lexical, false); 46 assertEq(env.prop, false); 47 48 env = envs[i]; i++; 49 assertEq(env.type, "[DebugProxy] GlobalLexicalEnvironmentObject"); 50 assertEq(env.qualified, false); 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, "*global*"); 57 assertEq(env.qualified, false); 58 assertEq(env.unqualified, true, "unqualified name must live in the global"); 59 assertEq(env.lexical, false); 60 assertEq(env.prop, true, "this property must live in the global"); 61 }; 62 63 g.eval(` 64 function target() { 65 } 66 target(); 67 `);