Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: pkg/dartino_compiler/lib/vm_context.dart

Issue 1987673002: Initial Implementation of the vm-service protocol (Closed) Base URL: git@github.com:dartino/sdk.git@master
Patch Set: Merge Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dartino 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.md file. 3 // BSD-style license that can be found in the LICENSE.md file.
4 4
5 library dartino.vm_session; 5 library dartino.vm_session;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 8
9 import 'dart:typed_data' show 9 import 'dart:typed_data' show
10 ByteData; 10 ByteData;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 // TODO(sigurdm): for now only the stdio and stderr events are actually 77 // TODO(sigurdm): for now only the stdio and stderr events are actually
78 // notified. 78 // notified.
79 abstract class DebugListener { 79 abstract class DebugListener {
80 // Notification that a new process has started. 80 // Notification that a new process has started.
81 processStart(int processId) {} 81 processStart(int processId) {}
82 // Notification that a process is ready to run. 82 // Notification that a process is ready to run.
83 processRunnable(int processId) {} 83 processRunnable(int processId) {}
84 // Notification that a process has exited. 84 // Notification that a process has exited.
85 processExit(int processId) {} 85 processExit(int processId) {}
86 // A process has paused at start, before executing code. 86 // A process has paused at start, before executing code.
87 pauseStart(int processId, BackTraceFrame topframe) {} 87 // This is sent on spawning processes.
88 pauseStart(int processId) {}
88 // An process has paused at exit, before terminating. 89 // An process has paused at exit, before terminating.
89 pauseExit(int processId, BackTraceFrame topframe) {} 90 pauseExit(int processId, BackTraceFrame topFrame) {}
90 // A process has paused at a breakpoint or due to stepping. 91 // A process has paused at a breakpoint or due to stepping.
91 pauseBreakpoint(int processId, BackTraceFrame topframe, int breakpointId) {} 92 pauseBreakpoint(
93 int processId, BackTraceFrame topFrame, Breakpoint breakpoint) {}
92 // A process has paused due to interruption. 94 // A process has paused due to interruption.
93 pauseInterrupted(int processId, BackTraceFrame topframe) {} 95 pauseInterrupted(int processId, BackTraceFrame topFrame) {}
94 // A process has paused due to an exception. 96 // A process has paused due to an exception.
95 pauseException(int processId, BackTraceFrame topframe, RemoteObject thrown) {} 97 pauseException(int processId, BackTraceFrame topFrame, RemoteObject thrown) {}
96 // A process has started or resumed execution. 98 // A process has started or resumed execution.
97 resume(int processId) {} 99 resume(int processId) {}
98 // A breakpoint has been added for a process. 100 // A breakpoint has been added for a process.
99 breakpointAdded(int processId, Breakpoint breakpoint) {} 101 breakpointAdded(int processId, Breakpoint breakpoint) {}
100 // A breakpoint has been removed. 102 // A breakpoint has been removed.
101 breakpointRemoved(int processId, Breakpoint breakpoint) {} 103 breakpointRemoved(int processId, Breakpoint breakpoint) {}
102 // A garbage collection event. 104 // A garbage collection event.
103 gc(int processId) {} 105 gc(int processId) {}
104 // Notification of bytes written to stdout. 106 // Notification of bytes written to stdout.
105 writeStdOut(int processId, List<int> data) {} 107 writeStdOut(int processId, List<int> data) {}
106 // Notification of bytes written stderr. 108 // Notification of bytes written stderr.
107 writeStdErr(int processId, List<int> data) {} 109 writeStdErr(int processId, List<int> data) {}
108 // The connection to the vm was lost. 110 // The connection to the vm was lost.
109 lostConnection() {} 111 lostConnection() {}
112 // The debugged program is over.
113 terminated() {}
110 } 114 }
111 115
112 class SinkDebugListener extends DebugListener { 116 class SinkDebugListener extends DebugListener {
113 final Sink stdoutSink; 117 final Sink stdoutSink;
114 final Sink stderrSink; 118 final Sink stderrSink;
115 SinkDebugListener(this.stdoutSink, this.stderrSink); 119 SinkDebugListener(this.stdoutSink, this.stderrSink);
116 120
117 writeStdOut(int processId, List<int> data) { 121 writeStdOut(int processId, List<int> data) {
118 stdoutSink.add(data); 122 stdoutSink.add(data);
119 } 123 }
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 while (!_drainedIncomingCommands) { 305 while (!_drainedIncomingCommands) {
302 VmCommand response = await readNextCommand(force: false); 306 VmCommand response = await readNextCommand(force: false);
303 if (!ignoreExtraCommands && response != null) { 307 if (!ignoreExtraCommands && response != null) {
304 await kill(); 308 await kill();
305 throw new StateError( 309 throw new StateError(
306 "Got unexpected command from dartino-vm during shutdown " 310 "Got unexpected command from dartino-vm during shutdown "
307 "($response)"); 311 "($response)");
308 } 312 }
309 } 313 }
310 vmState = VmState.terminated; 314 vmState = VmState.terminated;
315 listeners.forEach((DebugListener listener) {
316 listener.terminated();
317 });
Søren Gjesse 2016/06/13 13:06:30 Would it make sense to have a method for this iter
sigurdm 2016/06/14 08:17:21 Done
311 return connection.done; 318 return connection.done;
312 } 319 }
313 320
314 Future interrupt() { 321 Future interrupt() {
315 return sendCommand(const ProcessDebugInterrupt()); 322 return sendCommand(const ProcessDebugInterrupt());
316 } 323 }
317 324
318 /// Closes the connection to the dartino-vm. It does not wait until it shuts 325 /// Closes the connection to the dartino-vm. It does not wait until it shuts
319 /// down. 326 /// down.
320 /// 327 ///
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 VmCommand reply = await runCommand(const Debugging()); 409 VmCommand reply = await runCommand(const Debugging());
403 if (reply == null || reply is! DebuggingReply) { 410 if (reply == null || reply is! DebuggingReply) {
404 throw new Exception("Expected a reply from the debugging command"); 411 throw new Exception("Expected a reply from the debugging command");
405 } 412 }
406 return reply; 413 return reply;
407 } 414 }
408 415
409 Future spawnProcess(List<String> arguments) async { 416 Future spawnProcess(List<String> arguments) async {
410 await runCommand(new ProcessSpawnForMain(arguments)); 417 await runCommand(new ProcessSpawnForMain(arguments));
411 vmState = VmState.spawned; 418 vmState = VmState.spawned;
419 listeners.forEach((DebugListener listener) {
420 listener.pauseStart(0);
421 listener.processRunnable(0);
422 });
412 } 423 }
413 424
414 /// Returns the [NameOffsetMapping] stored in the '.info.json' adjacent to a 425 /// Returns the [NameOffsetMapping] stored in the '.info.json' adjacent to a
415 /// snapshot location. 426 /// snapshot location.
416 Future<NameOffsetMapping> getInfoFromSnapshotLocation(Uri snapshot) async { 427 Future<NameOffsetMapping> getInfoFromSnapshotLocation(Uri snapshot) async {
417 Uri info = snapshot.replace(path: "${snapshot.path}.info.json"); 428 Uri info = snapshot.replace(path: "${snapshot.path}.info.json");
418 File infoFile = new File.fromUri(info); 429 File infoFile = new File.fromUri(info);
419 430
420 if (!await infoFile.exists()) { 431 if (!await infoFile.exists()) {
421 await shutdown(); 432 await shutdown();
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 // This method handles the various responses a command can return to indicate 511 // This method handles the various responses a command can return to indicate
501 // the process has stopped running. 512 // the process has stopped running.
502 // The session's state is updated to match the current state of the vm. 513 // The session's state is updated to match the current state of the vm.
503 Future<VmCommand> handleProcessStop(VmCommand response) async { 514 Future<VmCommand> handleProcessStop(VmCommand response) async {
504 interactiveExitCode = exit_codes.COMPILER_EXITCODE_CRASH; 515 interactiveExitCode = exit_codes.COMPILER_EXITCODE_CRASH;
505 debugState.reset(); 516 debugState.reset();
506 switch (response.code) { 517 switch (response.code) {
507 case VmCommandCode.UncaughtException: 518 case VmCommandCode.UncaughtException:
508 interactiveExitCode = exit_codes.DART_VM_EXITCODE_UNCAUGHT_EXCEPTION; 519 interactiveExitCode = exit_codes.DART_VM_EXITCODE_UNCAUGHT_EXCEPTION;
509 vmState = VmState.terminating; 520 vmState = VmState.terminating;
521 UncaughtException command = response;
522 debugState.currentProcess = command.processId;
523 var function = dartinoSystem.lookupFunctionById(command.functionId);
524 debugState.topFrame = new BackTraceFrame(
525 function, command.bytecodeIndex, compiler, debugState);
526 RemoteObject thrown = await uncaughtException();
527 listeners.forEach((DebugListener listener) {
528 listener.pauseException(
529 debugState.currentProcess, debugState.topFrame, thrown);
530 });
510 break; 531 break;
511 532
512 case VmCommandCode.ProcessCompileTimeError: 533 case VmCommandCode.ProcessCompileTimeError:
534 listeners.forEach((DebugListener listener) {
535 listener.pauseException(0, null, null); // XXX
Søren Gjesse 2016/06/13 13:06:30 What is the XXX comment about?
sigurdm 2016/06/14 08:17:21 About passing the right arguments. Changed to a pr
536 });
513 interactiveExitCode = exit_codes.DART_VM_EXITCODE_COMPILE_TIME_ERROR; 537 interactiveExitCode = exit_codes.DART_VM_EXITCODE_COMPILE_TIME_ERROR;
514 vmState = VmState.terminating; 538 vmState = VmState.terminating;
515 break; 539 break;
516 540
517 case VmCommandCode.ProcessTerminated: 541 case VmCommandCode.ProcessTerminated:
518 interactiveExitCode = 0; 542 interactiveExitCode = 0;
519 vmState = VmState.terminating; 543 listeners.forEach((DebugListener listener) {
544 listener.processExit(0); // XXX
Søren Gjesse 2016/06/13 13:06:30 ditto.
sigurdm 2016/06/14 08:17:21 Ditto
545 });
520 break; 546 break;
521 547
522 case VmCommandCode.ConnectionError: 548 case VmCommandCode.ConnectionError:
523 interactiveExitCode = exit_codes.COMPILER_EXITCODE_CONNECTION_ERROR; 549 interactiveExitCode = exit_codes.COMPILER_EXITCODE_CONNECTION_ERROR;
524 vmState = VmState.terminating; 550 vmState = VmState.terminating;
525 await shutdown(); 551 await shutdown();
552 listeners.forEach((DebugListener listener) {
553 listener.lostConnection();
554 });
526 break; 555 break;
527 556
528 case VmCommandCode.ProcessBreakpoint: 557 case VmCommandCode.ProcessBreakpoint:
529 interactiveExitCode = 0; 558 interactiveExitCode = 0;
530 ProcessBreakpoint command = response; 559 ProcessBreakpoint command = response;
531 debugState.currentProcess = command.processId; 560 debugState.currentProcess = command.processId;
532 var function = dartinoSystem.lookupFunctionById(command.functionId); 561 var function = dartinoSystem.lookupFunctionById(command.functionId);
533 debugState.topFrame = new BackTraceFrame( 562 debugState.topFrame = new BackTraceFrame(
534 function, command.bytecodeIndex, compiler, debugState); 563 function, command.bytecodeIndex, compiler, debugState);
535 vmState = VmState.paused; 564 vmState = VmState.paused;
565 Breakpoint bp = debugState.breakpoints[command.breakpointId];
566 if (bp == null) {
567 listeners.forEach((DebugListener listener) {
568 listener.pauseInterrupted(
569 command.processId,
570 debugState.topFrame);
571 });
572 } else {
573 listeners.forEach((DebugListener listener) {
574 listener.pauseBreakpoint(
575 command.processId,
576 debugState.topFrame,
577 bp);
578 });
579 }
536 break; 580 break;
537 581
538 default: 582 default:
539 throw new StateError( 583 throw new StateError(
540 "Unhandled response from Dartino VM connection: ${response.code}"); 584 "Unhandled response from Dartino VM connection: ${response.code}");
541 585
542 } 586 }
543 return response; 587 return response;
544 } 588 }
545 589
546 Future<VmCommand> startRunning() async { 590 Future<VmCommand> startRunning() async {
547 await sendCommand(const ProcessRun()); 591 await sendCommand(const ProcessRun());
548 vmState = VmState.running; 592 vmState = VmState.running;
593 listeners.forEach((DebugListener listener) {
594 listener.processStart(0);
595 });
596 listeners.forEach((DebugListener listener) {
597 listener.processRunnable(0);
598 });
599 listeners.forEach((DebugListener listener) {
600 listener.resume(0);
601 });
549 return handleProcessStop(await readNextCommand()); 602 return handleProcessStop(await readNextCommand());
550 } 603 }
551 604
552 Future setBreakpointHelper(String name, 605 Future<Breakpoint> setBreakpointHelper(DartinoFunction function,
553 DartinoFunction function,
554 int bytecodeIndex) async { 606 int bytecodeIndex) async {
555 ProcessSetBreakpoint response = await runCommands([ 607 ProcessSetBreakpoint response = await runCommands([
556 new PushFromMap(MapId.methods, function.functionId), 608 new PushFromMap(MapId.methods, function.functionId),
557 new ProcessSetBreakpoint(bytecodeIndex), 609 new ProcessSetBreakpoint(bytecodeIndex),
558 ]); 610 ]);
559 int breakpointId = response.value; 611 int breakpointId = response.value;
560 var breakpoint = new Breakpoint(function, bytecodeIndex, breakpointId); 612 Breakpoint breakpoint =
613 new Breakpoint(function, bytecodeIndex, breakpointId);
561 debugState.breakpoints[breakpointId] = breakpoint; 614 debugState.breakpoints[breakpointId] = breakpoint;
615 listeners.forEach(
616 (DebugListener listener) => listener.breakpointAdded(0, breakpoint));
562 return breakpoint; 617 return breakpoint;
563 } 618 }
564 619
565 // TODO(ager): Let setBreakpoint return a stream instead and deal with 620 // TODO(ager): Let setBreakpoint return a stream instead and deal with
566 // error situations such as bytecode indices that are out of bounds for 621 // error situations such as bytecode indices that are out of bounds for
567 // some of the methods with the given name. 622 // some of the methods with the given name.
568 Future setBreakpoint({String methodName, int bytecodeIndex}) async { 623 Future setBreakpoint({String methodName, int bytecodeIndex}) async {
569 Iterable<DartinoFunction> functions = 624 Iterable<DartinoFunction> functions =
570 dartinoSystem.functionsWhere((f) => f.name == methodName); 625 dartinoSystem.functionsWhere((f) => f.name == methodName);
571 List<Breakpoint> breakpoints = []; 626 List<Breakpoint> breakpoints = [];
572 for (DartinoFunction function in functions) { 627 for (DartinoFunction function in functions) {
573 breakpoints.add( 628 breakpoints.add(
574 await setBreakpointHelper(methodName, function, bytecodeIndex)); 629 await setBreakpointHelper(function, bytecodeIndex));
575 } 630 }
576 return breakpoints; 631 return breakpoints;
577 } 632 }
578 633
579 Future setFileBreakpointFromPosition(String name, 634 Future<Breakpoint> setFileBreakpointFromPosition(String name,
580 Uri file, 635 Uri file,
581 int position) async { 636 int position) async {
582 if (position == null) { 637 if (position == null) {
583 return null; 638 return null;
584 } 639 }
585 DebugInfo debugInfo = compiler.debugInfoForPosition( 640 DebugInfo debugInfo = compiler.debugInfoForPosition(
586 file, 641 file,
587 position, 642 position,
588 dartinoSystem); 643 dartinoSystem);
589 if (debugInfo == null) { 644 if (debugInfo == null) {
590 return null; 645 return null;
591 } 646 }
592 SourceLocation location = debugInfo.locationForPosition(position); 647 SourceLocation location = debugInfo.locationForPosition(position);
593 if (location == null) { 648 if (location == null) {
594 return null; 649 return null;
595 } 650 }
596 DartinoFunction function = debugInfo.function; 651 DartinoFunction function = debugInfo.function;
597 int bytecodeIndex = location.bytecodeIndex; 652 int bytecodeIndex = location.bytecodeIndex;
598 return setBreakpointHelper(function.name, function, bytecodeIndex); 653 return setBreakpointHelper(function, bytecodeIndex);
599 } 654 }
600 655
601 Future setFileBreakpointFromPattern(Uri file, 656 Future<Breakpoint> setFileBreakpointFromPattern(Uri file,
602 int line, 657 int line,
603 String pattern) async { 658 String pattern) async {
604 assert(line > 0); 659 assert(line > 0);
605 int position = compiler.positionInFileFromPattern(file, line - 1, pattern); 660 int position = compiler.positionInFileFromPattern(file, line - 1, pattern);
606 return setFileBreakpointFromPosition( 661 return setFileBreakpointFromPosition(
607 '$file:$line:$pattern', file, position); 662 '$file:$line:$pattern', file, position);
608 } 663 }
609 664
610 Future setFileBreakpoint(Uri file, int line, int column) async { 665 Future<Breakpoint> setFileBreakpoint(Uri file, int line, int column) async {
611 assert(line > 0 && column > 0); 666 assert(line > 0 && column > 0);
612 int position = compiler.positionInFile(file, line - 1, column - 1); 667 int position = compiler.positionInFile(file, line - 1, column - 1);
613 return setFileBreakpointFromPosition('$file:$line:$column', file, position); 668 return setFileBreakpointFromPosition('$file:$line:$column', file, position);
614 } 669 }
615 670
616 Future doDeleteOneShotBreakpoint(int processId, int breakpointId) async { 671 Future<Null> doDeleteOneShotBreakpoint(
672 int processId, int breakpointId) async {
617 ProcessDeleteBreakpoint response = await runCommand( 673 ProcessDeleteBreakpoint response = await runCommand(
618 new ProcessDeleteOneShotBreakpoint(processId, breakpointId)); 674 new ProcessDeleteOneShotBreakpoint(processId, breakpointId));
619 assert(response.id == breakpointId); 675 assert(response.id == breakpointId);
620 } 676 }
621 677
622 Future<Breakpoint> deleteBreakpoint(int id) async { 678 Future<Breakpoint> deleteBreakpoint(int id) async {
679 assert(!isRunning && !isTerminated);
623 if (!debugState.breakpoints.containsKey(id)) { 680 if (!debugState.breakpoints.containsKey(id)) {
624 return null; 681 return null;
625 } 682 }
626 ProcessDeleteBreakpoint response = 683 ProcessDeleteBreakpoint response =
627 await runCommand(new ProcessDeleteBreakpoint(id)); 684 await runCommand(new ProcessDeleteBreakpoint(id));
628 assert(response.id == id); 685 assert(response.id == id);
629 return debugState.breakpoints.remove(id); 686 Breakpoint breakpoint = debugState.breakpoints.remove(id);
687 listeners.forEach((DebugListener listener) {
688 listener.breakpointRemoved(0, breakpoint);
689 });
690 return breakpoint;
630 } 691 }
631 692
632 List<Breakpoint> breakpoints() { 693 List<Breakpoint> breakpoints() {
633 assert(debugState.breakpoints != null); 694 assert(debugState.breakpoints != null);
634 return debugState.breakpoints.values.toList(); 695 return debugState.breakpoints.values.toList();
635 } 696 }
636 697
637 Iterable<Uri> findSourceFiles(Pattern pattern) { 698 Iterable<Uri> findSourceFiles(Pattern pattern) {
638 return compiler.findSourceFiles(pattern); 699 return compiler.findSourceFiles(pattern);
639 } 700 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 response.breakpointId == setBreakpoint.value; 803 response.breakpointId == setBreakpoint.value;
743 if (!success && !isTerminated && setBreakpoint.value != -1) { 804 if (!success && !isTerminated && setBreakpoint.value != -1) {
744 // Delete the initial one-time breakpoint as it wasn't hit. 805 // Delete the initial one-time breakpoint as it wasn't hit.
745 await doDeleteOneShotBreakpoint(processId, setBreakpoint.value); 806 await doDeleteOneShotBreakpoint(processId, setBreakpoint.value);
746 } 807 }
747 return response; 808 return response;
748 } 809 }
749 810
750 Future<VmCommand> cont() async { 811 Future<VmCommand> cont() async {
751 assert(isPaused); 812 assert(isPaused);
813 listeners.forEach((DebugListener listener) {
814 listener.resume(0);
815 });
752 return handleProcessStop(await runCommand(const ProcessContinue())); 816 return handleProcessStop(await runCommand(const ProcessContinue()));
753 } 817 }
754 818
755 bool selectFrame(int frame) { 819 bool selectFrame(int frame) {
756 if (debugState.currentBackTrace == null || 820 if (debugState.currentBackTrace == null ||
757 debugState.currentBackTrace.actualFrameNumber(frame) == -1) { 821 debugState.currentBackTrace.actualFrameNumber(frame) == -1) {
758 return false; 822 return false;
759 } 823 }
760 debugState.currentFrame = frame; 824 debugState.currentFrame = frame;
761 return true; 825 return true;
(...skipping 29 matching lines...) Expand all
791 } else { 855 } else {
792 assert(response is InstanceStructure); 856 assert(response is InstanceStructure);
793 List<DartValue> fields = await readInstanceStructureFields(response); 857 List<DartValue> fields = await readInstanceStructureFields(response);
794 debugState.currentUncaughtException = 858 debugState.currentUncaughtException =
795 new RemoteInstance(response, fields); 859 new RemoteInstance(response, fields);
796 } 860 }
797 } 861 }
798 return debugState.currentUncaughtException; 862 return debugState.currentUncaughtException;
799 } 863 }
800 864
801 Future<BackTrace> backTrace() async { 865 Future<BackTrace> backTrace({int processId}) async {
866 processId ??= debugState.currentProcess;
802 assert(isSpawned); 867 assert(isSpawned);
803 if (debugState.currentBackTrace == null) { 868 if (debugState.currentBackTrace == null) {
804 ProcessBacktrace backtraceResponse = 869 ProcessBacktrace backtraceResponse =
805 await runCommand( 870 await runCommand(
806 new ProcessBacktraceRequest(debugState.currentProcess)); 871 new ProcessBacktraceRequest(processId));
807 debugState.currentBackTrace = 872 debugState.currentBackTrace =
808 stackTraceFromBacktraceResponse(backtraceResponse); 873 stackTraceFromBacktraceResponse(backtraceResponse);
809 } 874 }
810 return debugState.currentBackTrace; 875 return debugState.currentBackTrace;
811 } 876 }
812 877
813 Future<BackTrace> backtraceForFiber(int fiber) async { 878 Future<BackTrace> backtraceForFiber(int fiber) async {
814 ProcessBacktrace backtraceResponse = 879 ProcessBacktrace backtraceResponse =
815 await runCommand(new ProcessFiberBacktraceRequest(fiber)); 880 await runCommand(new ProcessFiberBacktraceRequest(fiber));
816 return stackTraceFromBacktraceResponse(backtraceResponse); 881 return stackTraceFromBacktraceResponse(backtraceResponse);
817 } 882 }
818 883
819 Future<List<BackTrace>> fibers() async { 884 Future<List<BackTrace>> fibers() async {
820 assert(isRunning || isPaused); 885 assert(isRunning || isPaused);
821 await runCommand(const NewMap(MapId.fibers)); 886 await runCommand(const NewMap(MapId.fibers));
822 ProcessNumberOfStacks response = 887 ProcessNumberOfStacks response =
823 await runCommand(const ProcessAddFibersToMap()); 888 await runCommand(const ProcessAddFibersToMap());
824 int numberOfFibers = response.value; 889 int numberOfFibers = response.value;
825 List<BackTrace> stacktraces = new List(numberOfFibers); 890 List<BackTrace> stacktraces = new List(numberOfFibers);
826 for (int i = 0; i < numberOfFibers; i++) { 891 for (int i = 0; i < numberOfFibers; i++) {
827 stacktraces[i] = await backtraceForFiber(i); 892 stacktraces[i] = await backtraceForFiber(i);
828 } 893 }
829 await runCommand(const DeleteMap(MapId.fibers)); 894 await runCommand(const DeleteMap(MapId.fibers));
830 return stacktraces; 895 return stacktraces;
831 } 896 }
832 897
833 Future<List<int>> processes() async { 898 Future<List<int>> processes() async {
834 assert(isRunning || isPaused); 899 assert(isSpawned);
835 ProcessGetProcessIdsResult response = 900 ProcessGetProcessIdsResult response =
836 await runCommand(const ProcessGetProcessIds()); 901 await runCommand(const ProcessGetProcessIds());
837 return response.ids; 902 return response.ids;
838 } 903 }
839 904
840 Future<BackTrace> processStack(int processId) async { 905 Future<BackTrace> processStack(int processId) async {
841 assert(isPaused); 906 assert(isPaused);
842 ProcessBacktrace backtraceResponse = 907 ProcessBacktrace backtraceResponse =
843 await runCommand(new ProcessBacktraceRequest(processId)); 908 await runCommand(new ProcessBacktraceRequest(processId));
844 return stackTraceFromBacktraceResponse(backtraceResponse); 909 return stackTraceFromBacktraceResponse(backtraceResponse);
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 } 1123 }
1059 1124
1060 bool toggleInternal() { 1125 bool toggleInternal() {
1061 debugState.showInternalFrames = !debugState.showInternalFrames; 1126 debugState.showInternalFrames = !debugState.showInternalFrames;
1062 if (debugState.currentBackTrace != null) { 1127 if (debugState.currentBackTrace != null) {
1063 debugState.currentBackTrace.visibilityChanged(); 1128 debugState.currentBackTrace.visibilityChanged();
1064 } 1129 }
1065 return debugState.showInternalFrames; 1130 return debugState.showInternalFrames;
1066 } 1131 }
1067 } 1132 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698