OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 // Simple interactive debugger shell that connects to the Dart VM's debugger | 5 // Simple interactive debugger shell that connects to the Dart VM's debugger |
6 // connection port. | 6 // connection port. |
7 | 7 |
8 import "dart:convert"; | 8 import "dart:convert"; |
9 import "dart:io"; | 9 import "dart:io"; |
10 import "dart:async"; | 10 import "dart:async"; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 outstandingCommands[id] = completer; | 71 outstandingCommands[id] = completer; |
72 if (verbose) { | 72 if (verbose) { |
73 print("sending: '${JSON.encode(cmd)}'"); | 73 print("sending: '${JSON.encode(cmd)}'"); |
74 } | 74 } |
75 vmSock.write(JSON.encode(cmd)); | 75 vmSock.write(JSON.encode(cmd)); |
76 return completer.future; | 76 return completer.future; |
77 } | 77 } |
78 | 78 |
79 | 79 |
80 bool checkCurrentIsolate() { | 80 bool checkCurrentIsolate() { |
81 if (currentIsolate != null) { | 81 if (vmSock == null) { |
82 return true; | 82 print("There is no active script. Try 'help run'."); |
| 83 return false; |
83 } | 84 } |
84 print("Need valid current isolate"); | 85 if (currentIsolate == null) { |
85 return false; | 86 print('There is no current isolate.'); |
| 87 return false; |
| 88 } |
| 89 return true; |
| 90 } |
| 91 |
| 92 |
| 93 void setCurrentIsolate(TargetIsolate isolate) { |
| 94 if (isolate != currentIsolate) { |
| 95 currentIsolate = isolate; |
| 96 if (mainIsolate == null) { |
| 97 print("Main isolate is ${isolate.id}"); |
| 98 mainIsolate = isolate; |
| 99 } |
| 100 print("Current isolate is now ${isolate.id}"); |
| 101 } |
86 } | 102 } |
87 | 103 |
88 | 104 |
89 bool checkPaused() { | 105 bool checkPaused() { |
90 if (!checkCurrentIsolate()) return false; | 106 if (!checkCurrentIsolate()) return false; |
91 if (currentIsolate.isPaused) return true; | 107 if (currentIsolate.isPaused) return true; |
92 print("Current isolate must be paused"); | 108 print("Current isolate must be paused"); |
93 return false; | 109 return false; |
94 } | 110 } |
95 | 111 |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 cmdLine = cmdLine.trim(); | 535 cmdLine = cmdLine.trim(); |
520 var args = cmdLine.split(' '); | 536 var args = cmdLine.split(' '); |
521 if (args.length == 0) { | 537 if (args.length == 0) { |
522 return; | 538 return; |
523 } | 539 } |
524 var command = args[0]; | 540 var command = args[0]; |
525 | 541 |
526 var resume_commands = | 542 var resume_commands = |
527 { 'r':'resume', 's':'stepOver', 'si':'stepInto', 'so':'stepOut'}; | 543 { 'r':'resume', 's':'stepOver', 'si':'stepInto', 'so':'stepOut'}; |
528 if (resume_commands[command] != null) { | 544 if (resume_commands[command] != null) { |
529 if (!checkPaused()) return; | 545 if (!checkPaused()) { |
| 546 cmdo.show(); |
| 547 return; |
| 548 } |
530 var cmd = { "id": seqNum, | 549 var cmd = { "id": seqNum, |
531 "command": resume_commands[command], | 550 "command": resume_commands[command], |
532 "params": { "isolateId" : currentIsolate.id } }; | 551 "params": { "isolateId" : currentIsolate.id } }; |
533 sendCmd(cmd).then(showPromptAfter(handleResumedResponse)); | 552 sendCmd(cmd).then(showPromptAfter(handleResumedResponse)); |
534 } else if (command == "bt") { | 553 } else if (command == "bt") { |
| 554 if (!checkCurrentIsolate()) { |
| 555 cmdo.show(); |
| 556 return; |
| 557 } |
535 var cmd = { "id": seqNum, | 558 var cmd = { "id": seqNum, |
536 "command": "getStackTrace", | 559 "command": "getStackTrace", |
537 "params": { "isolateId" : currentIsolate.id } }; | 560 "params": { "isolateId" : currentIsolate.id } }; |
538 sendCmd(cmd).then(showPromptAfter(handleStackTraceResponse)); | 561 sendCmd(cmd).then(showPromptAfter(handleStackTraceResponse)); |
539 } else if (command == "ll") { | 562 } else if (command == "ll") { |
| 563 if (!checkCurrentIsolate()) { |
| 564 cmdo.show(); |
| 565 return; |
| 566 } |
540 var cmd = { "id": seqNum, | 567 var cmd = { "id": seqNum, |
541 "command": "getLibraries", | 568 "command": "getLibraries", |
542 "params": { "isolateId" : currentIsolate.id } }; | 569 "params": { "isolateId" : currentIsolate.id } }; |
543 sendCmd(cmd).then(showPromptAfter(handleGetLibraryResponse)); | 570 sendCmd(cmd).then(showPromptAfter(handleGetLibraryResponse)); |
544 } else if (command == "sbp" && args.length >= 2) { | 571 } else if (command == "sbp" && args.length >= 2) { |
| 572 if (!checkCurrentIsolate()) { |
| 573 cmdo.show(); |
| 574 return; |
| 575 } |
545 var url, line; | 576 var url, line; |
546 if (args.length == 2 && currentIsolate.pausedLocation != null) { | 577 if (args.length == 2 && currentIsolate.pausedLocation != null) { |
547 url = currentIsolate.pausedLocation["url"]; | 578 url = currentIsolate.pausedLocation["url"]; |
548 assert(url != null); | 579 assert(url != null); |
549 line = int.parse(args[1]); | 580 line = int.parse(args[1]); |
550 } else { | 581 } else { |
551 url = args[1]; | 582 url = args[1]; |
552 line = int.parse(args[2]); | 583 line = int.parse(args[2]); |
553 } | 584 } |
554 var cmd = { "id": seqNum, | 585 var cmd = { "id": seqNum, |
555 "command": "setBreakpoint", | 586 "command": "setBreakpoint", |
556 "params": { "isolateId" : currentIsolate.id, | 587 "params": { "isolateId" : currentIsolate.id, |
557 "url": url, | 588 "url": url, |
558 "line": line }}; | 589 "line": line }}; |
559 sendCmd(cmd).then(showPromptAfter(handleSetBpResponse)); | 590 sendCmd(cmd).then(showPromptAfter(handleSetBpResponse)); |
560 } else if (command == "rbp" && args.length == 2) { | 591 } else if (command == "rbp" && args.length == 2) { |
| 592 if (!checkCurrentIsolate()) { |
| 593 cmdo.show(); |
| 594 return; |
| 595 } |
561 var cmd = { "id": seqNum, | 596 var cmd = { "id": seqNum, |
562 "command": "removeBreakpoint", | 597 "command": "removeBreakpoint", |
563 "params": { "isolateId" : currentIsolate.id, | 598 "params": { "isolateId" : currentIsolate.id, |
564 "breakpointId": int.parse(args[1]) } }; | 599 "breakpointId": int.parse(args[1]) } }; |
565 sendCmd(cmd).then(showPromptAfter(handleGenericResponse)); | 600 sendCmd(cmd).then(showPromptAfter(handleGenericResponse)); |
566 } else if (command == "ls" && args.length == 2) { | 601 } else if (command == "ls" && args.length == 2) { |
| 602 if (!checkCurrentIsolate()) { |
| 603 cmdo.show(); |
| 604 return; |
| 605 } |
567 var cmd = { "id": seqNum, | 606 var cmd = { "id": seqNum, |
568 "command": "getScriptURLs", | 607 "command": "getScriptURLs", |
569 "params": { "isolateId" : currentIsolate.id, | 608 "params": { "isolateId" : currentIsolate.id, |
570 "libraryId": int.parse(args[1]) } }; | 609 "libraryId": int.parse(args[1]) } }; |
571 sendCmd(cmd).then(showPromptAfter(handleGetScriptsResponse)); | 610 sendCmd(cmd).then(showPromptAfter(handleGetScriptsResponse)); |
572 } else if (command == "eval" && args.length > 3) { | 611 } else if (command == "eval" && args.length > 3) { |
| 612 if (!checkCurrentIsolate()) { |
| 613 cmdo.show(); |
| 614 return; |
| 615 } |
573 var expr = args.getRange(3, args.length).join(" "); | 616 var expr = args.getRange(3, args.length).join(" "); |
574 var target = args[1]; | 617 var target = args[1]; |
575 if (target == "obj") { | 618 if (target == "obj") { |
576 target = "objectId"; | 619 target = "objectId"; |
577 } else if (target == "cls") { | 620 } else if (target == "cls") { |
578 target = "classId"; | 621 target = "classId"; |
579 } else if (target == "lib") { | 622 } else if (target == "lib") { |
580 target = "libraryId"; | 623 target = "libraryId"; |
581 } else { | 624 } else { |
582 huh(); | 625 huh(); |
583 return; | 626 return; |
584 } | 627 } |
585 var cmd = { "id": seqNum, | 628 var cmd = { "id": seqNum, |
586 "command": "evaluateExpr", | 629 "command": "evaluateExpr", |
587 "params": { "isolateId": currentIsolate.id, | 630 "params": { "isolateId": currentIsolate.id, |
588 target: int.parse(args[2]), | 631 target: int.parse(args[2]), |
589 "expression": expr } }; | 632 "expression": expr } }; |
590 sendCmd(cmd).then(showPromptAfter(handleEvalResponse)); | 633 sendCmd(cmd).then(showPromptAfter(handleEvalResponse)); |
591 } else if (command == "po" && args.length == 2) { | 634 } else if (command == "po" && args.length == 2) { |
| 635 if (!checkCurrentIsolate()) { |
| 636 cmdo.show(); |
| 637 return; |
| 638 } |
592 var cmd = { "id": seqNum, | 639 var cmd = { "id": seqNum, |
593 "command": "getObjectProperties", | 640 "command": "getObjectProperties", |
594 "params": { "isolateId" : currentIsolate.id, | 641 "params": { "isolateId" : currentIsolate.id, |
595 "objectId": int.parse(args[1]) } }; | 642 "objectId": int.parse(args[1]) } }; |
596 sendCmd(cmd).then(showPromptAfter(handleGetObjPropsResponse)); | 643 sendCmd(cmd).then(showPromptAfter(handleGetObjPropsResponse)); |
597 } else if (command == "pl" && args.length >= 3) { | 644 } else if (command == "pl" && args.length >= 3) { |
| 645 if (!checkCurrentIsolate()) { |
| 646 cmdo.show(); |
| 647 return; |
| 648 } |
598 var cmd; | 649 var cmd; |
599 if (args.length == 3) { | 650 if (args.length == 3) { |
600 cmd = { "id": seqNum, | 651 cmd = { "id": seqNum, |
601 "command": "getListElements", | 652 "command": "getListElements", |
602 "params": { "isolateId" : currentIsolate.id, | 653 "params": { "isolateId" : currentIsolate.id, |
603 "objectId": int.parse(args[1]), | 654 "objectId": int.parse(args[1]), |
604 "index": int.parse(args[2]) } }; | 655 "index": int.parse(args[2]) } }; |
605 } else { | 656 } else { |
606 cmd = { "id": seqNum, | 657 cmd = { "id": seqNum, |
607 "command": "getListElements", | 658 "command": "getListElements", |
608 "params": { "isolateId" : currentIsolate.id, | 659 "params": { "isolateId" : currentIsolate.id, |
609 "objectId": int.parse(args[1]), | 660 "objectId": int.parse(args[1]), |
610 "index": int.parse(args[2]), | 661 "index": int.parse(args[2]), |
611 "length": int.parse(args[3]) } }; | 662 "length": int.parse(args[3]) } }; |
612 } | 663 } |
613 sendCmd(cmd).then(showPromptAfter(handleGetListResponse)); | 664 sendCmd(cmd).then(showPromptAfter(handleGetListResponse)); |
614 } else if (command == "pc" && args.length == 2) { | 665 } else if (command == "pc" && args.length == 2) { |
| 666 if (!checkCurrentIsolate()) { |
| 667 cmdo.show(); |
| 668 return; |
| 669 } |
615 var cmd = { "id": seqNum, | 670 var cmd = { "id": seqNum, |
616 "command": "getClassProperties", | 671 "command": "getClassProperties", |
617 "params": { "isolateId" : currentIsolate.id, | 672 "params": { "isolateId" : currentIsolate.id, |
618 "classId": int.parse(args[1]) } }; | 673 "classId": int.parse(args[1]) } }; |
619 sendCmd(cmd).then(showPromptAfter(handleGetClassPropsResponse)); | 674 sendCmd(cmd).then(showPromptAfter(handleGetClassPropsResponse)); |
620 } else if (command == "plib" && args.length == 2) { | 675 } else if (command == "plib" && args.length == 2) { |
| 676 if (!checkCurrentIsolate()) { |
| 677 cmdo.show(); |
| 678 return; |
| 679 } |
621 var cmd = { "id": seqNum, | 680 var cmd = { "id": seqNum, |
622 "command": "getLibraryProperties", | 681 "command": "getLibraryProperties", |
623 "params": {"isolateId" : currentIsolate.id, | 682 "params": {"isolateId" : currentIsolate.id, |
624 "libraryId": int.parse(args[1]) } }; | 683 "libraryId": int.parse(args[1]) } }; |
625 sendCmd(cmd).then(showPromptAfter(handleGetLibraryPropsResponse)); | 684 sendCmd(cmd).then(showPromptAfter(handleGetLibraryPropsResponse)); |
626 } else if (command == "slib" && args.length == 3) { | 685 } else if (command == "slib" && args.length == 3) { |
| 686 if (!checkCurrentIsolate()) { |
| 687 cmdo.show(); |
| 688 return; |
| 689 } |
627 var cmd = { "id": seqNum, | 690 var cmd = { "id": seqNum, |
628 "command": "setLibraryProperties", | 691 "command": "setLibraryProperties", |
629 "params": {"isolateId" : currentIsolate.id, | 692 "params": {"isolateId" : currentIsolate.id, |
630 "libraryId": int.parse(args[1]), | 693 "libraryId": int.parse(args[1]), |
631 "debuggingEnabled": args[2] } }; | 694 "debuggingEnabled": args[2] } }; |
632 sendCmd(cmd).then(showPromptAfter(handleSetLibraryPropsResponse)); | 695 sendCmd(cmd).then(showPromptAfter(handleSetLibraryPropsResponse)); |
633 } else if (command == "pg" && args.length == 2) { | 696 } else if (command == "pg" && args.length == 2) { |
| 697 if (!checkCurrentIsolate()) { |
| 698 cmdo.show(); |
| 699 return; |
| 700 } |
634 var cmd = { "id": seqNum, | 701 var cmd = { "id": seqNum, |
635 "command": "getGlobalVariables", | 702 "command": "getGlobalVariables", |
636 "params": { "isolateId" : currentIsolate.id, | 703 "params": { "isolateId" : currentIsolate.id, |
637 "libraryId": int.parse(args[1]) } }; | 704 "libraryId": int.parse(args[1]) } }; |
638 sendCmd(cmd).then(showPromptAfter(handleGetGlobalVarsResponse)); | 705 sendCmd(cmd).then(showPromptAfter(handleGetGlobalVarsResponse)); |
639 } else if (command == "gs" && args.length == 3) { | 706 } else if (command == "gs" && args.length == 3) { |
| 707 if (!checkCurrentIsolate()) { |
| 708 cmdo.show(); |
| 709 return; |
| 710 } |
640 var cmd = { "id": seqNum, | 711 var cmd = { "id": seqNum, |
641 "command": "getScriptSource", | 712 "command": "getScriptSource", |
642 "params": { "isolateId" : currentIsolate.id, | 713 "params": { "isolateId" : currentIsolate.id, |
643 "libraryId": int.parse(args[1]), | 714 "libraryId": int.parse(args[1]), |
644 "url": args[2] } }; | 715 "url": args[2] } }; |
645 sendCmd(cmd).then(showPromptAfter(handleGetSourceResponse)); | 716 sendCmd(cmd).then(showPromptAfter(handleGetSourceResponse)); |
646 } else if (command == "tok" && args.length == 3) { | 717 } else if (command == "tok" && args.length == 3) { |
| 718 if (!checkCurrentIsolate()) { |
| 719 cmdo.show(); |
| 720 return; |
| 721 } |
647 var cmd = { "id": seqNum, | 722 var cmd = { "id": seqNum, |
648 "command": "getLineNumberTable", | 723 "command": "getLineNumberTable", |
649 "params": { "isolateId" : currentIsolate.id, | 724 "params": { "isolateId" : currentIsolate.id, |
650 "libraryId": int.parse(args[1]), | 725 "libraryId": int.parse(args[1]), |
651 "url": args[2] } }; | 726 "url": args[2] } }; |
652 sendCmd(cmd).then(showPromptAfter(handleGetLineTableResponse)); | 727 sendCmd(cmd).then(showPromptAfter(handleGetLineTableResponse)); |
653 } else if (command == "epi" && args.length == 2) { | 728 } else if (command == "epi" && args.length == 2) { |
| 729 if (!checkCurrentIsolate()) { |
| 730 cmdo.show(); |
| 731 return; |
| 732 } |
654 var cmd = { "id": seqNum, | 733 var cmd = { "id": seqNum, |
655 "command": "setPauseOnException", | 734 "command": "setPauseOnException", |
656 "params": { "isolateId" : currentIsolate.id, | 735 "params": { "isolateId" : currentIsolate.id, |
657 "exceptions": args[1] } }; | 736 "exceptions": args[1] } }; |
658 sendCmd(cmd).then(showPromptAfter(handleGenericResponse)); | 737 sendCmd(cmd).then(showPromptAfter(handleGenericResponse)); |
659 } else if (command == "li") { | 738 } else if (command == "li") { |
| 739 if (!checkCurrentIsolate()) { |
| 740 cmdo.show(); |
| 741 return; |
| 742 } |
660 var cmd = { "id": seqNum, "command": "getIsolateIds" }; | 743 var cmd = { "id": seqNum, "command": "getIsolateIds" }; |
661 sendCmd(cmd).then(showPromptAfter(handleGetIsolatesResponse)); | 744 sendCmd(cmd).then(showPromptAfter(handleGetIsolatesResponse)); |
662 } else if (command == "sci" && args.length == 2) { | 745 } else if (command == "sci" && args.length == 2) { |
663 var id = int.parse(args[1]); | 746 var id = int.parse(args[1]); |
664 if (targetIsolates[id] != null) { | 747 if (targetIsolates[id] != null) { |
665 currentIsolate = targetIsolates[id]; | 748 setCurrentIsolate(targetIsolates[id]); |
666 print("Setting current target isolate to $id"); | |
667 } else { | 749 } else { |
668 print("$id is not a valid isolate id"); | 750 print("$id is not a valid isolate id"); |
669 } | 751 } |
670 cmdo.show(); | 752 cmdo.show(); |
671 } else if (command == "i" && args.length == 2) { | 753 } else if (command == "i" && args.length == 2) { |
672 var cmd = { "id": seqNum, | 754 var cmd = { "id": seqNum, |
673 "command": "interrupt", | 755 "command": "interrupt", |
674 "params": { "isolateId": int.parse(args[1]) } }; | 756 "params": { "isolateId": int.parse(args[1]) } }; |
675 sendCmd(cmd).then(showPromptAfter(handleGenericResponse)); | 757 sendCmd(cmd).then(showPromptAfter(handleGenericResponse)); |
676 } else if (command.length == 0) { | 758 } else if (command.length == 0) { |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1020 Future handlePausedEvent(msg) { | 1102 Future handlePausedEvent(msg) { |
1021 assert(msg["params"] != null); | 1103 assert(msg["params"] != null); |
1022 var reason = msg["params"]["reason"]; | 1104 var reason = msg["params"]["reason"]; |
1023 int isolateId = msg["params"]["isolateId"]; | 1105 int isolateId = msg["params"]["isolateId"]; |
1024 assert(isolateId != null); | 1106 assert(isolateId != null); |
1025 var isolate = targetIsolates[isolateId]; | 1107 var isolate = targetIsolates[isolateId]; |
1026 assert(isolate != null); | 1108 assert(isolate != null); |
1027 assert(!isolate.isPaused); | 1109 assert(!isolate.isPaused); |
1028 var location = msg["params"]["location"];; | 1110 var location = msg["params"]["location"];; |
1029 assert(location != null); | 1111 assert(location != null); |
| 1112 setCurrentIsolate(isolate); |
1030 isolate.pausedLocation = location; | 1113 isolate.pausedLocation = location; |
1031 if (reason == "breakpoint") { | 1114 if (reason == "breakpoint") { |
1032 var bpId = (msg["params"]["breakpointId"]); | 1115 var bpId = (msg["params"]["breakpointId"]); |
1033 var label = (bpId != null) ? "Breakpoint $bpId" : null; | 1116 var label = (bpId != null) ? "Breakpoint $bpId" : null; |
1034 return printLocation(label, location); | 1117 return printLocation(label, location); |
1035 } else if (reason == "interrupted") { | 1118 } else if (reason == "interrupted") { |
1036 return printLocation("Interrupted", location); | 1119 return printLocation("Interrupted", location); |
1037 } else { | 1120 } else { |
1038 assert(reason == "exception"); | 1121 assert(reason == "exception"); |
1039 var excObj = msg["params"]["exception"]; | 1122 var excObj = msg["params"]["exception"]; |
1040 print("Isolate $isolateId paused on exception"); | 1123 print("Isolate $isolateId paused on exception"); |
1041 print(remoteObject(excObj)); | 1124 print(remoteObject(excObj)); |
1042 return new Future.value(); | 1125 return new Future.value(); |
1043 } | 1126 } |
1044 } | 1127 } |
1045 | 1128 |
1046 void handleIsolateEvent(msg) { | 1129 void handleIsolateEvent(msg) { |
1047 Map params = msg["params"]; | 1130 Map params = msg["params"]; |
1048 assert(params != null); | 1131 assert(params != null); |
1049 var isolateId = params["id"]; | 1132 var isolateId = params["id"]; |
1050 var reason = params["reason"]; | 1133 var reason = params["reason"]; |
1051 if (reason == "created") { | 1134 if (reason == "created") { |
1052 print("Isolate $isolateId has been created."); | 1135 print("Isolate $isolateId has been created."); |
1053 assert(targetIsolates[isolateId] == null); | 1136 assert(targetIsolates[isolateId] == null); |
1054 targetIsolates[isolateId] = new TargetIsolate(isolateId); | 1137 targetIsolates[isolateId] = new TargetIsolate(isolateId); |
1055 if (mainIsolate == null) { | |
1056 mainIsolate = targetIsolates[isolateId]; | |
1057 currentIsolate = mainIsolate; | |
1058 print("Current isolate set to ${currentIsolate.id}."); | |
1059 } | |
1060 } else { | 1138 } else { |
1061 assert(reason == "shutdown"); | 1139 assert(reason == "shutdown"); |
1062 var isolate = targetIsolates.remove(isolateId); | 1140 var isolate = targetIsolates.remove(isolateId); |
1063 assert(isolate != null); | 1141 assert(isolate != null); |
1064 if (isolate == mainIsolate) { | 1142 if (isolate == mainIsolate) { |
1065 mainIsolate = null; | 1143 mainIsolate = null; |
1066 print("Main isolate ${isolate.id} has terminated."); | 1144 print("Main isolate ${isolate.id} has terminated."); |
1067 } else { | 1145 } else { |
1068 print("Isolate ${isolate.id} has terminated."); | 1146 print("Isolate ${isolate.id} has terminated."); |
1069 } | 1147 } |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1404 handleUncaughtError: debuggerError)); | 1482 handleUncaughtError: debuggerError)); |
1405 | 1483 |
1406 zone.run(() { | 1484 zone.run(() { |
1407 parseArgs(args); | 1485 parseArgs(args); |
1408 cmdo = new Commando(completer: debuggerCommandCompleter); | 1486 cmdo = new Commando(completer: debuggerCommandCompleter); |
1409 cmdSubscription = cmdo.commands.listen(processCommand, | 1487 cmdSubscription = cmdo.commands.listen(processCommand, |
1410 onError: processError, | 1488 onError: processError, |
1411 onDone: processDone); | 1489 onDone: processDone); |
1412 }); | 1490 }); |
1413 } | 1491 } |
OLD | NEW |