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

Unified Diff: runtime/bin/vmservice/client/lib/src/service/object.dart

Issue 340443006: Add support for asynchronous event notification to the observatory. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/vmservice/client/lib/src/elements/script_inset.dart ('k') | runtime/bin/vmservice/server.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)}');
}
}
« no previous file with comments | « runtime/bin/vmservice/client/lib/src/elements/script_inset.dart ('k') | runtime/bin/vmservice/server.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698