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)}'); |
} |
} |