Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 }); |
| 143 print("Adding ${vars.last}"); | |
|
Søren Gjesse
2016/06/15 11:26:18
Debug print.
sigurdm
2016/06/17 07:29:32
Done.
| |
| 158 } | 144 } |
| 159 return { | 145 return { |
| 160 "type": "Frame", | 146 "type": "Frame", |
| 161 "index": index, | 147 "index": index, |
| 162 "function": functionRef(frame.function), | 148 "function": functionRef(frame.function), |
| 163 "code": { | 149 "code": { |
| 164 "id": "code-id", //TODO(danrubel): what is the unique id here? | 150 "id": "code-id", //TODO(danrubel): what is the unique id here? |
| 165 "type": "@Code", | 151 "type": "@Code", |
| 166 "name": "code-name", // TODO(sigurdm): How to create a name here? | 152 "name": "code-name", // TODO(sigurdm): How to create a name here? |
| 167 "kind": "Dart", | 153 "kind": "Dart", |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 331 "type": "Function", | 317 "type": "Function", |
| 332 "id": "functions/${function.functionId}", | 318 "id": "functions/${function.functionId}", |
| 333 // TODO(sigurdm): All kinds of owner. | 319 // TODO(sigurdm): All kinds of owner. |
| 334 "owner": libraryRef(element.library), | 320 "owner": libraryRef(element.library), |
| 335 "static": element.isStatic, | 321 "static": element.isStatic, |
| 336 "const": element.isConst, | 322 "const": element.isConst, |
| 337 "_kind": functionKind(function.kind), | 323 "_kind": functionKind(function.kind), |
| 338 }; | 324 }; |
| 339 } | 325 } |
| 340 | 326 |
| 341 Map valueDesc(LocalValue lookup) { | 327 Map classRef(ClassElement classElement) { |
| 342 //TODO(danrubel): Translate local value into description? | 328 if (classElement == null) { |
| 343 // Need to return an @InstanceRef or Sentinel | 329 return {"type": "@Class", "id": "unknown", "name": "unknown class"}; |
| 344 return nullRefDesc; | 330 } |
| 331 String symbolicName = | |
| 332 "${classElement.library.canonicalUri}.${classElement.name}"; | |
| 333 return { | |
| 334 "type": "@Class", | |
| 335 "id": "classes/$symbolicName", | |
| 336 "name": "${classElement.name}", | |
| 337 }; | |
| 338 } | |
| 339 | |
| 340 Map instanceRef(DartValue value, String id) { | |
| 341 int classId; | |
| 342 Element classElement; | |
| 343 String stringValue; | |
| 344 String kind; | |
| 345 int length; | |
| 346 String name; | |
| 347 if (value is Instance) { | |
| 348 kind = "PlainInstance"; | |
| 349 classId = value.classId; | |
| 350 } else if (value is Integer) { | |
| 351 kind = "Int"; | |
| 352 classElement = vmContext.compiler.compiler.backend.intImplementation; | |
| 353 stringValue = "${value.value}"; | |
| 354 } else if (value is StringValue) { | |
| 355 kind = "String"; | |
| 356 classElement = vmContext.compiler.compiler.backend.stringImplementation; | |
| 357 stringValue = value.value; | |
| 358 } else if (value is Boolean) { | |
| 359 kind = "Bool"; | |
| 360 classElement = vmContext.compiler.compiler.backend.boolImplementation; | |
| 361 stringValue = "${value.value}"; | |
| 362 } else if (value is Double) { | |
| 363 kind = "Double"; | |
| 364 classElement = vmContext.compiler.compiler.backend.doubleImplementation; | |
| 365 stringValue = "${value.value}"; | |
| 366 } else if (value is ClassValue) { | |
| 367 kind = "Type"; | |
| 368 Element element = | |
| 369 vmContext.dartinoSystem.classesById[value.classId].element; | |
| 370 classElement = vmContext.compiler.compiler.backend.typeImplementation; | |
| 371 name = "${element}"; | |
| 372 } else if (value is NullValue) { | |
| 373 kind = "Null"; | |
| 374 classElement = vmContext.compiler.compiler.backend.nullImplementation; | |
| 375 stringValue = "null"; | |
| 376 } else if (value is Array) { | |
| 377 kind = "List"; | |
| 378 classElement = vmContext.compiler.compiler.backend.listImplementation; | |
| 379 length = value.length; | |
| 380 } else { | |
| 381 throw "Unexpected remote value $value"; | |
| 382 } | |
| 383 print("classId $classId element $classElement"); | |
|
Søren Gjesse
2016/06/15 11:26:18
Debug print.
sigurdm
2016/06/17 07:29:32
Done.
| |
| 384 Map classReference = classRef( | |
| 385 classElement ?? vmContext.dartinoSystem.classesById[classId]?.element); | |
| 386 Map result = { | |
| 387 "type": "@Instance", | |
| 388 "id": id, | |
| 389 "kind": kind, | |
| 390 "class": classReference, | |
| 391 }; | |
| 392 if (stringValue != null) { | |
| 393 result["valueAsString"] = stringValue; | |
| 394 } | |
| 395 if (length != null) { | |
| 396 result["length"] = length; | |
| 397 } | |
| 398 if (name != null) { | |
| 399 result["name"] = name; | |
| 400 } | |
| 401 return result; | |
| 402 } | |
| 403 | |
| 404 Map instanceDesc(RemoteObject remoteObject, String id) { | |
| 405 // TODO(sigurdm): Allow inspecting any frame. | |
| 406 assert(remoteObject is! RemoteErrorObject); | |
| 407 if (remoteObject is RemoteInstance) { | |
| 408 int classId = remoteObject.instance.classId; | |
| 409 Element classElement = | |
| 410 vmContext.dartinoSystem.classesById[classId].element; | |
| 411 List<FieldElement> fieldElements = computeFields(classElement); | |
| 412 assert(fieldElements.length == remoteObject.fields.length); | |
| 413 List fields = new List(); | |
| 414 for (int i = 0; i < fieldElements.length; i++) { | |
| 415 FieldElement fieldElement = fieldElements[i]; | |
| 416 fields.add({ | |
| 417 "type": "BoundField", | |
| 418 "decl": { | |
| 419 "type": "@Field", | |
| 420 "name": fieldElement.name, | |
| 421 "owner": classRef(fieldElement.contextClass), | |
| 422 "declaredType": null, // TODO(sigurdm): fill this in. | |
| 423 "const": fieldElement.isConst, | |
| 424 "final": fieldElement.isFinal, | |
| 425 "static": fieldElement.isStatic, | |
| 426 }, | |
| 427 "value": instanceRef(remoteObject.fields[i], "$id.$i"), | |
| 428 }); | |
| 429 } | |
| 430 return <String, dynamic>{ | |
| 431 "type": "Instance", | |
| 432 "id": id, | |
| 433 "kind": "PlainInstance", | |
| 434 "class": classRef(classElement), | |
| 435 "fields": fields, | |
| 436 }; | |
| 437 } else if (remoteObject is RemoteArray) { | |
|
Søren Gjesse
2016/06/15 11:26:18
Probably want to have a TODO on handling large arr
sigurdm
2016/06/17 07:29:32
Added TODO.
| |
| 438 List elements = new List(); | |
| 439 for (int i = 0; i < remoteObject.array.length; i++) { | |
| 440 elements.add(instanceRef(remoteObject.values[i], "$id.$i")); | |
| 441 } | |
| 442 return <String, dynamic>{ | |
| 443 "type": "Instance", | |
| 444 "id": id, | |
| 445 "kind": "List", | |
| 446 "class": | |
| 447 classRef(vmContext.compiler.compiler.backend.listImplementation), | |
| 448 "elements": elements, | |
| 449 }; | |
| 450 } else if (remoteObject is RemoteValue) { | |
| 451 Map instance = instanceRef(remoteObject.value, id); | |
| 452 instance["type"] = "Instance"; | |
| 453 return instance; | |
| 454 } else { | |
| 455 throw "Unexpected remote object kind"; | |
| 456 } | |
| 345 } | 457 } |
| 346 | 458 |
| 347 initialize(DartinoCompilerImplementation compiler) { | 459 initialize(DartinoCompilerImplementation compiler) { |
| 348 for (LibraryElement library in compiler.libraryLoader.libraries) { | 460 for (LibraryElement library in compiler.libraryLoader.libraries) { |
| 349 cacheScripts(LibraryElement library) { | 461 cacheScripts(LibraryElement library) { |
| 350 for (CompilationUnitElement compilationUnit | 462 for (CompilationUnitElement compilationUnit |
| 351 in library.compilationUnits) { | 463 in library.compilationUnits) { |
| 352 Uri uri = compilationUnit.script.file.uri; | 464 Uri uri = compilationUnit.script.file.uri; |
| 353 scripts["scripts/$uri"] = compilationUnit; | 465 scripts["scripts/$uri"] = compilationUnit; |
| 354 tokenTables[uri] = makeTokenTable(compilationUnit); | 466 tokenTables[uri] = makeTokenTable(compilationUnit); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 497 .lookupLibrary(Uri.parse(uri)))); | 609 .lookupLibrary(Uri.parse(uri)))); |
| 498 break; | 610 break; |
| 499 case "scripts": | 611 case "scripts": |
| 500 sendResult(scriptDesc(scripts[id])); | 612 sendResult(scriptDesc(scripts[id])); |
| 501 break; | 613 break; |
| 502 case "functions": | 614 case "functions": |
| 503 sendResult(functionDesc(vmContext.dartinoSystem.functionsById[ | 615 sendResult(functionDesc(vmContext.dartinoSystem.functionsById[ |
| 504 int.parse(id.substring(slashIndex + 1))])); | 616 int.parse(id.substring(slashIndex + 1))])); |
| 505 break; | 617 break; |
| 506 case "objects": | 618 case "objects": |
| 507 if (id == nullId) { | 619 String path = id.substring(slashIndex + 1); |
| 508 sendResult(nullDesc); | 620 List<int> dotted = path.split(".").map(int.parse).toList(); |
| 509 } else { | 621 int localFrame = dotted.first; |
| 510 //TODO(danrubel): Need to return an Instance description | 622 int localSlot = dotted[1]; |
| 511 // or Sentinel for the given @InstanceRef | 623 List<int> fieldAccesses = dotted.skip(2).toList(); |
| 512 throw 'Unknown object: $id'; | 624 RemoteObject remoteObject = await vmContext.processLocalStructure( |
| 513 } | 625 localFrame, localSlot, |
| 626 fieldAccesses: fieldAccesses); | |
| 627 sendResult(instanceDesc(remoteObject, id)); | |
| 514 break; | 628 break; |
| 515 default: | 629 default: |
| 516 throw "Unsupported object type $id"; | 630 throw "Unsupported object type $id"; |
| 517 } | 631 } |
| 518 break; | 632 break; |
| 519 case "getStack": | 633 case "getStack": |
| 520 String isolateIdString = decodedMessage["params"]["isolateId"]; | 634 String isolateIdString = decodedMessage["params"]["isolateId"]; |
| 521 int isolateId = int.parse( | 635 int isolateId = int.parse( |
| 522 isolateIdString.substring(isolateIdString.indexOf("/") + 1)); | 636 isolateIdString.substring(isolateIdString.indexOf("/") + 1)); |
| 523 BackTrace backTrace = | 637 BackTrace backTrace = |
| 524 await state.vmContext.backTrace(processId: isolateId); | 638 await state.vmContext.backTrace(processId: isolateId); |
| 525 List frames = []; | 639 List frames = []; |
| 526 int index = 0; | 640 int index = 0; |
| 527 for (BackTraceFrame frame in backTrace.frames) { | 641 for (BackTraceFrame frame in backTrace.frames) { |
| 528 frames.add(frameDesc(frame, index)); | 642 frames.add(await frameDesc(frame, index)); |
| 529 index++; | 643 index++; |
| 530 } | 644 } |
| 531 | 645 |
| 532 sendResult({"type": "Stack", "frames": frames, "messages": [],}); | 646 sendResult({"type": "Stack", "frames": frames, "messages": [],}); |
| 533 break; | 647 break; |
| 534 case "getSourceReport": | 648 case "getSourceReport": |
| 535 String scriptId = decodedMessage["params"]["scriptId"]; | 649 String scriptId = decodedMessage["params"]["scriptId"]; |
| 536 CompilationUnitElement compilationUnit = scripts[scriptId]; | 650 CompilationUnitElement compilationUnit = scripts[scriptId]; |
| 537 Uri scriptUri = compilationUnit.script.file.uri; | 651 Uri scriptUri = compilationUnit.script.file.uri; |
| 538 List<int> tokenTable = tokenTables[scriptUri]; | 652 List<int> tokenTable = tokenTables[scriptUri]; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 703 // TODO(sigurdm): Implement gc notification. | 817 // TODO(sigurdm): Implement gc notification. |
| 704 } | 818 } |
| 705 | 819 |
| 706 @override | 820 @override |
| 707 lostConnection() { | 821 lostConnection() { |
| 708 socket.close(); | 822 socket.close(); |
| 709 } | 823 } |
| 710 | 824 |
| 711 @override | 825 @override |
| 712 pauseBreakpoint( | 826 pauseBreakpoint( |
| 713 int processId, BackTraceFrame topFrame, Breakpoint breakpoint) { | 827 int processId, BackTraceFrame topFrame, Breakpoint breakpoint) async { |
| 714 //TODO(danrubel): are there any other breakpoints | 828 //TODO(danrubel): are there any other breakpoints |
| 715 // at which we are currently paused for a PauseBreakpoint event? | 829 // at which we are currently paused for a PauseBreakpoint event? |
| 716 List<Breakpoint> pauseBreakpoints = <Breakpoint>[]; | 830 List<Breakpoint> pauseBreakpoints = <Breakpoint>[]; |
| 717 pauseBreakpoints.add(breakpoint); | 831 pauseBreakpoints.add(breakpoint); |
| 718 Map event = { | 832 Map event = { |
| 719 "type": "Event", | 833 "type": "Event", |
| 720 "kind": "PauseBreakpoint", | 834 "kind": "PauseBreakpoint", |
| 721 "isolate": isolateRef(processId), | 835 "isolate": isolateRef(processId), |
| 722 "timestamp": new DateTime.now().millisecondsSinceEpoch, | 836 "timestamp": new DateTime.now().millisecondsSinceEpoch, |
| 723 "topFrame": frameDesc(topFrame, 0), | 837 "topFrame": await frameDesc(topFrame, 0), |
| 724 "atAsyncSuspension": false, | 838 "atAsyncSuspension": false, |
| 725 "breakpoint": breakpointDesc(breakpoint), | 839 "breakpoint": breakpointDesc(breakpoint), |
| 726 "pauseBreakpoints": | 840 "pauseBreakpoints": |
| 727 new List.from(pauseBreakpoints.map((bp) => breakpointDesc(bp))), | 841 new List.from(pauseBreakpoints.map((bp) => breakpointDesc(bp))), |
| 728 }; | 842 }; |
| 729 lastPauseEvent = event; | 843 lastPauseEvent = event; |
| 730 streamNotify("Debug", event); | 844 streamNotify("Debug", event); |
| 731 } | 845 } |
| 732 | 846 |
| 733 @override | 847 @override |
| 734 pauseException(int processId, BackTraceFrame topFrame, RemoteObject thrown) { | 848 pauseException( |
| 849 int processId, BackTraceFrame topFrame, RemoteObject thrown) async { | |
| 735 Map event = { | 850 Map event = { |
| 736 "type": "Event", | 851 "type": "Event", |
| 737 "kind": "PauseException", | 852 "kind": "PauseException", |
| 738 "isolate": isolateRef(processId), | 853 "isolate": isolateRef(processId), |
| 739 "timestamp": new DateTime.now().millisecondsSinceEpoch, | 854 "timestamp": new DateTime.now().millisecondsSinceEpoch, |
| 740 "topFrame": frameDesc(topFrame, 0), | 855 "topFrame": await frameDesc(topFrame, 0), |
| 741 "atAsyncSuspension": false, | 856 "atAsyncSuspension": false, |
| 742 // TODO(sigurdm): pass thrown as an instance. | 857 // TODO(sigurdm): pass thrown as an instance. |
| 743 }; | 858 }; |
| 744 streamNotify("Debug", event); | 859 streamNotify("Debug", event); |
| 745 } | 860 } |
| 746 | 861 |
| 747 @override | 862 @override |
| 748 pauseExit(int processId, BackTraceFrame topFrame) { | 863 pauseExit(int processId, BackTraceFrame topFrame) { |
| 749 // TODO(sigurdm): implement pauseExit | 864 // TODO(sigurdm): implement pauseExit |
| 750 } | 865 } |
| 751 | 866 |
| 752 @override | 867 @override |
| 753 pauseInterrupted(int processId, BackTraceFrame topFrame) { | 868 pauseInterrupted(int processId, BackTraceFrame topFrame) async { |
| 754 Map event = { | 869 Map event = { |
| 755 "type": "Event", | 870 "type": "Event", |
| 756 "kind": "PauseInterrupted", | 871 "kind": "PauseInterrupted", |
| 757 "isolate": isolateRef(processId), | 872 "isolate": isolateRef(processId), |
| 758 "timestamp": new DateTime.now().millisecondsSinceEpoch, | 873 "timestamp": new DateTime.now().millisecondsSinceEpoch, |
| 759 "topFrame": frameDesc(topFrame, 0), | 874 "topFrame": await frameDesc(topFrame, 0), |
| 760 "atAsyncSuspension": false, | 875 "atAsyncSuspension": false, |
| 761 }; | 876 }; |
| 762 lastPauseEvent = event; | 877 lastPauseEvent = event; |
| 763 streamNotify("Debug", event); | 878 streamNotify("Debug", event); |
| 764 } | 879 } |
| 765 | 880 |
| 766 @override | 881 @override |
| 767 pauseStart(int processId) { | 882 pauseStart(int processId) { |
| 768 Map event = { | 883 Map event = { |
| 769 "type": "Event", | 884 "type": "Event", |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 801 processStart(int processId) { | 916 processStart(int processId) { |
| 802 streamNotify("Isolate", { | 917 streamNotify("Isolate", { |
| 803 "type": "Event", | 918 "type": "Event", |
| 804 "kind": "IsolateStart", | 919 "kind": "IsolateStart", |
| 805 "isolate": isolateRef(processId), | 920 "isolate": isolateRef(processId), |
| 806 "timestamp": new DateTime.now().millisecondsSinceEpoch, | 921 "timestamp": new DateTime.now().millisecondsSinceEpoch, |
| 807 }); | 922 }); |
| 808 } | 923 } |
| 809 | 924 |
| 810 @override | 925 @override |
| 811 resume(int processId) { | 926 resume(int processId) async { |
| 812 Map event = { | 927 Map event = { |
| 813 "type": "Event", | 928 "type": "Event", |
| 814 "kind": "Resume", | 929 "kind": "Resume", |
| 815 "isolate": isolateRef(processId), | 930 "isolate": isolateRef(processId), |
| 816 "timestamp": new DateTime.now().millisecondsSinceEpoch, | 931 "timestamp": new DateTime.now().millisecondsSinceEpoch, |
| 817 }; | 932 }; |
| 818 BackTraceFrame topFrame = vmContext.debugState.topFrame; | 933 BackTraceFrame topFrame = vmContext.debugState.topFrame; |
| 819 if (topFrame != null) { | 934 if (topFrame != null) { |
| 820 event["topFrame"] = frameDesc(vmContext.debugState.topFrame, 0); | 935 event["topFrame"] = await frameDesc(vmContext.debugState.topFrame, 0); |
| 821 } | 936 } |
| 822 lastPauseEvent = event; | 937 lastPauseEvent = event; |
| 823 streamNotify("Debug", event); | 938 streamNotify("Debug", event); |
| 824 } | 939 } |
| 825 | 940 |
| 826 @override | 941 @override |
| 827 writeStdErr(int processId, List<int> data) { | 942 writeStdErr(int processId, List<int> data) { |
| 828 Map event = { | 943 Map event = { |
| 829 "type": "Event", | 944 "type": "Event", |
| 830 "kind": "WriteEvent", | 945 "kind": "WriteEvent", |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 872 } | 987 } |
| 873 | 988 |
| 874 visitScopeContainerElement(ScopeContainerElement e, _) { | 989 visitScopeContainerElement(ScopeContainerElement e, _) { |
| 875 e.forEachLocalMember(visit); | 990 e.forEachLocalMember(visit); |
| 876 } | 991 } |
| 877 | 992 |
| 878 visitCompilationUnitElement(CompilationUnitElement e, _) { | 993 visitCompilationUnitElement(CompilationUnitElement e, _) { |
| 879 e.forEachLocalMember(visit); | 994 e.forEachLocalMember(visit); |
| 880 } | 995 } |
| 881 } | 996 } |
| OLD | NEW |