| 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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 alias = 'p'; | 110 alias = 'p'; |
| 111 } | 111 } |
| 112 | 112 |
| 113 Future run(List<String> args) { | 113 Future run(List<String> args) { |
| 114 if (args.length < 1) { | 114 if (args.length < 1) { |
| 115 debugger.console.print('print expects arguments'); | 115 debugger.console.print('print expects arguments'); |
| 116 return new Future.value(null); | 116 return new Future.value(null); |
| 117 } | 117 } |
| 118 var expr = args.join(''); | 118 var expr = args.join(''); |
| 119 return debugger.isolate.evalFrame(debugger.currentFrame, expr) | 119 return debugger.isolate.evalFrame(debugger.currentFrame, expr) |
| 120 .then((response) { | 120 .then((ServiceObject response) { |
| 121 if (response is DartError) { | 121 if (response is DartError) { |
| 122 debugger.console.print(response.message); | 122 debugger.console.print(response.message); |
| 123 } else { | 123 } else { |
| 124 debugger.console.print('= ', newline:false); | 124 debugger.console.print('= ', newline:false); |
| 125 debugger.console.printRef(response); | 125 debugger.console.printRef(response); |
| 126 } | 126 } |
| 127 }); | 127 }); |
| 128 } | 128 } |
| 129 | 129 |
| 130 String helpShort = 'Evaluate and print an expression in the current frame'; | 130 String helpShort = 'Evaluate and print an expression in the current frame'; |
| 131 | 131 |
| 132 String helpLong = | 132 String helpLong = |
| 133 'Evaluate and print an expression in the current frame.\n' | 133 'Evaluate and print an expression in the current frame.\n' |
| 134 '\n' | 134 '\n' |
| 135 'Syntax: print <expression>\n' | 135 'Syntax: print <expression>\n' |
| 136 ' p <expression>\n'; | 136 ' p <expression>\n'; |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 | 362 |
| 363 String helpLong = | 363 String helpLong = |
| 364 'Continue running the isolate until the current function exits.\n' | 364 'Continue running the isolate until the current function exits.\n' |
| 365 '\n' | 365 '\n' |
| 366 'Syntax: finish\n'; | 366 'Syntax: finish\n'; |
| 367 } | 367 } |
| 368 | 368 |
| 369 class BreakCommand extends DebuggerCommand { | 369 class BreakCommand extends DebuggerCommand { |
| 370 BreakCommand(Debugger debugger) : super(debugger, 'break', []); | 370 BreakCommand(Debugger debugger) : super(debugger, 'break', []); |
| 371 | 371 |
| 372 Future run(List<String> args) { | 372 Future run(List<String> args) async { |
| 373 if (args.length > 1) { | 373 if (args.length > 1) { |
| 374 debugger.console.print('not implemented'); | 374 debugger.console.print('not implemented'); |
| 375 return new Future.value(null); | 375 return new Future.value(null); |
| 376 } | 376 } |
| 377 var arg = (args.length == 0 ? '' : args[0]); | 377 var arg = (args.length == 0 ? '' : args[0]); |
| 378 return SourceLocation.parse(debugger, arg).then((loc) { | 378 var loc = await SourceLocation.parse(debugger, arg); |
| 379 if (loc.valid) { | 379 if (loc.valid) { |
| 380 if (loc.function != null) { | 380 if (loc.function != null) { |
| 381 return debugger.isolate.addBreakpointAtEntry(loc.function) | 381 try { |
| 382 .then((result) => _handleBreakpointResult(loc, result)); | 382 await debugger.isolate.addBreakpointAtEntry(loc.function); |
| 383 } else { | 383 } on ServerRpcException catch(e) { |
| 384 assert(loc.script != null); | 384 if (e.code == ServerRpcException.kNoBreakAtFunction) { |
| 385 if (loc.col != null) { | 385 debugger.console.print('Unable to set breakpoint at ${loc}'); |
| 386 // TODO(turnidge): Add tokenPos breakpoint support. | 386 } else { |
| 387 debugger.console.print( | 387 rethrow; |
| 388 'Ignoring column: ' | |
| 389 'adding breakpoint at a specific column not yet implemented'); | |
| 390 } | 388 } |
| 391 return debugger.isolate.addBreakpoint(loc.script, loc.line) | |
| 392 .then((result) => _handleBreakpointResult(loc, result)); | |
| 393 } | 389 } |
| 394 } else { | 390 } else { |
| 395 debugger.console.print(loc.errorMessage); | 391 assert(loc.script != null); |
| 392 if (loc.col != null) { |
| 393 // TODO(turnidge): Add tokenPos breakpoint support. |
| 394 debugger.console.print( |
| 395 'Ignoring column: ' |
| 396 'adding breakpoint at a specific column not yet implemented'); |
| 397 } |
| 398 try { |
| 399 await debugger.isolate.addBreakpoint(loc.script, loc.line); |
| 400 } on ServerRpcException catch(e) { |
| 401 if (e.code == ServerRpcException.kNoBreakAtLine) { |
| 402 debugger.console.print('Unable to set breakpoint at ${loc}'); |
| 403 } else { |
| 404 rethrow; |
| 405 } |
| 406 } |
| 396 } | 407 } |
| 397 }); | |
| 398 } | |
| 399 | |
| 400 Future _handleBreakpointResult(loc, result) { | |
| 401 if (result is DartError) { | |
| 402 debugger.console.print('Unable to set breakpoint at ${loc}'); | |
| 403 } else { | 408 } else { |
| 404 // TODO(turnidge): Adding a duplicate breakpoint is | 409 debugger.console.print(loc.errorMessage); |
| 405 // currently ignored. May want to change the protocol to | |
| 406 // inform us when this happens. | |
| 407 } | 410 } |
| 408 return new Future.value(null); | |
| 409 } | 411 } |
| 410 | 412 |
| 411 Future<List<String>> complete(List<String> args) { | 413 Future<List<String>> complete(List<String> args) { |
| 412 if (args.length != 1) { | 414 if (args.length != 1) { |
| 413 return new Future.value([args.join('')]); | 415 return new Future.value([args.join('')]); |
| 414 } | 416 } |
| 415 // TODO - fix SourceLocation complete | 417 // TODO - fix SourceLocation complete |
| 416 return new Future.value(SourceLocation.complete(debugger, args[0])); | 418 return new Future.value(SourceLocation.complete(debugger, args[0])); |
| 417 } | 419 } |
| 418 | 420 |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 console.print('No current isolate'); | 963 console.print('No current isolate'); |
| 962 } else if (_isolate.idle) { | 964 } else if (_isolate.idle) { |
| 963 console.print('Isolate is idle'); | 965 console.print('Isolate is idle'); |
| 964 } else if (_isolate.running) { | 966 } else if (_isolate.running) { |
| 965 console.print("Isolate is running (type 'pause' to interrupt)"); | 967 console.print("Isolate is running (type 'pause' to interrupt)"); |
| 966 } else if (_isolate.pauseEvent != null) { | 968 } else if (_isolate.pauseEvent != null) { |
| 967 _reportPause(_isolate.pauseEvent); | 969 _reportPause(_isolate.pauseEvent); |
| 968 } else { | 970 } else { |
| 969 console.print('Isolate is in unknown state'); | 971 console.print('Isolate is in unknown state'); |
| 970 } | 972 } |
| 973 warnOutOfDate(); |
| 971 } | 974 } |
| 972 | 975 |
| 973 void _reportPause(ServiceEvent event) { | 976 void _reportPause(ServiceEvent event) { |
| 974 if (event.eventType == ServiceEvent.kPauseStart) { | 977 if (event.eventType == ServiceEvent.kPauseStart) { |
| 975 console.print( | 978 console.print( |
| 976 "Paused at isolate start (type 'continue' to start the isolate')"); | 979 "Paused at isolate start (type 'continue' to start the isolate')"); |
| 977 } else if (event.eventType == ServiceEvent.kPauseExit) { | 980 } else if (event.eventType == ServiceEvent.kPauseExit) { |
| 978 console.print( | 981 console.print( |
| 979 "Paused at isolate exit (type 'continue' to exit the isolate')"); | 982 "Paused at isolate exit (type 'continue' to exit the isolate')"); |
| 980 } | 983 } |
| 981 if (stack['frames'].length > 0) { | 984 if (stack['frames'].length > 0) { |
| 982 var frame = stack['frames'][0]; | 985 var frame = stack['frames'][0]; |
| 983 var script = frame['script']; | 986 var script = frame['script']; |
| 984 script.load().then((_) { | 987 script.load().then((_) { |
| 985 var line = script.tokenToLine(frame['tokenPos']); | 988 var line = script.tokenToLine(frame['tokenPos']); |
| 986 var col = script.tokenToCol(frame['tokenPos']); | 989 var col = script.tokenToCol(frame['tokenPos']); |
| 987 if (event.breakpoint != null) { | 990 if (event.breakpoint != null) { |
| 988 var bpId = event.breakpoint.number; | 991 var bpId = event.breakpoint.number; |
| 989 console.print('Breakpoint ${bpId} at ${script.name}:${line}:${col}'); | 992 console.print('Paused at breakpoint ${bpId} at ' |
| 993 '${script.name}:${line}:${col}'); |
| 990 } else if (event.exception != null) { | 994 } else if (event.exception != null) { |
| 991 // TODO(turnidge): Test this. | 995 // TODO(turnidge): Test this. |
| 992 console.print( | 996 console.print('Paused due to exception ${event.exception} at ' |
| 993 'Exception ${event.exception} at ${script.name}:${line}:${col}'); | 997 '${script.name}:${line}:${col}'); |
| 994 } else { | 998 } else { |
| 995 console.print('Paused at ${script.name}:${line}:${col}'); | 999 console.print('Paused at ${script.name}:${line}:${col}'); |
| 996 } | 1000 } |
| 997 }); | 1001 }); |
| 998 } | 1002 } |
| 999 } | 1003 } |
| 1000 | 1004 |
| 1001 Future _reportBreakpointEvent(ServiceEvent event) { | 1005 Future _reportBreakpointEvent(ServiceEvent event) { |
| 1002 var bpt = event.breakpoint; | 1006 var bpt = event.breakpoint; |
| 1003 var verb = null; | 1007 var verb = null; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 String lastCommand; | 1142 String lastCommand; |
| 1139 | 1143 |
| 1140 Future run(String command) { | 1144 Future run(String command) { |
| 1141 if (command == '' && lastCommand != null) { | 1145 if (command == '' && lastCommand != null) { |
| 1142 command = lastCommand; | 1146 command = lastCommand; |
| 1143 } | 1147 } |
| 1144 console.printBold('\$ $command'); | 1148 console.printBold('\$ $command'); |
| 1145 return cmd.runCommand(command).then((_) { | 1149 return cmd.runCommand(command).then((_) { |
| 1146 lastCommand = command; | 1150 lastCommand = command; |
| 1147 }).catchError((e, s) { | 1151 }).catchError((e, s) { |
| 1148 console.print('ERROR $e\n$s'); | 1152 if (e is NetworkRpcException) { |
| 1153 console.printRed('Unable to execute command because the connection ' |
| 1154 'to the VM has been closed'); |
| 1155 } else { |
| 1156 if (s != null) { |
| 1157 console.printRed('Internal error: $e\n$s'); |
| 1158 } else { |
| 1159 console.printRed('Internal error: $e\n'); |
| 1160 } |
| 1161 } |
| 1149 }); | 1162 }); |
| 1150 } | 1163 } |
| 1151 | 1164 |
| 1152 String historyPrev(String command) { | 1165 String historyPrev(String command) { |
| 1153 return cmd.historyPrev(command); | 1166 return cmd.historyPrev(command); |
| 1154 } | 1167 } |
| 1155 | 1168 |
| 1156 String historyNext(String command) { | 1169 String historyNext(String command) { |
| 1157 return cmd.historyNext(command); | 1170 return cmd.historyNext(command); |
| 1158 } | 1171 } |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 | 1357 |
| 1345 Set<Script> activeScripts() { | 1358 Set<Script> activeScripts() { |
| 1346 var s = new Set<Script>(); | 1359 var s = new Set<Script>(); |
| 1347 List frameElements = $['frameList'].children; | 1360 List frameElements = $['frameList'].children; |
| 1348 for (var frameElement in frameElements) { | 1361 for (var frameElement in frameElements) { |
| 1349 s.add(frameElement.children[0].script); | 1362 s.add(frameElement.children[0].script); |
| 1350 } | 1363 } |
| 1351 return s; | 1364 return s; |
| 1352 } | 1365 } |
| 1353 | 1366 |
| 1354 doPauseIsolate(_) { | 1367 Future doPauseIsolate() { |
| 1355 if (debugger != null) { | 1368 if (debugger != null) { |
| 1356 return debugger.isolate.pause(); | 1369 return debugger.isolate.pause(); |
| 1357 } else { | 1370 } else { |
| 1358 return new Future.value(null); | 1371 return new Future.value(null); |
| 1359 } | 1372 } |
| 1360 } | 1373 } |
| 1361 | 1374 |
| 1362 doRefreshStack(_) { | 1375 Future doRefreshStack() { |
| 1363 if (debugger != null) { | 1376 if (debugger != null) { |
| 1364 return debugger.refreshStack(); | 1377 return debugger.refreshStack(); |
| 1365 } else { | 1378 } else { |
| 1366 return new Future.value(null); | 1379 return new Future.value(null); |
| 1367 } | 1380 } |
| 1368 } | 1381 } |
| 1369 | 1382 |
| 1370 DebuggerStackElement.created() : super.created(); | 1383 DebuggerStackElement.created() : super.created(); |
| 1371 } | 1384 } |
| 1372 | 1385 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1565 var span = new SpanElement(); | 1578 var span = new SpanElement(); |
| 1566 span.classes.add('bold'); | 1579 span.classes.add('bold'); |
| 1567 span.appendText(line); | 1580 span.appendText(line); |
| 1568 if (newline) { | 1581 if (newline) { |
| 1569 span.appendText('\n'); | 1582 span.appendText('\n'); |
| 1570 } | 1583 } |
| 1571 $['consoleText'].children.add(span); | 1584 $['consoleText'].children.add(span); |
| 1572 span.scrollIntoView(); | 1585 span.scrollIntoView(); |
| 1573 } | 1586 } |
| 1574 | 1587 |
| 1588 void printRed(String line, { bool newline:true }) { |
| 1589 var span = new SpanElement(); |
| 1590 span.classes.add('red'); |
| 1591 span.appendText(line); |
| 1592 if (newline) { |
| 1593 span.appendText('\n'); |
| 1594 } |
| 1595 $['consoleText'].children.add(span); |
| 1596 span.scrollIntoView(); |
| 1597 } |
| 1598 |
| 1575 void printRef(Instance ref, { bool newline:true }) { | 1599 void printRef(Instance ref, { bool newline:true }) { |
| 1576 var refElement = new Element.tag('instance-ref'); | 1600 var refElement = new Element.tag('instance-ref'); |
| 1577 refElement.ref = ref; | 1601 refElement.ref = ref; |
| 1578 $['consoleText'].children.add(refElement); | 1602 $['consoleText'].children.add(refElement); |
| 1579 if (newline) { | 1603 if (newline) { |
| 1580 this.newline(); | 1604 this.newline(); |
| 1581 } | 1605 } |
| 1582 refElement.scrollIntoView(); | 1606 refElement.scrollIntoView(); |
| 1583 } | 1607 } |
| 1584 | 1608 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1643 default: | 1667 default: |
| 1644 busy = false; | 1668 busy = false; |
| 1645 break; | 1669 break; |
| 1646 } | 1670 } |
| 1647 }); | 1671 }); |
| 1648 } | 1672 } |
| 1649 | 1673 |
| 1650 DebuggerInputElement.created() : super.created(); | 1674 DebuggerInputElement.created() : super.created(); |
| 1651 } | 1675 } |
| 1652 | 1676 |
| OLD | NEW |