Chromium Code Reviews| 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 d63afa36846e2714e1f809e749e331ae2d9a5552..bc9f9f1596a8a48fbb96eec9db43ed52d7259796 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; |
| @@ -204,6 +207,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) { |
|
Cutch
2014/06/27 16:03:49
Why isn't the event just upgraded like other servi
turnidge
2014/06/27 18:15:06
I don't understand. Let's chat in person.
|
| + 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+/'); |
| @@ -513,7 +539,7 @@ class Isolate extends ServiceObjectOwner { |
| String get link => '/${_id}'; |
| - @observable ServiceMap pauseEvent = null; |
| + @observable ServiceEvent pauseEvent = null; |
| bool get _isPaused => pauseEvent != null; |
| @observable bool running = false; |
| @@ -769,6 +795,17 @@ class Isolate extends ServiceObjectOwner { |
| idle = (!_isPaused && map['topFrame'] == null); |
| error = map['error']; |
| + // Synthesize a resume event if this isolate is not paused. |
| + if (pauseEvent == null) { |
| + var event = new ServiceObject._fromMap(this, toObservable({ |
| + 'type': 'ServiceEvent', |
| + 'id': '', |
| + 'eventType': 'IsolateResumed', |
| + 'isolate': id, |
| + })); |
| + vm.events.add(event); |
|
Cutch
2014/06/27 16:03:49
Why do we synthesize a resume event every time we
turnidge
2014/06/27 18:15:06
I was using a fake resume event to clear out any p
|
| + } |
| + |
| libraries.clear(); |
| for (var lib in map['libraries']) { |
| libraries.add(lib); |
| @@ -950,6 +987,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 { |
| @observable String url; |
| @reflectable final imports = new ObservableList<Library>(); |
| @@ -1382,7 +1442,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++) { |
| @@ -1392,7 +1452,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)}'); |
| } |
| } |