// Environment.prototype.find finds bindings that are function arguments, 'let' // bindings, or FunctionExpression names. var g = newGlobal(); g.eval("function h() { debugger; }"); var dbg = new Debugger(g); function test1(code) { var hits = 0; dbg.onDebuggerStatement = function (frame) { var env = frame.older.environment.find('X'); assertEq(env.names().indexOf('X') !== -1, true); assertEq(env.type, 'declarative'); assertEq(env.parent !== null, true); hits++; }; g.eval(code); assertEq(hits, 1); } var manyNames = ''; for (var i = 0; i < 2048; i++) manyNames += 'x' + i + ', '; manyNames += 'X'; function test2(code) { print(code + " : one"); test1(code.replace('@@', 'X')); print(code + " : many"); test1(code.replace('@@', manyNames)); } test2('function f(@@) { h(); } f(1);'); test2('function f(@@) { h(); } f();'); test2('function f(@@) { return function g() { h(X); }; } f(1)();'); test2('function f(@@) { return function g() { h(X); }; } f()();'); test2(' { let @@ = 0; h(); }'); test2('function f(a, b, c) { let @@ = 0; h(); } f(1, 2, 3);'); test2(' { let @@ = 0; { let y = 0; h(); } }'); test2('function f() { let @@ = 0; { let y = 0; h(); } } f();'); test2(' { for (let @@ = 0; X < 1; X++) h(); }'); test2('function f() { for (let @@ = 0; X < 1; X++) h(); } f();'); test1('(function X() { h(); })();'); test1('(function X(a, b, c) { h(); })(1, 2, 3);');