OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library debugger_page_element; | 5 library debugger_page_element; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:html'; | 8 import 'dart:html'; |
9 import 'observatory_element.dart'; | 9 import 'observatory_element.dart'; |
10 import 'package:observatory/app.dart'; | 10 import 'package:observatory/app.dart'; |
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 ' set <option> # Get current value for option\n' | 630 ' set <option> # Get current value for option\n' |
631 ' set <option> <value> # Set value for option'; | 631 ' set <option> <value> # Set value for option'; |
632 } | 632 } |
633 | 633 |
634 class BreakCommand extends DebuggerCommand { | 634 class BreakCommand extends DebuggerCommand { |
635 BreakCommand(Debugger debugger) : super(debugger, 'break', []); | 635 BreakCommand(Debugger debugger) : super(debugger, 'break', []); |
636 | 636 |
637 Future run(List<String> args) async { | 637 Future run(List<String> args) async { |
638 if (args.length > 1) { | 638 if (args.length > 1) { |
639 debugger.console.print('not implemented'); | 639 debugger.console.print('not implemented'); |
640 return new Future.value(null); | 640 return; |
641 } | 641 } |
642 var arg = (args.length == 0 ? '' : args[0]); | 642 var arg = (args.length == 0 ? '' : args[0]); |
643 var loc = await DebuggerLocation.parse(debugger, arg); | 643 var loc = await DebuggerLocation.parse(debugger, arg); |
644 if (loc.valid) { | 644 if (loc.valid) { |
645 if (loc.function != null) { | 645 if (loc.function != null) { |
646 try { | 646 try { |
647 await debugger.isolate.addBreakpointAtEntry(loc.function); | 647 await debugger.isolate.addBreakpointAtEntry(loc.function); |
648 } on ServerRpcException catch(e) { | 648 } on ServerRpcException catch(e) { |
649 if (e.code == ServerRpcException.kCannotAddBreakpoint) { | 649 if (e.code == ServerRpcException.kCannotAddBreakpoint) { |
650 debugger.console.print('Unable to set breakpoint at ${loc}'); | 650 debugger.console.print('Unable to set breakpoint at ${loc}'); |
651 } else { | 651 } else { |
652 rethrow; | 652 rethrow; |
653 } | 653 } |
654 } | 654 } |
655 } else { | 655 } else { |
656 assert(loc.script != null); | 656 assert(loc.script != null); |
657 if (loc.col != null) { | 657 var script = loc.script; |
658 // TODO(turnidge): Add tokenPos breakpoint support. | 658 await script.load(); |
| 659 if (loc.line < 1 || loc.line > script.lines.length) { |
659 debugger.console.print( | 660 debugger.console.print( |
660 'Ignoring column: ' | 661 'line number must be in range [1,${script.lines.length}]'); |
661 'adding breakpoint at a specific column not yet implemented'); | 662 return; |
662 } | 663 } |
663 try { | 664 try { |
664 await debugger.isolate.addBreakpoint(loc.script, loc.line); | 665 await debugger.isolate.addBreakpoint(script, loc.line, loc.col); |
665 } on ServerRpcException catch(e) { | 666 } on ServerRpcException catch(e) { |
666 if (e.code == ServerRpcException.kCannotAddBreakpoint) { | 667 if (e.code == ServerRpcException.kCannotAddBreakpoint) { |
667 debugger.console.print('Unable to set breakpoint at ${loc}'); | 668 debugger.console.print('Unable to set breakpoint at ${loc}'); |
668 } else { | 669 } else { |
669 rethrow; | 670 rethrow; |
670 } | 671 } |
671 } | 672 } |
672 } | 673 } |
673 } else { | 674 } else { |
674 debugger.console.print(loc.errorMessage); | 675 debugger.console.print(loc.errorMessage); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 ' (e.g \'break test.dart:11:8\')\n' | 712 ' (e.g \'break test.dart:11:8\')\n' |
712 ' break <function> ' | 713 ' break <function> ' |
713 '# Break at the named function\n' | 714 '# Break at the named function\n' |
714 ' ' | 715 ' ' |
715 ' (e.g \'break main\' or \'break Class.someFunction\')\n'; | 716 ' (e.g \'break main\' or \'break Class.someFunction\')\n'; |
716 } | 717 } |
717 | 718 |
718 class ClearCommand extends DebuggerCommand { | 719 class ClearCommand extends DebuggerCommand { |
719 ClearCommand(Debugger debugger) : super(debugger, 'clear', []); | 720 ClearCommand(Debugger debugger) : super(debugger, 'clear', []); |
720 | 721 |
721 Future run(List<String> args) { | 722 Future run(List<String> args) async { |
722 if (args.length > 1) { | 723 if (args.length > 1) { |
723 debugger.console.print('not implemented'); | 724 debugger.console.print('not implemented'); |
724 return new Future.value(null); | 725 return; |
725 } | 726 } |
726 var arg = (args.length == 0 ? '' : args[0]); | 727 var arg = (args.length == 0 ? '' : args[0]); |
727 return DebuggerLocation.parse(debugger, arg).then((loc) { | 728 var loc = await DebuggerLocation.parse(debugger, arg); |
728 if (loc.valid) { | 729 if (!loc.valid) { |
729 if (loc.function != null) { | 730 debugger.console.print(loc.errorMessage); |
730 debugger.console.print( | 731 return; |
731 'Ignoring breakpoint at $loc: ' | 732 } |
732 'Function entry breakpoints not yet implemented'); | 733 if (loc.function != null) { |
733 return null; | 734 debugger.console.print( |
734 } | 735 'Ignoring breakpoint at $loc: ' |
735 if (loc.col != null) { | 736 'Clearing function breakpoints not yet implemented'); |
736 // TODO(turnidge): Add tokenPos clear support. | 737 return; |
737 debugger.console.print( | 738 } |
738 'Ignoring column: ' | |
739 'clearing breakpoint at a specific column not yet implemented'); | |
740 } | |
741 | 739 |
742 for (var bpt in debugger.isolate.breakpoints.values) { | 740 var script = loc.script; |
743 var script = bpt.location.script; | 741 if (loc.line < 1 || loc.line > script.lines.length) { |
744 if (script.id == loc.script.id) { | 742 debugger.console.print( |
745 assert(script.loaded); | 743 'line number must be in range [1,${script.lines.length}]'); |
746 var line = script.tokenToLine(bpt.location.tokenPos); | 744 return; |
747 if (line == loc.line) { | 745 } |
748 return debugger.isolate.removeBreakpoint(bpt).then((result) { | 746 var lineInfo = script.getLine(loc.line); |
749 if (result is DartError) { | 747 var bpts = lineInfo.breakpoints; |
750 debugger.console.print( | 748 var foundBreakpoint = false; |
751 'Unable to clear breakpoint at ${loc}: ${result.message}')
; | 749 if (bpts != null) { |
752 return; | 750 var bptList = bpts.toList(); |
753 } | 751 for (var bpt in bptList) { |
754 }); | 752 if (loc.col == null || |
755 } | 753 loc.col == script.tokenToCol(bpt.location.tokenPos)) { |
| 754 foundBreakpoint = true; |
| 755 var result = await debugger.isolate.removeBreakpoint(bpt); |
| 756 if (result is DartError) { |
| 757 debugger.console.print( |
| 758 'Error clearing breakpoint ${bpt.number}: ${result.message}'); |
756 } | 759 } |
757 } | 760 } |
758 debugger.console.print('No breakpoint found at ${loc}'); | |
759 } else { | |
760 debugger.console.print(loc.errorMessage); | |
761 } | 761 } |
762 }); | 762 } |
| 763 if (!foundBreakpoint) { |
| 764 debugger.console.print('No breakpoint found at ${loc}'); |
| 765 } |
763 } | 766 } |
764 | 767 |
765 Future<List<String>> complete(List<String> args) { | 768 Future<List<String>> complete(List<String> args) { |
766 if (args.length != 1) { | 769 if (args.length != 1) { |
767 return new Future.value([args.join('')]); | 770 return new Future.value([args.join('')]); |
768 } | 771 } |
769 return new Future.value(DebuggerLocation.complete(debugger, args[0])); | 772 return new Future.value(DebuggerLocation.complete(debugger, args[0])); |
770 } | 773 } |
771 | 774 |
772 String helpShort = 'Remove a breakpoint by source location or function name' | 775 String helpShort = 'Remove a breakpoint by source location or function name' |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
839 'Remove a breakpoint by breakpoint id.\n' | 842 'Remove a breakpoint by breakpoint id.\n' |
840 '\n' | 843 '\n' |
841 'Syntax: delete <bp-id>\n' | 844 'Syntax: delete <bp-id>\n' |
842 ' delete <bp-id> <bp-id> ...\n'; | 845 ' delete <bp-id> <bp-id> ...\n'; |
843 } | 846 } |
844 | 847 |
845 class InfoBreakpointsCommand extends DebuggerCommand { | 848 class InfoBreakpointsCommand extends DebuggerCommand { |
846 InfoBreakpointsCommand(Debugger debugger) | 849 InfoBreakpointsCommand(Debugger debugger) |
847 : super(debugger, 'breakpoints', []); | 850 : super(debugger, 'breakpoints', []); |
848 | 851 |
849 Future run(List<String> args) { | 852 Future run(List<String> args) async { |
850 if (debugger.isolate.breakpoints.isEmpty) { | 853 if (debugger.isolate.breakpoints.isEmpty) { |
851 debugger.console.print('No breakpoints'); | 854 debugger.console.print('No breakpoints'); |
852 } | 855 } |
853 List bpts = debugger.isolate.breakpoints.values.toList(); | 856 List bpts = debugger.isolate.breakpoints.values.toList(); |
854 bpts.sort((a, b) => a.number - b.number); | 857 bpts.sort((a, b) => a.number - b.number); |
855 for (var bpt in bpts) { | 858 for (var bpt in bpts) { |
856 var bpId = bpt.number; | 859 var bpId = bpt.number; |
857 var script = bpt.location.script; | 860 var locString = await bpt.location.toUserString(); |
858 var tokenPos = bpt.location.tokenPos; | |
859 var line = script.tokenToLine(tokenPos); | |
860 var col = script.tokenToCol(tokenPos); | |
861 if (!bpt.resolved) { | 861 if (!bpt.resolved) { |
862 debugger.console.print( | 862 debugger.console.print( |
863 'Future breakpoint ${bpId} at ${script.name}:${line}:${col}'); | 863 'Future breakpoint ${bpId} at ${locString}'); |
864 } else { | 864 } else { |
865 debugger.console.print( | 865 debugger.console.print( |
866 'Breakpoint ${bpId} at ${script.name}:${line}:${col}'); | 866 'Breakpoint ${bpId} at ${locString}'); |
867 } | 867 } |
868 } | 868 } |
869 return new Future.value(null); | |
870 } | 869 } |
871 | 870 |
872 String helpShort = 'List all breakpoints'; | 871 String helpShort = 'List all breakpoints'; |
873 | 872 |
874 String helpLong = | 873 String helpLong = |
875 'List all breakpoints.\n' | 874 'List all breakpoints.\n' |
876 '\n' | 875 '\n' |
877 'Syntax: info breakpoints\n'; | 876 'Syntax: info breakpoints\n'; |
878 } | 877 } |
879 | 878 |
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1381 // paused-at-isolate-exit. Maybe we shutdown part of the debugger too | 1380 // paused-at-isolate-exit. Maybe we shutdown part of the debugger too |
1382 // soon? | 1381 // soon? |
1383 console.printRef(event.exception); | 1382 console.printRef(event.exception); |
1384 } else { | 1383 } else { |
1385 console.print('Paused at ${script.name}:${line}:${col}'); | 1384 console.print('Paused at ${script.name}:${line}:${col}'); |
1386 } | 1385 } |
1387 }); | 1386 }); |
1388 } | 1387 } |
1389 } | 1388 } |
1390 | 1389 |
1391 Future _reportBreakpointEvent(ServiceEvent event) { | 1390 Future _reportBreakpointEvent(ServiceEvent event) async { |
1392 var bpt = event.breakpoint; | 1391 var bpt = event.breakpoint; |
1393 var verb = null; | 1392 var verb = null; |
1394 switch (event.kind) { | 1393 switch (event.kind) { |
1395 case ServiceEvent.kBreakpointAdded: | 1394 case ServiceEvent.kBreakpointAdded: |
1396 verb = 'added'; | 1395 verb = 'added'; |
1397 break; | 1396 break; |
1398 case ServiceEvent.kBreakpointResolved: | 1397 case ServiceEvent.kBreakpointResolved: |
1399 verb = 'resolved'; | 1398 verb = 'resolved'; |
1400 break; | 1399 break; |
1401 case ServiceEvent.kBreakpointRemoved: | 1400 case ServiceEvent.kBreakpointRemoved: |
1402 verb = 'removed'; | 1401 verb = 'removed'; |
1403 break; | 1402 break; |
1404 default: | 1403 default: |
1405 break; | 1404 break; |
1406 } | 1405 } |
1407 var script = bpt.location.script; | 1406 var script = bpt.location.script; |
1408 return script.load().then((_) { | 1407 await script.load(); |
1409 var bpId = bpt.number; | 1408 |
1410 var tokenPos = bpt.location.tokenPos; | 1409 var bpId = bpt.number; |
1411 var line = script.tokenToLine(tokenPos); | 1410 var locString = await bpt.location.toUserString(); |
1412 var col = script.tokenToCol(tokenPos); | 1411 if (bpt.resolved) { |
1413 if (bpt.resolved) { | 1412 console.print( |
1414 console.print( | 1413 'Breakpoint ${bpId} ${verb} at ${locString}'); |
1415 'Breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}'); | 1414 } else { |
1416 } else { | 1415 console.print( |
1417 console.print( | 1416 'Future breakpoint ${bpId} ${verb} at ${locString}'); |
1418 'Future breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}'
); | 1417 } |
1419 } | |
1420 }); | |
1421 } | 1418 } |
1422 | 1419 |
1423 void onEvent(ServiceEvent event) { | 1420 void onEvent(ServiceEvent event) { |
1424 switch(event.kind) { | 1421 switch(event.kind) { |
1425 case ServiceEvent.kIsolateStart: | 1422 case ServiceEvent.kIsolateStart: |
1426 { | 1423 { |
1427 var iso = event.owner; | 1424 var iso = event.owner; |
1428 console.print( | 1425 console.print( |
1429 "Isolate ${iso.number} '${iso.name}' has been created"); | 1426 "Isolate ${iso.number} '${iso.name}' has been created"); |
1430 } | 1427 } |
(...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2359 } | 2356 } |
2360 }); | 2357 }); |
2361 } | 2358 } |
2362 | 2359 |
2363 void focus() { | 2360 void focus() { |
2364 $['textBox'].focus(); | 2361 $['textBox'].focus(); |
2365 } | 2362 } |
2366 | 2363 |
2367 DebuggerInputElement.created() : super.created(); | 2364 DebuggerInputElement.created() : super.created(); |
2368 } | 2365 } |
OLD | NEW |