|
1 // Environment.prototype.find finds bindings that are function arguments, 'let' |
|
2 // bindings, or FunctionExpression names. |
|
3 |
|
4 var g = newGlobal(); |
|
5 g.eval("function h() { debugger; }"); |
|
6 |
|
7 var dbg = new Debugger(g); |
|
8 |
|
9 function test1(code) { |
|
10 var hits = 0; |
|
11 dbg.onDebuggerStatement = function (frame) { |
|
12 var env = frame.older.environment.find('X'); |
|
13 assertEq(env.names().indexOf('X') !== -1, true); |
|
14 assertEq(env.type, 'declarative'); |
|
15 assertEq(env.parent !== null, true); |
|
16 hits++; |
|
17 }; |
|
18 g.eval(code); |
|
19 assertEq(hits, 1); |
|
20 } |
|
21 |
|
22 var manyNames = ''; |
|
23 for (var i = 0; i < 2048; i++) |
|
24 manyNames += 'x' + i + ', '; |
|
25 manyNames += 'X'; |
|
26 |
|
27 function test2(code) { |
|
28 print(code + " : one"); |
|
29 test1(code.replace('@@', 'X')); |
|
30 print(code + " : many"); |
|
31 test1(code.replace('@@', manyNames)); |
|
32 } |
|
33 |
|
34 test2('function f(@@) { h(); } f(1);'); |
|
35 test2('function f(@@) { h(); } f();'); |
|
36 test2('function f(@@) { return function g() { h(X); }; } f(1)();'); |
|
37 test2('function f(@@) { return function g() { h(X); }; } f()();'); |
|
38 |
|
39 test2(' { let @@ = 0; h(); }'); |
|
40 test2('function f(a, b, c) { let @@ = 0; h(); } f(1, 2, 3);'); |
|
41 test2(' { let @@ = 0; { let y = 0; h(); } }'); |
|
42 test2('function f() { let @@ = 0; { let y = 0; h(); } } f();'); |
|
43 test2(' { for (let @@ = 0; X < 1; X++) h(); }'); |
|
44 test2('function f() { for (let @@ = 0; X < 1; X++) h(); } f();'); |
|
45 test2(' { (let (@@ = 0) let (y = 2, z = 3) h()); }'); |
|
46 test2('function f() { return (let (@@ = 0) let (y = 2, z = 3) h()); } f();'); |
|
47 |
|
48 test1('(function X() { h(); })();'); |
|
49 test1('(function X(a, b, c) { h(); })(1, 2, 3);'); |