| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 } | 145 } |
| 146 | 146 |
| 147 | 147 |
| 148 // Check that the scope chain contains the expected names of scopes. | 148 // Check that the scope chain contains the expected names of scopes. |
| 149 function CheckScopeChainNames(names, exec_state) { | 149 function CheckScopeChainNames(names, exec_state) { |
| 150 var all_scopes = exec_state.frame().allScopes(); | 150 var all_scopes = exec_state.frame().allScopes(); |
| 151 assertEquals(names.length, all_scopes.length, "FrameMirror.allScopes length"); | 151 assertEquals(names.length, all_scopes.length, "FrameMirror.allScopes length"); |
| 152 for (var i = 0; i < names.length; i++) { | 152 for (var i = 0; i < names.length; i++) { |
| 153 var scope = exec_state.frame().scope(i); | 153 var scope = exec_state.frame().scope(i); |
| 154 assertTrue(scope.isScope()); | 154 assertTrue(scope.isScope()); |
| 155 assertEquals(scope.details().name(), names[i]) | 155 assertEquals(names[i], scope.details().name()) |
| 156 } | 156 } |
| 157 } | 157 } |
| 158 | 158 |
| 159 | 159 |
| 160 // Check that the content of the scope is as expected. For functions just check | 160 // Check that the content of the scope is as expected. For functions just check |
| 161 // that there is a function. | 161 // that there is a function. |
| 162 function CheckScopeContent(content, number, exec_state) { | 162 function CheckScopeContent(content, number, exec_state) { |
| 163 var scope = exec_state.frame().scope(number); | 163 var scope = exec_state.frame().scope(number); |
| 164 var count = 0; | 164 var count = 0; |
| 165 for (var p in content) { | 165 for (var p in content) { |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 }; | 537 }; |
| 538 return f; | 538 return f; |
| 539 } | 539 } |
| 540 | 540 |
| 541 listener_delegate = function(exec_state) { | 541 listener_delegate = function(exec_state) { |
| 542 CheckScopeChain([debug.ScopeType.Local, | 542 CheckScopeChain([debug.ScopeType.Local, |
| 543 debug.ScopeType.Closure, | 543 debug.ScopeType.Closure, |
| 544 debug.ScopeType.Script, | 544 debug.ScopeType.Script, |
| 545 debug.ScopeType.Global], exec_state); | 545 debug.ScopeType.Global], exec_state); |
| 546 CheckScopeContent({a:1}, 1, exec_state); | 546 CheckScopeContent({a:1}, 1, exec_state); |
| 547 CheckScopeChainNames([undefined, "closure_1", undefined, undefined], exec_stat
e) | 547 CheckScopeChainNames(["f", "closure_1", undefined, undefined], exec_state) |
| 548 }; | 548 }; |
| 549 closure_1(1)(); | 549 closure_1(1)(); |
| 550 EndTest(); | 550 EndTest(); |
| 551 | 551 |
| 552 | 552 |
| 553 // Simple closure formed by returning an inner function referering the outer | 553 // Simple closure formed by returning an inner function referering the outer |
| 554 // functions arguments. Due to VM optimizations parts of the actual closure is | 554 // functions arguments. Due to VM optimizations parts of the actual closure is |
| 555 // missing from the debugger information. | 555 // missing from the debugger information. |
| 556 BeginTest("Closure 2"); | 556 BeginTest("Closure 2"); |
| 557 | 557 |
| 558 function closure_2(a, b) { | 558 function closure_2(a, b) { |
| 559 var x = a + 2; | 559 var x = a + 2; |
| 560 var y = b + 2; | 560 var y = b + 2; |
| 561 function f() { | 561 function f() { |
| 562 debugger; | 562 debugger; |
| 563 return a + x; | 563 return a + x; |
| 564 }; | 564 }; |
| 565 return f; | 565 return f; |
| 566 } | 566 } |
| 567 | 567 |
| 568 listener_delegate = function(exec_state) { | 568 listener_delegate = function(exec_state) { |
| 569 CheckScopeChain([debug.ScopeType.Local, | 569 CheckScopeChain([debug.ScopeType.Local, |
| 570 debug.ScopeType.Closure, | 570 debug.ScopeType.Closure, |
| 571 debug.ScopeType.Script, | 571 debug.ScopeType.Script, |
| 572 debug.ScopeType.Global], exec_state); | 572 debug.ScopeType.Global], exec_state); |
| 573 CheckScopeContent({a:1,x:3}, 1, exec_state); | 573 CheckScopeContent({a:1,x:3}, 1, exec_state); |
| 574 CheckScopeChainNames([undefined, "closure_2", undefined, undefined], exec_stat
e) | 574 CheckScopeChainNames(["f", "closure_2", undefined, undefined], exec_state) |
| 575 }; | 575 }; |
| 576 closure_2(1, 2)(); | 576 closure_2(1, 2)(); |
| 577 EndTest(); | 577 EndTest(); |
| 578 | 578 |
| 579 | 579 |
| 580 // Simple closure formed by returning an inner function referering the outer | 580 // Simple closure formed by returning an inner function referering the outer |
| 581 // functions arguments. Using all arguments and locals from the outer function | 581 // functions arguments. Using all arguments and locals from the outer function |
| 582 // in the inner function makes these part of the debugger information on the | 582 // in the inner function makes these part of the debugger information on the |
| 583 // closure. | 583 // closure. |
| 584 BeginTest("Closure 3"); | 584 BeginTest("Closure 3"); |
| 585 | 585 |
| 586 function closure_3(a, b) { | 586 function closure_3(a, b) { |
| 587 var x = a + 2; | 587 var x = a + 2; |
| 588 var y = b + 2; | 588 var y = b + 2; |
| 589 function f() { | 589 function f() { |
| 590 debugger; | 590 debugger; |
| 591 return a + b + x + y; | 591 return a + b + x + y; |
| 592 }; | 592 }; |
| 593 return f; | 593 return f; |
| 594 } | 594 } |
| 595 | 595 |
| 596 listener_delegate = function(exec_state) { | 596 listener_delegate = function(exec_state) { |
| 597 CheckScopeChain([debug.ScopeType.Local, | 597 CheckScopeChain([debug.ScopeType.Local, |
| 598 debug.ScopeType.Closure, | 598 debug.ScopeType.Closure, |
| 599 debug.ScopeType.Script, | 599 debug.ScopeType.Script, |
| 600 debug.ScopeType.Global], exec_state); | 600 debug.ScopeType.Global], exec_state); |
| 601 CheckScopeContent({a:1,b:2,x:3,y:4}, 1, exec_state); | 601 CheckScopeContent({a:1,b:2,x:3,y:4}, 1, exec_state); |
| 602 CheckScopeChainNames([undefined, "closure_3", undefined, undefined], exec_stat
e) | 602 CheckScopeChainNames(["f", "closure_3", undefined, undefined], exec_state) |
| 603 }; | 603 }; |
| 604 closure_3(1, 2)(); | 604 closure_3(1, 2)(); |
| 605 EndTest(); | 605 EndTest(); |
| 606 | 606 |
| 607 | 607 |
| 608 | 608 |
| 609 // Simple closure formed by returning an inner function referering the outer | 609 // Simple closure formed by returning an inner function referering the outer |
| 610 // functions arguments. Using all arguments and locals from the outer function | 610 // functions arguments. Using all arguments and locals from the outer function |
| 611 // in the inner function makes these part of the debugger information on the | 611 // in the inner function makes these part of the debugger information on the |
| 612 // closure. Use the inner function as well... | 612 // closure. Use the inner function as well... |
| (...skipping 10 matching lines...) Expand all Loading... |
| 623 }; | 623 }; |
| 624 return f; | 624 return f; |
| 625 } | 625 } |
| 626 | 626 |
| 627 listener_delegate = function(exec_state) { | 627 listener_delegate = function(exec_state) { |
| 628 CheckScopeChain([debug.ScopeType.Local, | 628 CheckScopeChain([debug.ScopeType.Local, |
| 629 debug.ScopeType.Closure, | 629 debug.ScopeType.Closure, |
| 630 debug.ScopeType.Script, | 630 debug.ScopeType.Script, |
| 631 debug.ScopeType.Global], exec_state); | 631 debug.ScopeType.Global], exec_state); |
| 632 CheckScopeContent({a:1,b:2,x:3,y:4,f:function(){}}, 1, exec_state); | 632 CheckScopeContent({a:1,b:2,x:3,y:4,f:function(){}}, 1, exec_state); |
| 633 CheckScopeChainNames([undefined, "closure_4", undefined, undefined], exec_stat
e) | 633 CheckScopeChainNames(["f", "closure_4", undefined, undefined], exec_state) |
| 634 }; | 634 }; |
| 635 closure_4(1, 2)(); | 635 closure_4(1, 2)(); |
| 636 EndTest(); | 636 EndTest(); |
| 637 | 637 |
| 638 | 638 |
| 639 | 639 |
| 640 // Simple closure formed by returning an inner function referering the outer | 640 // Simple closure formed by returning an inner function referering the outer |
| 641 // functions arguments. In the presence of eval all arguments and locals | 641 // functions arguments. In the presence of eval all arguments and locals |
| 642 // (including the inner function itself) from the outer function becomes part of | 642 // (including the inner function itself) from the outer function becomes part of |
| 643 // the debugger infformation on the closure. | 643 // the debugger infformation on the closure. |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 (function inner(x) { | 741 (function inner(x) { |
| 742 debugger; | 742 debugger; |
| 743 })(2); | 743 })(2); |
| 744 } | 744 } |
| 745 | 745 |
| 746 listener_delegate = function(exec_state) { | 746 listener_delegate = function(exec_state) { |
| 747 CheckScopeChain([debug.ScopeType.Local, | 747 CheckScopeChain([debug.ScopeType.Local, |
| 748 debug.ScopeType.Script, | 748 debug.ScopeType.Script, |
| 749 debug.ScopeType.Global], exec_state); | 749 debug.ScopeType.Global], exec_state); |
| 750 CheckScopeContent({x: 2}, 0, exec_state); | 750 CheckScopeContent({x: 2}, 0, exec_state); |
| 751 CheckScopeChainNames([undefined, undefined, undefined], exec_state) | 751 CheckScopeChainNames(["inner", undefined, undefined], exec_state) |
| 752 }; | 752 }; |
| 753 closure_8(); | 753 closure_8(); |
| 754 EndTest(); | 754 EndTest(); |
| 755 | 755 |
| 756 | 756 |
| 757 BeginTest("Closure 9"); | 757 BeginTest("Closure 9"); |
| 758 function closure_9() { | 758 function closure_9() { |
| 759 eval("var y = 1;"); | 759 eval("var y = 1;"); |
| 760 eval("var z = 1;"); | 760 eval("var z = 1;"); |
| 761 (function inner(x) { | 761 (function inner(x) { |
| 762 y++; | 762 y++; |
| 763 z++; | 763 z++; |
| 764 debugger; | 764 debugger; |
| 765 })(2); | 765 })(2); |
| 766 } | 766 } |
| 767 | 767 |
| 768 listener_delegate = function(exec_state) { | 768 listener_delegate = function(exec_state) { |
| 769 CheckScopeChain([debug.ScopeType.Local, | 769 CheckScopeChain([debug.ScopeType.Local, |
| 770 debug.ScopeType.Closure, | 770 debug.ScopeType.Closure, |
| 771 debug.ScopeType.Script, | 771 debug.ScopeType.Script, |
| 772 debug.ScopeType.Global], exec_state); | 772 debug.ScopeType.Global], exec_state); |
| 773 CheckScopeChainNames([undefined, "closure_9", undefined, undefined], exec_stat
e) | 773 CheckScopeChainNames(["inner", "closure_9", undefined, undefined], exec_state) |
| 774 }; | 774 }; |
| 775 closure_9(); | 775 closure_9(); |
| 776 EndTest(); | 776 EndTest(); |
| 777 | 777 |
| 778 | 778 |
| 779 // Test a mixture of scopes. | 779 // Test a mixture of scopes. |
| 780 BeginTest("The full monty"); | 780 BeginTest("The full monty"); |
| 781 function the_full_monty(a, b) { | 781 function the_full_monty(a, b) { |
| 782 var x = 3; | 782 var x = 3; |
| 783 var y = 4; | 783 var y = 4; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 830 with({x:1}) { | 830 with({x:1}) { |
| 831 (function inner(x) { | 831 (function inner(x) { |
| 832 debugger; | 832 debugger; |
| 833 })(2); | 833 })(2); |
| 834 } | 834 } |
| 835 } | 835 } |
| 836 | 836 |
| 837 listener_delegate = function(exec_state) { | 837 listener_delegate = function(exec_state) { |
| 838 CheckScopeChain([debug.ScopeType.Local, | 838 CheckScopeChain([debug.ScopeType.Local, |
| 839 debug.ScopeType.With, | 839 debug.ScopeType.With, |
| 840 debug.ScopeType.Closure, | |
| 841 debug.ScopeType.Script, | 840 debug.ScopeType.Script, |
| 842 debug.ScopeType.Global], exec_state); | 841 debug.ScopeType.Global], exec_state); |
| 843 CheckScopeContent({x: 2}, 0, exec_state); | 842 CheckScopeContent({x: 2}, 0, exec_state); |
| 843 CheckScopeContent({x: 1}, 1, exec_state); |
| 844 }; | 844 }; |
| 845 closure_in_with_1(); | 845 closure_in_with_1(); |
| 846 EndTest(); | 846 EndTest(); |
| 847 | 847 |
| 848 | 848 |
| 849 BeginTest("Closure inside With 2"); | 849 BeginTest("Closure inside With 2"); |
| 850 function closure_in_with_2() { | 850 function closure_in_with_2() { |
| 851 with({x:1}) { | 851 with({x:1}) { |
| 852 (function inner(x) { | 852 (function inner(x) { |
| 853 with({x:3}) { | 853 with({x:3}) { |
| 854 debugger; | 854 debugger; |
| 855 } | 855 } |
| 856 })(2); | 856 })(2); |
| 857 } | 857 } |
| 858 } | 858 } |
| 859 | 859 |
| 860 listener_delegate = function(exec_state) { | 860 listener_delegate = function(exec_state) { |
| 861 CheckScopeChain([debug.ScopeType.With, | 861 CheckScopeChain([debug.ScopeType.With, |
| 862 debug.ScopeType.Local, | 862 debug.ScopeType.Local, |
| 863 debug.ScopeType.With, | 863 debug.ScopeType.With, |
| 864 debug.ScopeType.Closure, | |
| 865 debug.ScopeType.Script, | 864 debug.ScopeType.Script, |
| 866 debug.ScopeType.Global], exec_state); | 865 debug.ScopeType.Global], exec_state); |
| 867 CheckScopeContent({x: 3}, 0, exec_state); | 866 CheckScopeContent({x: 3}, 0, exec_state); |
| 868 CheckScopeContent({x: 2}, 1, exec_state); | 867 CheckScopeContent({x: 2}, 1, exec_state); |
| 869 CheckScopeContent({x: 1}, 2, exec_state); | 868 CheckScopeContent({x: 1}, 2, exec_state); |
| 870 CheckScopeChainNames(["inner", "inner", "closure_in_with_2", "closure_in_with_
2", undefined, undefined], exec_state) | 869 CheckScopeChainNames(["inner", "inner", "closure_in_with_2", undefined, undefi
ned], exec_state) |
| 871 }; | 870 }; |
| 872 closure_in_with_2(); | 871 closure_in_with_2(); |
| 873 EndTest(); | 872 EndTest(); |
| 874 | 873 |
| 875 | 874 |
| 876 BeginTest("Closure inside With 3"); | 875 BeginTest("Closure inside With 3"); |
| 877 function createClosure(a) { | 876 function createClosure(a) { |
| 878 var b = a + 1; | 877 var b = a + 1; |
| 879 return function closure() { | 878 return function closure() { |
| 880 var c = b; | 879 var c = b; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 } | 941 } |
| 943 }; | 942 }; |
| 944 | 943 |
| 945 | 944 |
| 946 listener_delegate = function(exec_state) { | 945 listener_delegate = function(exec_state) { |
| 947 CheckScopeChain([debug.ScopeType.Catch, | 946 CheckScopeChain([debug.ScopeType.Catch, |
| 948 debug.ScopeType.Local, | 947 debug.ScopeType.Local, |
| 949 debug.ScopeType.Script, | 948 debug.ScopeType.Script, |
| 950 debug.ScopeType.Global], exec_state); | 949 debug.ScopeType.Global], exec_state); |
| 951 CheckScopeContent({e:'Exception'}, 0, exec_state); | 950 CheckScopeContent({e:'Exception'}, 0, exec_state); |
| 952 CheckScopeChainNames(["catch_block_1", undefined, undefined, undefined], exec_
state) | 951 CheckScopeChainNames(["catch_block_1", "catch_block_1", undefined, undefined],
exec_state) |
| 953 }; | 952 }; |
| 954 catch_block_1(); | 953 catch_block_1(); |
| 955 EndTest(); | 954 EndTest(); |
| 956 | 955 |
| 957 | 956 |
| 958 BeginTest("Catch block 2"); | 957 BeginTest("Catch block 2"); |
| 959 function catch_block_2() { | 958 function catch_block_2() { |
| 960 try { | 959 try { |
| 961 throw 'Exception'; | 960 throw 'Exception'; |
| 962 } catch (e) { | 961 } catch (e) { |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1088 } | 1087 } |
| 1089 }; | 1088 }; |
| 1090 | 1089 |
| 1091 | 1090 |
| 1092 listener_delegate = function(exec_state) { | 1091 listener_delegate = function(exec_state) { |
| 1093 CheckScopeChain([debug.ScopeType.Catch, | 1092 CheckScopeChain([debug.ScopeType.Catch, |
| 1094 debug.ScopeType.Local, | 1093 debug.ScopeType.Local, |
| 1095 debug.ScopeType.Script, | 1094 debug.ScopeType.Script, |
| 1096 debug.ScopeType.Global], exec_state); | 1095 debug.ScopeType.Global], exec_state); |
| 1097 CheckScopeContent({e:'Exception'}, 0, exec_state); | 1096 CheckScopeContent({e:'Exception'}, 0, exec_state); |
| 1098 CheckScopeChainNames(["catch_block_7", undefined, undefined, undefined], exec_
state) | 1097 CheckScopeChainNames(["catch_block_7", "catch_block_7", undefined, undefined],
exec_state) |
| 1099 }; | 1098 }; |
| 1100 catch_block_7(); | 1099 catch_block_7(); |
| 1101 EndTest(); | 1100 EndTest(); |
| 1102 | 1101 |
| 1103 | 1102 |
| 1104 BeginTest("Classes and methods 1"); | 1103 BeginTest("Classes and methods 1"); |
| 1105 | 1104 |
| 1106 listener_delegate = function(exec_state) { | 1105 listener_delegate = function(exec_state) { |
| 1107 "use strict" | 1106 "use strict" |
| 1108 CheckScopeChain([debug.ScopeType.Local, | 1107 CheckScopeChain([debug.ScopeType.Local, |
| 1109 debug.ScopeType.Script, | 1108 debug.ScopeType.Script, |
| 1110 debug.ScopeType.Global], exec_state); | 1109 debug.ScopeType.Global], exec_state); |
| 1111 CheckScopeContent({}, 1, exec_state); | 1110 CheckScopeContent({}, 1, exec_state); |
| 1112 CheckScopeChainNames([undefined, undefined, undefined], exec_state) | 1111 CheckScopeChainNames(["m", undefined, undefined], exec_state) |
| 1113 }; | 1112 }; |
| 1114 | 1113 |
| 1115 (function() { | 1114 (function() { |
| 1116 "use strict"; | 1115 "use strict"; |
| 1117 class C1 { | 1116 class C1 { |
| 1118 m() { | 1117 m() { |
| 1119 debugger; | 1118 debugger; |
| 1120 } | 1119 } |
| 1121 } | 1120 } |
| 1122 new C1().m(); | 1121 new C1().m(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1186 debug.ScopeType.Global], exec_state); | 1185 debug.ScopeType.Global], exec_state); |
| 1187 CheckScopeChainPositions([{start: 52, end: 111}, {start: 42, end: 111}, {start
: 22, end: 145}, {}, {}], exec_state); | 1186 CheckScopeChainPositions([{start: 52, end: 111}, {start: 42, end: 111}, {start
: 22, end: 145}, {}, {}], exec_state); |
| 1188 } | 1187 } |
| 1189 eval(code3); | 1188 eval(code3); |
| 1190 EndTest(); | 1189 EndTest(); |
| 1191 | 1190 |
| 1192 assertEquals(begin_test_count, break_count, | 1191 assertEquals(begin_test_count, break_count, |
| 1193 'one or more tests did not enter the debugger'); | 1192 'one or more tests did not enter the debugger'); |
| 1194 assertEquals(begin_test_count, end_test_count, | 1193 assertEquals(begin_test_count, end_test_count, |
| 1195 'one or more tests did not have its result checked'); | 1194 'one or more tests did not have its result checked'); |
| OLD | NEW |