| 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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 'Syntax: continue\n' | 281 'Syntax: continue\n' |
| 282 ' c\n'; | 282 ' c\n'; |
| 283 } | 283 } |
| 284 | 284 |
| 285 class NextCommand extends DebuggerCommand { | 285 class NextCommand extends DebuggerCommand { |
| 286 NextCommand(Debugger debugger) : super(debugger, 'next', []); | 286 NextCommand(Debugger debugger) : super(debugger, 'next', []); |
| 287 | 287 |
| 288 Future run(List<String> args) { | 288 Future run(List<String> args) { |
| 289 if (debugger.isolatePaused()) { | 289 if (debugger.isolatePaused()) { |
| 290 var event = debugger.isolate.pauseEvent; | 290 var event = debugger.isolate.pauseEvent; |
| 291 if (event.eventType == ServiceEvent.kPauseStart) { | 291 if (event.kind == ServiceEvent.kPauseStart) { |
| 292 debugger.console.print("Type 'continue' to start the isolate"); | 292 debugger.console.print("Type 'continue' to start the isolate"); |
| 293 return new Future.value(null); | 293 return new Future.value(null); |
| 294 } | 294 } |
| 295 if (event.eventType == ServiceEvent.kPauseExit) { | 295 if (event.kind == ServiceEvent.kPauseExit) { |
| 296 debugger.console.print("Type 'continue' to exit the isolate"); | 296 debugger.console.print("Type 'continue' to exit the isolate"); |
| 297 return new Future.value(null); | 297 return new Future.value(null); |
| 298 } | 298 } |
| 299 return debugger.isolate.stepOver(); | 299 return debugger.isolate.stepOver(); |
| 300 } else { | 300 } else { |
| 301 debugger.console.print('The program is already running'); | 301 debugger.console.print('The program is already running'); |
| 302 return new Future.value(null); | 302 return new Future.value(null); |
| 303 } | 303 } |
| 304 } | 304 } |
| 305 | 305 |
| 306 String helpShort = | 306 String helpShort = |
| 307 'Continue running the isolate until it reaches the next source location ' | 307 'Continue running the isolate until it reaches the next source location ' |
| 308 'in the current function'; | 308 'in the current function'; |
| 309 | 309 |
| 310 String helpLong = | 310 String helpLong = |
| 311 'Continue running the isolate until it reaches the next source location ' | 311 'Continue running the isolate until it reaches the next source location ' |
| 312 'in the current function.\n' | 312 'in the current function.\n' |
| 313 '\n' | 313 '\n' |
| 314 'Syntax: next\n'; | 314 'Syntax: next\n'; |
| 315 } | 315 } |
| 316 | 316 |
| 317 class StepCommand extends DebuggerCommand { | 317 class StepCommand extends DebuggerCommand { |
| 318 StepCommand(Debugger debugger) : super(debugger, 'step', []); | 318 StepCommand(Debugger debugger) : super(debugger, 'step', []); |
| 319 | 319 |
| 320 Future run(List<String> args) { | 320 Future run(List<String> args) { |
| 321 if (debugger.isolatePaused()) { | 321 if (debugger.isolatePaused()) { |
| 322 var event = debugger.isolate.pauseEvent; | 322 var event = debugger.isolate.pauseEvent; |
| 323 if (event.eventType == ServiceEvent.kPauseStart) { | 323 if (event.kind == ServiceEvent.kPauseStart) { |
| 324 debugger.console.print("Type 'continue' to start the isolate"); | 324 debugger.console.print("Type 'continue' to start the isolate"); |
| 325 return new Future.value(null); | 325 return new Future.value(null); |
| 326 } | 326 } |
| 327 if (event.eventType == ServiceEvent.kPauseExit) { | 327 if (event.kind == ServiceEvent.kPauseExit) { |
| 328 debugger.console.print("Type 'continue' to exit the isolate"); | 328 debugger.console.print("Type 'continue' to exit the isolate"); |
| 329 return new Future.value(null); | 329 return new Future.value(null); |
| 330 } | 330 } |
| 331 return debugger.isolate.stepInto(); | 331 return debugger.isolate.stepInto(); |
| 332 } else { | 332 } else { |
| 333 debugger.console.print('The program is already running'); | 333 debugger.console.print('The program is already running'); |
| 334 return new Future.value(null); | 334 return new Future.value(null); |
| 335 } | 335 } |
| 336 } | 336 } |
| 337 | 337 |
| (...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 925 reportStatus(); | 925 reportStatus(); |
| 926 }); | 926 }); |
| 927 } | 927 } |
| 928 | 928 |
| 929 bool isolatePaused() { | 929 bool isolatePaused() { |
| 930 // TODO(turnidge): Stop relying on the isolate to track the last | 930 // TODO(turnidge): Stop relying on the isolate to track the last |
| 931 // pause event. Since we listen to events directly in the | 931 // pause event. Since we listen to events directly in the |
| 932 // debugger, this could introduce a race. | 932 // debugger, this could introduce a race. |
| 933 return (isolate != null && | 933 return (isolate != null && |
| 934 isolate.pauseEvent != null && | 934 isolate.pauseEvent != null && |
| 935 isolate.pauseEvent.eventType != ServiceEvent.kResume); | 935 isolate.pauseEvent.kind != ServiceEvent.kResume); |
| 936 } | 936 } |
| 937 | 937 |
| 938 void warnOutOfDate() { | 938 void warnOutOfDate() { |
| 939 // Wait a bit, then tell the user that the stack may be out of date. | 939 // Wait a bit, then tell the user that the stack may be out of date. |
| 940 new Timer(const Duration(seconds:2), () { | 940 new Timer(const Duration(seconds:2), () { |
| 941 if (!isolatePaused()) { | 941 if (!isolatePaused()) { |
| 942 stackElement.isSampled = true; | 942 stackElement.isSampled = true; |
| 943 } | 943 } |
| 944 }); | 944 }); |
| 945 } | 945 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 967 console.print("Isolate is running (type 'pause' to interrupt)"); | 967 console.print("Isolate is running (type 'pause' to interrupt)"); |
| 968 } else if (_isolate.pauseEvent != null) { | 968 } else if (_isolate.pauseEvent != null) { |
| 969 _reportPause(_isolate.pauseEvent); | 969 _reportPause(_isolate.pauseEvent); |
| 970 } else { | 970 } else { |
| 971 console.print('Isolate is in unknown state'); | 971 console.print('Isolate is in unknown state'); |
| 972 } | 972 } |
| 973 warnOutOfDate(); | 973 warnOutOfDate(); |
| 974 } | 974 } |
| 975 | 975 |
| 976 void _reportPause(ServiceEvent event) { | 976 void _reportPause(ServiceEvent event) { |
| 977 if (event.eventType == ServiceEvent.kPauseStart) { | 977 if (event.kind == ServiceEvent.kPauseStart) { |
| 978 console.print( | 978 console.print( |
| 979 "Paused at isolate start (type 'continue' to start the isolate')"); | 979 "Paused at isolate start (type 'continue' to start the isolate')"); |
| 980 } else if (event.eventType == ServiceEvent.kPauseExit) { | 980 } else if (event.kind == ServiceEvent.kPauseExit) { |
| 981 console.print( | 981 console.print( |
| 982 "Paused at isolate exit (type 'continue' to exit the isolate')"); | 982 "Paused at isolate exit (type 'continue' to exit the isolate')"); |
| 983 } | 983 } |
| 984 if (stack['frames'].length > 0) { | 984 if (stack['frames'].length > 0) { |
| 985 var frame = stack['frames'][0]; | 985 var frame = stack['frames'][0]; |
| 986 var script = frame['script']; | 986 var script = frame['script']; |
| 987 script.load().then((_) { | 987 script.load().then((_) { |
| 988 var line = script.tokenToLine(frame['tokenPos']); | 988 var line = script.tokenToLine(frame['tokenPos']); |
| 989 var col = script.tokenToCol(frame['tokenPos']); | 989 var col = script.tokenToCol(frame['tokenPos']); |
| 990 if (event.breakpoint != null) { | 990 if (event.breakpoint != null) { |
| 991 var bpId = event.breakpoint.number; | 991 var bpId = event.breakpoint.number; |
| 992 console.print('Paused at breakpoint ${bpId} at ' | 992 console.print('Paused at breakpoint ${bpId} at ' |
| 993 '${script.name}:${line}:${col}'); | 993 '${script.name}:${line}:${col}'); |
| 994 } else if (event.exception != null) { | 994 } else if (event.exception != null) { |
| 995 // TODO(turnidge): Test this. | 995 // TODO(turnidge): Test this. |
| 996 console.print('Paused due to exception ${event.exception} at ' | 996 console.print('Paused due to exception ${event.exception} at ' |
| 997 '${script.name}:${line}:${col}'); | 997 '${script.name}:${line}:${col}'); |
| 998 } else { | 998 } else { |
| 999 console.print('Paused at ${script.name}:${line}:${col}'); | 999 console.print('Paused at ${script.name}:${line}:${col}'); |
| 1000 } | 1000 } |
| 1001 }); | 1001 }); |
| 1002 } | 1002 } |
| 1003 } | 1003 } |
| 1004 | 1004 |
| 1005 Future _reportBreakpointEvent(ServiceEvent event) { | 1005 Future _reportBreakpointEvent(ServiceEvent event) { |
| 1006 var bpt = event.breakpoint; | 1006 var bpt = event.breakpoint; |
| 1007 var verb = null; | 1007 var verb = null; |
| 1008 switch (event.eventType) { | 1008 switch (event.kind) { |
| 1009 case ServiceEvent.kBreakpointAdded: | 1009 case ServiceEvent.kBreakpointAdded: |
| 1010 verb = 'added'; | 1010 verb = 'added'; |
| 1011 break; | 1011 break; |
| 1012 case ServiceEvent.kBreakpointResolved: | 1012 case ServiceEvent.kBreakpointResolved: |
| 1013 verb = 'resolved'; | 1013 verb = 'resolved'; |
| 1014 break; | 1014 break; |
| 1015 case ServiceEvent.kBreakpointRemoved: | 1015 case ServiceEvent.kBreakpointRemoved: |
| 1016 verb = 'removed'; | 1016 verb = 'removed'; |
| 1017 break; | 1017 break; |
| 1018 default: | 1018 default: |
| 1019 break; | 1019 break; |
| 1020 } | 1020 } |
| 1021 var script = bpt.script; | 1021 var script = bpt.script; |
| 1022 return script.load().then((_) { | 1022 return script.load().then((_) { |
| 1023 var bpId = bpt.number; | 1023 var bpId = bpt.number; |
| 1024 var tokenPos = bpt.tokenPos; | 1024 var tokenPos = bpt.tokenPos; |
| 1025 var line = script.tokenToLine(tokenPos); | 1025 var line = script.tokenToLine(tokenPos); |
| 1026 var col = script.tokenToCol(tokenPos); | 1026 var col = script.tokenToCol(tokenPos); |
| 1027 if (bpt.resolved) { | 1027 if (bpt.resolved) { |
| 1028 console.print( | 1028 console.print( |
| 1029 'Breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}'); | 1029 'Breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}'); |
| 1030 } else { | 1030 } else { |
| 1031 console.print( | 1031 console.print( |
| 1032 'Future breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}'
); | 1032 'Future breakpoint ${bpId} ${verb} at ${script.name}:${line}:${col}'
); |
| 1033 } | 1033 } |
| 1034 }); | 1034 }); |
| 1035 } | 1035 } |
| 1036 | 1036 |
| 1037 void _onEvent(ServiceEvent event) { | 1037 void _onEvent(ServiceEvent event) { |
| 1038 switch(event.eventType) { | 1038 switch(event.kind) { |
| 1039 case ServiceEvent.kIsolateStart: | 1039 case ServiceEvent.kIsolateStart: |
| 1040 { | 1040 { |
| 1041 var iso = event.owner; | 1041 var iso = event.owner; |
| 1042 console.print( | 1042 console.print( |
| 1043 "Isolate ${iso.number} '${iso.name}' has been created"); | 1043 "Isolate ${iso.number} '${iso.name}' has been created"); |
| 1044 } | 1044 } |
| 1045 break; | 1045 break; |
| 1046 | 1046 |
| 1047 case ServiceEvent.kIsolateExit: | 1047 case ServiceEvent.kIsolateExit: |
| 1048 { | 1048 { |
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1667 default: | 1667 default: |
| 1668 busy = false; | 1668 busy = false; |
| 1669 break; | 1669 break; |
| 1670 } | 1670 } |
| 1671 }); | 1671 }); |
| 1672 } | 1672 } |
| 1673 | 1673 |
| 1674 DebuggerInputElement.created() : super.created(); | 1674 DebuggerInputElement.created() : super.created(); |
| 1675 } | 1675 } |
| 1676 | 1676 |
| OLD | NEW |