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

Side by Side Diff: pkg/dartino_compiler/lib/src/debug_service_protocol.dart

Issue 2060283002: Inspect local variables and fields from service protocol. (Closed) Base URL: git@github.com:dartino/sdk.git@master
Patch Set: Address review 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dartino project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 /// An implementation of the vm service-protocol in terms of a DartinoVmContext. 5 /// An implementation of the vm service-protocol in terms of a DartinoVmContext.
6 /// Processes are mapped to isolates. 6 /// Processes are mapped to isolates.
7 // TODO(sigurdm): Handle processes better. 7 // TODO(sigurdm): Handle processes better.
8 // TODO(sigurdm): Find a way to represent fibers. 8 // TODO(sigurdm): Find a way to represent fibers.
9 // TODO(sigurdm): Represent remote values.
10 // TODO(sigurdm): Use https://pub.dartlang.org/packages/json_rpc_2 for serving. 9 // TODO(sigurdm): Use https://pub.dartlang.org/packages/json_rpc_2 for serving.
11 10
12 import "dart:async" show Future; 11 import "dart:async" show Future;
13 12
14 import 'dart:convert' show JSON; 13 import 'dart:convert' show JSON;
15 14
16 import 'dart:io' show File, HttpServer, WebSocket, WebSocketTransformer; 15 import 'dart:io' show File, HttpServer, WebSocket, WebSocketTransformer;
17 16
18 import 'hub/session_manager.dart' show SessionState; 17 import 'hub/session_manager.dart' show SessionState;
19 18
20 import 'guess_configuration.dart' show dartinoVersion; 19 import 'guess_configuration.dart' show dartinoVersion;
21 20
22 import '../debug_state.dart' 21 import '../debug_state.dart'
23 show BackTrace, BackTraceFrame, Breakpoint, RemoteObject; 22 show
23 BackTrace,
24 BackTraceFrame,
25 Breakpoint,
26 RemoteArray,
27 RemoteErrorObject,
28 RemoteInstance,
29 RemoteObject,
30 RemoteValue;
24 31
25 import '../vm_context.dart' show DartinoVmContext, DebugListener; 32 import '../vm_context.dart' show DartinoVmContext, DebugListener;
26 33
27 import '../dartino_system.dart' 34 import '../dartino_system.dart'
28 show DartinoFunction, DartinoFunctionKind, DartinoSystem; 35 show DartinoFunction, DartinoFunctionKind, DartinoSystem;
29 36
30 import 'debug_info.dart' show DebugInfo, ScopeInfo, SourceLocation; 37 import 'debug_info.dart' show DebugInfo, ScopeInfo, SourceLocation;
31 38
32 import 'dartino_compiler_implementation.dart' 39 import 'dartino_compiler_implementation.dart'
33 show DartinoCompilerImplementation; 40 show DartinoCompilerImplementation;
34 41 import 'element_utils.dart';
35 import 'codegen_visitor.dart' show LocalValue;
36 42
37 import '../program_info.dart' show Configuration; 43 import '../program_info.dart' show Configuration;
44 import '../vm_commands.dart'
45 show
46 Array,
47 Boolean,
48 ClassValue,
49 DartValue,
50 Double,
51 Instance,
52 Integer,
53 NullValue,
54 StringValue;
38 55
39 import 'package:collection/collection.dart' show binarySearch; 56 import 'package:collection/collection.dart' show binarySearch;
40 57
41 import 'package:compiler/src/scanner/scanner.dart' show Scanner; 58 import 'package:compiler/src/scanner/scanner.dart' show Scanner;
42 import 'package:compiler/src/tokens/token.dart' show Token; 59 import 'package:compiler/src/tokens/token.dart' show Token;
43 import 'package:compiler/src/io/source_file.dart' show SourceFile; 60 import 'package:compiler/src/io/source_file.dart' show SourceFile;
44 import 'package:compiler/src/elements/visitor.dart' show BaseElementVisitor; 61 import 'package:compiler/src/elements/visitor.dart' show BaseElementVisitor;
45 import 'package:compiler/src/elements/elements.dart' 62 import 'package:compiler/src/elements/elements.dart'
46 show 63 show
64 ClassElement,
47 CompilationUnitElement, 65 CompilationUnitElement,
48 Element, 66 Element,
67 FieldElement,
49 FunctionElement, 68 FunctionElement,
50 LibraryElement, 69 LibraryElement,
51 MemberElement, 70 MemberElement,
52 ScopeContainerElement; 71 ScopeContainerElement;
53 72
54 const bool logging = const bool.fromEnvironment("dartino-log-debug-server"); 73 const bool logging = const bool.fromEnvironment("dartino-log-debug-server");
55 74
56 //TODO(danrubel): Verify const map values
57 const Map<String, dynamic> dartCoreLibRefDesc = const <String, dynamic>{
58 "type": "@Library",
59 "id": "libraries/dart:core",
60 "fixedId": true,
61 "name": "dart:core",
62 "uri": "dart:core",
63 };
64
65 //TODO(danrubel): Verify correct id
66 const String nullId = "objects/Null";
67
68 //TODO(danrubel): Verify const map values
69 const Map<String, dynamic> nullClassRefDesc = const <String, dynamic>{
70 "type": "@Class",
71 "id": "classes/NullClass",
72 "name": "NullClass",
73 };
74
75 //TODO(danrubel): Verify const map values
76 const Map<String, dynamic> nullRefDesc = const <String, dynamic>{
77 "type": "@Null",
78 "id": nullId,
79 "kind": "Null",
80 "class": nullClassRefDesc,
81 "valueAsString": "null",
82 };
83
84 //TODO(danrubel): Verify const map values
85 const Map<String, dynamic> nullDesc = const <String, dynamic>{
86 "type": "Null",
87 "id": nullId,
88 "kind": "Null",
89 "class": nullClassRefDesc,
90 "valueAsString": "null",
91 };
92
93 class DebugServer { 75 class DebugServer {
94 Future<int> serveSingleShot(SessionState state, 76 Future<int> serveSingleShot(SessionState state,
95 {int port: 0, Uri snapshotLocation}) async { 77 {int port: 0, Uri snapshotLocation}) async {
96 HttpServer server = await HttpServer.bind("127.0.0.1", port); 78 HttpServer server = await HttpServer.bind("127.0.0.1", port);
97 // The Atom Dartino plugin waits for "localhost:<port-number>" 79 // The Atom Dartino plugin waits for "localhost:<port-number>"
98 // to determine the observatory port for debugging. 80 // to determine the observatory port for debugging.
99 print("localhost:${server.port}"); 81 print("localhost:${server.port}");
100 WebSocket socket = await server.transform(new WebSocketTransformer()).first; 82 WebSocket socket = await server.transform(new WebSocketTransformer()).first;
101 await new DebugConnection(state, socket, snapshotLocation: snapshotLocation) 83 await new DebugConnection(state, socket, snapshotLocation: snapshotLocation)
102 .serve(); 84 .serve();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 socket.add(JSON.encode(message)); 120 socket.add(JSON.encode(message));
139 } 121 }
140 122
141 void setStream(String streamId, bool value) { 123 void setStream(String streamId, bool value) {
142 streams[streamId] = value; 124 streams[streamId] = value;
143 } 125 }
144 126
145 Map<String, CompilationUnitElement> scripts = 127 Map<String, CompilationUnitElement> scripts =
146 new Map<String, CompilationUnitElement>(); 128 new Map<String, CompilationUnitElement>();
147 129
148 Map frameDesc(BackTraceFrame frame, int index) { 130 Future<Map> frameDesc(BackTraceFrame frame, int index) async {
149 List<Map> vars = new List<Map>(); 131 List<Map> vars = new List<Map>();
150 for (ScopeInfo current = frame.scopeInfo(); 132 for (ScopeInfo current = frame.scopeInfo();
151 current != ScopeInfo.sentinel; 133 current != ScopeInfo.sentinel;
152 current = current.previous) { 134 current = current.previous) {
135 RemoteValue remoteValue =
136 await vmContext.processLocal(index, current.local.slot);
153 vars.add({ 137 vars.add({
154 "type": "BoundVariable", 138 "type": "BoundVariable",
155 "name": current.name, 139 "name": current.name,
156 "value": valueDesc(current.lookup(current.name)) 140 "value": instanceRef(
141 remoteValue.value, "objects/$index.${current.local.slot}"),
157 }); 142 });
158 } 143 }
159 return { 144 return {
160 "type": "Frame", 145 "type": "Frame",
161 "index": index, 146 "index": index,
162 "function": functionRef(frame.function), 147 "function": functionRef(frame.function),
163 "code": { 148 "code": {
164 "id": "code-id", //TODO(danrubel): what is the unique id here? 149 "id": "code-id", //TODO(danrubel): what is the unique id here?
165 "type": "@Code", 150 "type": "@Code",
166 "name": "code-name", // TODO(sigurdm): How to create a name here? 151 "name": "code-name", // TODO(sigurdm): How to create a name here?
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 "type": "Function", 316 "type": "Function",
332 "id": "functions/${function.functionId}", 317 "id": "functions/${function.functionId}",
333 // TODO(sigurdm): All kinds of owner. 318 // TODO(sigurdm): All kinds of owner.
334 "owner": libraryRef(element.library), 319 "owner": libraryRef(element.library),
335 "static": element.isStatic, 320 "static": element.isStatic,
336 "const": element.isConst, 321 "const": element.isConst,
337 "_kind": functionKind(function.kind), 322 "_kind": functionKind(function.kind),
338 }; 323 };
339 } 324 }
340 325
341 Map valueDesc(LocalValue lookup) { 326 Map classRef(ClassElement classElement) {
342 //TODO(danrubel): Translate local value into description? 327 if (classElement == null) {
343 // Need to return an @InstanceRef or Sentinel 328 return {"type": "@Class", "id": "unknown", "name": "unknown class"};
344 return nullRefDesc; 329 }
330 String symbolicName =
331 "${classElement.library.canonicalUri}.${classElement.name}";
332 return {
333 "type": "@Class",
334 "id": "classes/$symbolicName",
335 "name": "${classElement.name}",
336 };
337 }
338
339 Map instanceRef(DartValue value, String id) {
340 int classId;
341 Element classElement;
342 String stringValue;
343 String kind;
344 int length;
345 String name;
346 if (value is Instance) {
347 kind = "PlainInstance";
348 classId = value.classId;
349 } else if (value is Integer) {
350 kind = "Int";
351 classElement = vmContext.compiler.compiler.backend.intImplementation;
352 stringValue = "${value.value}";
353 } else if (value is StringValue) {
354 kind = "String";
355 classElement = vmContext.compiler.compiler.backend.stringImplementation;
356 stringValue = value.value;
357 } else if (value is Boolean) {
358 kind = "Bool";
359 classElement = vmContext.compiler.compiler.backend.boolImplementation;
360 stringValue = "${value.value}";
361 } else if (value is Double) {
362 kind = "Double";
363 classElement = vmContext.compiler.compiler.backend.doubleImplementation;
364 stringValue = "${value.value}";
365 } else if (value is ClassValue) {
366 kind = "Type";
367 Element element =
368 vmContext.dartinoSystem.classesById[value.classId].element;
369 classElement = vmContext.compiler.compiler.backend.typeImplementation;
370 name = "${element}";
371 } else if (value is NullValue) {
372 kind = "Null";
373 classElement = vmContext.compiler.compiler.backend.nullImplementation;
374 stringValue = "null";
375 } else if (value is Array) {
376 kind = "List";
377 classElement = vmContext.compiler.compiler.backend.listImplementation;
378 length = value.length;
379 } else {
380 throw "Unexpected remote value $value";
381 }
382 Map classReference = classRef(
383 classElement ?? vmContext.dartinoSystem.classesById[classId]?.element);
384 Map result = {
385 "type": "@Instance",
386 "id": id,
387 "kind": kind,
388 "class": classReference,
389 };
390 if (stringValue != null) {
391 result["valueAsString"] = stringValue;
392 }
393 if (length != null) {
394 result["length"] = length;
395 }
396 if (name != null) {
397 result["name"] = name;
398 }
399 return result;
400 }
401
402 Map instanceDesc(RemoteObject remoteObject, String id) {
403 // TODO(sigurdm): Allow inspecting any frame.
404 assert(remoteObject is! RemoteErrorObject);
405 if (remoteObject is RemoteInstance) {
406 int classId = remoteObject.instance.classId;
407 Element classElement =
408 vmContext.dartinoSystem.classesById[classId].element;
409 List<FieldElement> fieldElements = computeFields(classElement);
410 assert(fieldElements.length == remoteObject.fields.length);
411 List fields = new List();
412 for (int i = 0; i < fieldElements.length; i++) {
413 FieldElement fieldElement = fieldElements[i];
414 fields.add({
415 "type": "BoundField",
416 "decl": {
417 "type": "@Field",
418 "name": fieldElement.name,
419 "owner": classRef(fieldElement.contextClass),
420 "declaredType": null, // TODO(sigurdm): fill this in.
421 "const": fieldElement.isConst,
422 "final": fieldElement.isFinal,
423 "static": fieldElement.isStatic,
424 },
425 "value": instanceRef(remoteObject.fields[i], "$id.$i"),
426 });
427 }
428 return <String, dynamic>{
429 "type": "Instance",
430 "id": id,
431 "kind": "PlainInstance",
432 "class": classRef(classElement),
433 "fields": fields,
434 };
435 } else if (remoteObject is RemoteArray) {
436 // TODO(sigurdm): Handle large arrays. (Issue #536).
437 List elements = new List();
438 for (int i = 0; i < remoteObject.array.length; i++) {
439 elements.add(instanceRef(remoteObject.values[i], "$id.$i"));
440 }
441 return <String, dynamic>{
442 "type": "Instance",
443 "id": id,
444 "kind": "List",
445 "class":
446 classRef(vmContext.compiler.compiler.backend.listImplementation),
447 "elements": elements,
448 };
449 } else if (remoteObject is RemoteValue) {
450 Map instance = instanceRef(remoteObject.value, id);
451 instance["type"] = "Instance";
452 return instance;
453 } else {
454 throw "Unexpected remote object kind";
455 }
345 } 456 }
346 457
347 initialize(DartinoCompilerImplementation compiler) { 458 initialize(DartinoCompilerImplementation compiler) {
348 for (LibraryElement library in compiler.libraryLoader.libraries) { 459 for (LibraryElement library in compiler.libraryLoader.libraries) {
349 cacheScripts(LibraryElement library) { 460 cacheScripts(LibraryElement library) {
350 for (CompilationUnitElement compilationUnit 461 for (CompilationUnitElement compilationUnit
351 in library.compilationUnits) { 462 in library.compilationUnits) {
352 Uri uri = compilationUnit.script.file.uri; 463 Uri uri = compilationUnit.script.file.uri;
353 scripts["scripts/$uri"] = compilationUnit; 464 scripts["scripts/$uri"] = compilationUnit;
354 tokenTables[uri] = makeTokenTable(compilationUnit); 465 tokenTables[uri] = makeTokenTable(compilationUnit);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 .lookupLibrary(Uri.parse(uri)))); 608 .lookupLibrary(Uri.parse(uri))));
498 break; 609 break;
499 case "scripts": 610 case "scripts":
500 sendResult(scriptDesc(scripts[id])); 611 sendResult(scriptDesc(scripts[id]));
501 break; 612 break;
502 case "functions": 613 case "functions":
503 sendResult(functionDesc(vmContext.dartinoSystem.functionsById[ 614 sendResult(functionDesc(vmContext.dartinoSystem.functionsById[
504 int.parse(id.substring(slashIndex + 1))])); 615 int.parse(id.substring(slashIndex + 1))]));
505 break; 616 break;
506 case "objects": 617 case "objects":
507 if (id == nullId) { 618 String path = id.substring(slashIndex + 1);
508 sendResult(nullDesc); 619 List<int> dotted = path.split(".").map(int.parse).toList();
509 } else { 620 int localFrame = dotted.first;
510 //TODO(danrubel): Need to return an Instance description 621 int localSlot = dotted[1];
511 // or Sentinel for the given @InstanceRef 622 List<int> fieldAccesses = dotted.skip(2).toList();
512 throw 'Unknown object: $id'; 623 RemoteObject remoteObject = await vmContext.processLocalStructure(
513 } 624 localFrame, localSlot,
625 fieldAccesses: fieldAccesses);
626 sendResult(instanceDesc(remoteObject, id));
514 break; 627 break;
515 default: 628 default:
516 throw "Unsupported object type $id"; 629 throw "Unsupported object type $id";
517 } 630 }
518 break; 631 break;
519 case "getStack": 632 case "getStack":
520 String isolateIdString = decodedMessage["params"]["isolateId"]; 633 String isolateIdString = decodedMessage["params"]["isolateId"];
521 int isolateId = int.parse( 634 int isolateId = int.parse(
522 isolateIdString.substring(isolateIdString.indexOf("/") + 1)); 635 isolateIdString.substring(isolateIdString.indexOf("/") + 1));
523 BackTrace backTrace = 636 BackTrace backTrace =
524 await state.vmContext.backTrace(processId: isolateId); 637 await state.vmContext.backTrace(processId: isolateId);
525 List frames = []; 638 List frames = [];
526 int index = 0; 639 int index = 0;
527 for (BackTraceFrame frame in backTrace.frames) { 640 for (BackTraceFrame frame in backTrace.frames) {
528 frames.add(frameDesc(frame, index)); 641 frames.add(await frameDesc(frame, index));
529 index++; 642 index++;
530 } 643 }
531 644
532 sendResult({"type": "Stack", "frames": frames, "messages": [],}); 645 sendResult({"type": "Stack", "frames": frames, "messages": [],});
533 break; 646 break;
534 case "getSourceReport": 647 case "getSourceReport":
535 String scriptId = decodedMessage["params"]["scriptId"]; 648 String scriptId = decodedMessage["params"]["scriptId"];
536 CompilationUnitElement compilationUnit = scripts[scriptId]; 649 CompilationUnitElement compilationUnit = scripts[scriptId];
537 Uri scriptUri = compilationUnit.script.file.uri; 650 Uri scriptUri = compilationUnit.script.file.uri;
538 List<int> tokenTable = tokenTables[scriptUri]; 651 List<int> tokenTable = tokenTables[scriptUri];
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 // TODO(sigurdm): Implement gc notification. 816 // TODO(sigurdm): Implement gc notification.
704 } 817 }
705 818
706 @override 819 @override
707 lostConnection() { 820 lostConnection() {
708 socket.close(); 821 socket.close();
709 } 822 }
710 823
711 @override 824 @override
712 pauseBreakpoint( 825 pauseBreakpoint(
713 int processId, BackTraceFrame topFrame, Breakpoint breakpoint) { 826 int processId, BackTraceFrame topFrame, Breakpoint breakpoint) async {
714 //TODO(danrubel): are there any other breakpoints 827 //TODO(danrubel): are there any other breakpoints
715 // at which we are currently paused for a PauseBreakpoint event? 828 // at which we are currently paused for a PauseBreakpoint event?
716 List<Breakpoint> pauseBreakpoints = <Breakpoint>[]; 829 List<Breakpoint> pauseBreakpoints = <Breakpoint>[];
717 pauseBreakpoints.add(breakpoint); 830 pauseBreakpoints.add(breakpoint);
718 Map event = { 831 Map event = {
719 "type": "Event", 832 "type": "Event",
720 "kind": "PauseBreakpoint", 833 "kind": "PauseBreakpoint",
721 "isolate": isolateRef(processId), 834 "isolate": isolateRef(processId),
722 "timestamp": new DateTime.now().millisecondsSinceEpoch, 835 "timestamp": new DateTime.now().millisecondsSinceEpoch,
723 "topFrame": frameDesc(topFrame, 0), 836 "topFrame": await frameDesc(topFrame, 0),
724 "atAsyncSuspension": false, 837 "atAsyncSuspension": false,
725 "breakpoint": breakpointDesc(breakpoint), 838 "breakpoint": breakpointDesc(breakpoint),
726 "pauseBreakpoints": 839 "pauseBreakpoints":
727 new List.from(pauseBreakpoints.map((bp) => breakpointDesc(bp))), 840 new List.from(pauseBreakpoints.map((bp) => breakpointDesc(bp))),
728 }; 841 };
729 lastPauseEvent = event; 842 lastPauseEvent = event;
730 streamNotify("Debug", event); 843 streamNotify("Debug", event);
731 } 844 }
732 845
733 @override 846 @override
734 pauseException(int processId, BackTraceFrame topFrame, RemoteObject thrown) { 847 pauseException(
848 int processId, BackTraceFrame topFrame, RemoteObject thrown) async {
735 Map event = { 849 Map event = {
736 "type": "Event", 850 "type": "Event",
737 "kind": "PauseException", 851 "kind": "PauseException",
738 "isolate": isolateRef(processId), 852 "isolate": isolateRef(processId),
739 "timestamp": new DateTime.now().millisecondsSinceEpoch, 853 "timestamp": new DateTime.now().millisecondsSinceEpoch,
740 "topFrame": frameDesc(topFrame, 0), 854 "topFrame": await frameDesc(topFrame, 0),
741 "atAsyncSuspension": false, 855 "atAsyncSuspension": false,
742 // TODO(sigurdm): pass thrown as an instance. 856 // TODO(sigurdm): pass thrown as an instance.
743 }; 857 };
744 streamNotify("Debug", event); 858 streamNotify("Debug", event);
745 } 859 }
746 860
747 @override 861 @override
748 pauseExit(int processId, BackTraceFrame topFrame) { 862 pauseExit(int processId, BackTraceFrame topFrame) {
749 // TODO(sigurdm): implement pauseExit 863 // TODO(sigurdm): implement pauseExit
750 } 864 }
751 865
752 @override 866 @override
753 pauseInterrupted(int processId, BackTraceFrame topFrame) { 867 pauseInterrupted(int processId, BackTraceFrame topFrame) async {
754 Map event = { 868 Map event = {
755 "type": "Event", 869 "type": "Event",
756 "kind": "PauseInterrupted", 870 "kind": "PauseInterrupted",
757 "isolate": isolateRef(processId), 871 "isolate": isolateRef(processId),
758 "timestamp": new DateTime.now().millisecondsSinceEpoch, 872 "timestamp": new DateTime.now().millisecondsSinceEpoch,
759 "topFrame": frameDesc(topFrame, 0), 873 "topFrame": await frameDesc(topFrame, 0),
760 "atAsyncSuspension": false, 874 "atAsyncSuspension": false,
761 }; 875 };
762 lastPauseEvent = event; 876 lastPauseEvent = event;
763 streamNotify("Debug", event); 877 streamNotify("Debug", event);
764 } 878 }
765 879
766 @override 880 @override
767 pauseStart(int processId) { 881 pauseStart(int processId) {
768 Map event = { 882 Map event = {
769 "type": "Event", 883 "type": "Event",
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 processStart(int processId) { 915 processStart(int processId) {
802 streamNotify("Isolate", { 916 streamNotify("Isolate", {
803 "type": "Event", 917 "type": "Event",
804 "kind": "IsolateStart", 918 "kind": "IsolateStart",
805 "isolate": isolateRef(processId), 919 "isolate": isolateRef(processId),
806 "timestamp": new DateTime.now().millisecondsSinceEpoch, 920 "timestamp": new DateTime.now().millisecondsSinceEpoch,
807 }); 921 });
808 } 922 }
809 923
810 @override 924 @override
811 resume(int processId) { 925 resume(int processId) async {
812 Map event = { 926 Map event = {
813 "type": "Event", 927 "type": "Event",
814 "kind": "Resume", 928 "kind": "Resume",
815 "isolate": isolateRef(processId), 929 "isolate": isolateRef(processId),
816 "timestamp": new DateTime.now().millisecondsSinceEpoch, 930 "timestamp": new DateTime.now().millisecondsSinceEpoch,
817 }; 931 };
818 BackTraceFrame topFrame = vmContext.debugState.topFrame; 932 BackTraceFrame topFrame = vmContext.debugState.topFrame;
819 if (topFrame != null) { 933 if (topFrame != null) {
820 event["topFrame"] = frameDesc(vmContext.debugState.topFrame, 0); 934 event["topFrame"] = await frameDesc(vmContext.debugState.topFrame, 0);
821 } 935 }
822 lastPauseEvent = event; 936 lastPauseEvent = event;
823 streamNotify("Debug", event); 937 streamNotify("Debug", event);
824 } 938 }
825 939
826 @override 940 @override
827 writeStdErr(int processId, List<int> data) { 941 writeStdErr(int processId, List<int> data) {
828 Map event = { 942 Map event = {
829 "type": "Event", 943 "type": "Event",
830 "kind": "WriteEvent", 944 "kind": "WriteEvent",
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 } 986 }
873 987
874 visitScopeContainerElement(ScopeContainerElement e, _) { 988 visitScopeContainerElement(ScopeContainerElement e, _) {
875 e.forEachLocalMember(visit); 989 e.forEachLocalMember(visit);
876 } 990 }
877 991
878 visitCompilationUnitElement(CompilationUnitElement e, _) { 992 visitCompilationUnitElement(CompilationUnitElement e, _) {
879 e.forEachLocalMember(visit); 993 e.forEachLocalMember(visit);
880 } 994 }
881 } 995 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698