| Index: runtime/bin/vmservice/client/lib/src/service/object.dart
|
| diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
|
| index 6ab70cef7f799bb4dc0e9edf1cc50c896f45bb9f..09b0de853ab1bc0a891d5aa9d999b71d3a811573 100644
|
| --- a/runtime/bin/vmservice/client/lib/src/service/object.dart
|
| +++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
|
| @@ -72,7 +72,7 @@ abstract class ServiceObject extends Observable {
|
| obj = new DartError._empty(owner);
|
| break;
|
| case 'Isolate':
|
| - obj = new Isolate._empty(owner);
|
| + obj = new Isolate._empty(owner.vm);
|
| break;
|
| case 'Library':
|
| obj = new Library._empty(owner);
|
| @@ -80,6 +80,9 @@ abstract class ServiceObject extends Observable {
|
| case 'ServiceError':
|
| obj = new ServiceError._empty(owner);
|
| break;
|
| + case 'ServiceEvent':
|
| + obj = new ServiceEvent._empty(owner);
|
| + break;
|
| case 'ServiceException':
|
| obj = new ServiceException._empty(owner);
|
| break;
|
| @@ -236,6 +239,29 @@ abstract class VM extends ServiceObjectOwner {
|
| new StreamController.broadcast();
|
| final StreamController<ServiceError> errors =
|
| new StreamController.broadcast();
|
| + final StreamController<ServiceEvent> events =
|
| + new StreamController.broadcast();
|
| +
|
| + void postEventMessage(String eventMessage) {
|
| + var map;
|
| + try {
|
| + map = _parseJSON(eventMessage);
|
| + } catch (e, st) {
|
| + Logger.root.severe('Ignoring malformed event message: ${eventMessage}');
|
| + return;
|
| + }
|
| + if (map['type'] != 'ServiceEvent') {
|
| + Logger.root.severe(
|
| + "Expected 'ServiceEvent' but found '${map['type']}'");
|
| + return;
|
| + }
|
| + // Extract the owning isolate from the event itself.
|
| + String owningIsolateId = map['isolate']['id'];
|
| + _getIsolate(owningIsolateId).then((owningIsolate) {
|
| + var event = new ServiceObject._fromMap(owningIsolate, map);
|
| + events.add(event);
|
| + });
|
| + }
|
|
|
| static final RegExp _currentIsolateMatcher = new RegExp(r'isolates/\d+');
|
| static final RegExp _currentObjectMatcher = new RegExp(r'isolates/\d+/');
|
| @@ -547,7 +573,7 @@ class Isolate extends ServiceObjectOwner with Coverage {
|
|
|
| String get link => '/${_id}';
|
|
|
| - @observable ServiceMap pauseEvent = null;
|
| + @observable ServiceEvent pauseEvent = null;
|
| bool get _isPaused => pauseEvent != null;
|
|
|
| @observable bool running = false;
|
| @@ -714,6 +740,18 @@ class Isolate extends ServiceObjectOwner with Coverage {
|
| }
|
| _loaded = true;
|
| loading = false;
|
| +
|
| + // Remap DebuggerEvent to ServiceEvent so that the observatory can
|
| + // work against 1.5 vms in the short term.
|
| + //
|
| + // TODO(turnidge): Remove this when no longer needed.
|
| + var pause = map['pauseEvent'];
|
| + if (pause != null) {
|
| + if (pause['type'] == 'DebuggerEvent') {
|
| + pause['type'] = 'ServiceEvent';
|
| + }
|
| + }
|
| +
|
| _upgradeCollection(map, isolate);
|
| if (map['rootLib'] == null ||
|
| map['timers'] == null ||
|
| @@ -963,6 +1001,29 @@ class ServiceException extends ServiceObject {
|
| }
|
| }
|
|
|
| +/// A [ServiceEvent] is an asynchronous event notification from the vm.
|
| +class ServiceEvent extends ServiceObject {
|
| + ServiceEvent._empty(ServiceObjectOwner owner) : super._empty(owner);
|
| +
|
| + @observable String eventType;
|
| + @observable ServiceMap breakpoint;
|
| + @observable ServiceMap exception;
|
| +
|
| + void _update(ObservableMap map, bool mapIsRef) {
|
| + _loaded = true;
|
| + _upgradeCollection(map, owner);
|
| + eventType = map['eventType'];
|
| + name = 'ServiceEvent $eventType';
|
| + vmName = name;
|
| + if (map['breakpoint'] != null) {
|
| + breakpoint = map['breakpoint'];
|
| + }
|
| + if (map['exception'] != null) {
|
| + exception = map['exception'];
|
| + }
|
| + }
|
| +}
|
| +
|
| class Library extends ServiceObject with Coverage {
|
| @observable String url;
|
| @reflectable final imports = new ObservableList<Library>();
|
| @@ -1395,7 +1456,7 @@ class CodeInstruction extends Observable {
|
| int address = _getJumpAddress();
|
| if (address == 0) {
|
| // Could not determine jump address.
|
| - print('Could not determine jump address for $human');
|
| + Logger.root.severe('Could not determine jump address for $human');
|
| return;
|
| }
|
| for (var i = 0; i < instructions.length; i++) {
|
| @@ -1405,7 +1466,8 @@ class CodeInstruction extends Observable {
|
| return;
|
| }
|
| }
|
| - print('Could not find instruction at ${address.toRadixString(16)}');
|
| + Logger.root.severe(
|
| + 'Could not find instruction at ${address.toRadixString(16)}');
|
| }
|
| }
|
|
|
|
|