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

Side by Side Diff: runtime/observatory/lib/src/service/object.dart

Issue 1174313002: Allow setting break-on-exceptions option over the service protocol. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart 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 file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of service; 5 part of service;
6 6
7 /// An RpcException represents an exceptional event that happened 7 /// An RpcException represents an exceptional event that happened
8 /// while invoking an rpc. 8 /// while invoking an rpc.
9 abstract class RpcException implements Exception { 9 abstract class RpcException implements Exception {
10 RpcException(this.message); 10 RpcException(this.message);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 bool get isPlainInstance => false; 124 bool get isPlainInstance => false;
125 125
126 /// Has this object been fully loaded? 126 /// Has this object been fully loaded?
127 bool get loaded => _loaded; 127 bool get loaded => _loaded;
128 bool _loaded = false; 128 bool _loaded = false;
129 // TODO(turnidge): Make loaded observable and get rid of loading 129 // TODO(turnidge): Make loaded observable and get rid of loading
130 // from Isolate. 130 // from Isolate.
131 131
132 /// Is this object cacheable? That is, is it impossible for the [id] 132 /// Is this object cacheable? That is, is it impossible for the [id]
133 /// of this object to change? 133 /// of this object to change?
134 bool get canCache => false; 134 bool _canCache;
135 bool get canCache => _canCache;
135 136
136 /// Is this object immutable after it is [loaded]? 137 /// Is this object immutable after it is [loaded]?
137 bool get immutable => false; 138 bool get immutable => false;
138 139
139 @observable String name; 140 @observable String name;
140 @observable String vmName; 141 @observable String vmName;
141 142
142 /// Creates an empty [ServiceObject]. 143 /// Creates an empty [ServiceObject].
143 ServiceObject._empty(this._owner); 144 ServiceObject._empty(this._owner);
144 145
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 298
298 /// Update [this] using [map] as a source. [map] can be a reference. 299 /// Update [this] using [map] as a source. [map] can be a reference.
299 void update(ObservableMap map) { 300 void update(ObservableMap map) {
300 assert(_isServiceMap(map)); 301 assert(_isServiceMap(map));
301 302
302 // Don't allow the type to change on an object update. 303 // Don't allow the type to change on an object update.
303 var mapIsRef = _hasRef(map['type']); 304 var mapIsRef = _hasRef(map['type']);
304 var mapType = _stripRef(map['type']); 305 var mapType = _stripRef(map['type']);
305 assert(_type == null || _type == mapType); 306 assert(_type == null || _type == mapType);
306 307
308 _canCache = map['fixedId'] == true;
307 if (_id != null && _id != map['id']) { 309 if (_id != null && _id != map['id']) {
308 // It is only safe to change an id when the object isn't cacheable. 310 // It is only safe to change an id when the object isn't cacheable.
309 assert(!canCache); 311 assert(!canCache);
310 } 312 }
311 _id = map['id']; 313 _id = map['id'];
312 314
313 _type = mapType; 315 _type = mapType;
314 316
315 // When the response specifies a specific vmType, use it. 317 // When the response specifies a specific vmType, use it.
316 // Otherwise the vmType of the response is the same as the 'user' 318 // Otherwise the vmType of the response is the same as the 'user'
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 timers['compile'] = timerMap['time_compilation']; 1103 timers['compile'] = timerMap['time_compilation'];
1102 timers['gc'] = 0.0; // TODO(turnidge): Export this from VM. 1104 timers['gc'] = 0.0; // TODO(turnidge): Export this from VM.
1103 timers['init'] = (timerMap['time_script_loading'] + 1105 timers['init'] = (timerMap['time_script_loading'] +
1104 timerMap['time_creating_snapshot'] + 1106 timerMap['time_creating_snapshot'] +
1105 timerMap['time_isolate_initialization'] + 1107 timerMap['time_isolate_initialization'] +
1106 timerMap['time_bootstrap']); 1108 timerMap['time_bootstrap']);
1107 timers['dart'] = timerMap['time_dart_execution']; 1109 timers['dart'] = timerMap['time_dart_execution'];
1108 1110
1109 updateHeapsFromMap(map['_heaps']); 1111 updateHeapsFromMap(map['_heaps']);
1110 _updateBreakpoints(map['breakpoints']); 1112 _updateBreakpoints(map['breakpoints']);
1113 exceptionsPauseInfo = map['_debuggerSettings']['_exceptions'];
1111 1114
1112 pauseEvent = map['pauseEvent']; 1115 pauseEvent = map['pauseEvent'];
1113 _updateRunState(); 1116 _updateRunState();
1114 error = map['error']; 1117 error = map['error'];
1115 1118
1116 libraries.clear(); 1119 libraries.clear();
1117 libraries.addAll(map['libraries']); 1120 libraries.addAll(map['libraries']);
1118 libraries.sort(ServiceObject.LexicalSortName); 1121 libraries.sort(ServiceObject.LexicalSortName);
1119 } 1122 }
1120 1123
1121 Future<TagProfile> updateTagProfile() { 1124 Future<TagProfile> updateTagProfile() {
1122 return isolate.invokeRpcNoUpgrade('_getTagProfile', {}).then( 1125 return isolate.invokeRpcNoUpgrade('_getTagProfile', {}).then(
1123 (ObservableMap map) { 1126 (ObservableMap map) {
1124 var seconds = new DateTime.now().millisecondsSinceEpoch / 1000.0; 1127 var seconds = new DateTime.now().millisecondsSinceEpoch / 1000.0;
1125 tagProfile._processTagProfile(seconds, map); 1128 tagProfile._processTagProfile(seconds, map);
1126 return tagProfile; 1129 return tagProfile;
1127 }); 1130 });
1128 } 1131 }
1129 1132
1130 ObservableMap<int, Breakpoint> breakpoints = new ObservableMap(); 1133 ObservableMap<int, Breakpoint> breakpoints = new ObservableMap();
1134 String exceptionsPauseInfo;
1131 1135
1132 void _updateBreakpoints(List newBpts) { 1136 void _updateBreakpoints(List newBpts) {
1133 // Build a set of new breakpoints. 1137 // Build a set of new breakpoints.
1134 var newBptSet = new Set(); 1138 var newBptSet = new Set();
1135 newBpts.forEach((bpt) => newBptSet.add(bpt.number)); 1139 newBpts.forEach((bpt) => newBptSet.add(bpt.number));
1136 1140
1137 // Remove any old breakpoints which no longer exist. 1141 // Remove any old breakpoints which no longer exist.
1138 List toRemove = []; 1142 List toRemove = [];
1139 breakpoints.forEach((key, _) { 1143 breakpoints.forEach((key, _) {
1140 if (!newBptSet.contains(key)) { 1144 if (!newBptSet.contains(key)) {
(...skipping 22 matching lines...) Expand all
1163 case ServiceEvent.kInspect: 1167 case ServiceEvent.kInspect:
1164 // Handled elsewhere. 1168 // Handled elsewhere.
1165 break; 1169 break;
1166 1170
1167 case ServiceEvent.kBreakpointAdded: 1171 case ServiceEvent.kBreakpointAdded:
1168 _addBreakpoint(event.breakpoint); 1172 _addBreakpoint(event.breakpoint);
1169 break; 1173 break;
1170 1174
1171 case ServiceEvent.kIsolateUpdate: 1175 case ServiceEvent.kIsolateUpdate:
1172 case ServiceEvent.kBreakpointResolved: 1176 case ServiceEvent.kBreakpointResolved:
1177 case ServiceEvent.kDebuggerSettingsUpdate:
1173 // Update occurs as side-effect of caching. 1178 // Update occurs as side-effect of caching.
1174 break; 1179 break;
1175 1180
1176 case ServiceEvent.kBreakpointRemoved: 1181 case ServiceEvent.kBreakpointRemoved:
1177 _removeBreakpoint(event.breakpoint); 1182 _removeBreakpoint(event.breakpoint);
1178 break; 1183 break;
1179 1184
1180 case ServiceEvent.kPauseStart: 1185 case ServiceEvent.kPauseStart:
1181 case ServiceEvent.kPauseExit: 1186 case ServiceEvent.kPauseExit:
1182 case ServiceEvent.kPauseBreakpoint: 1187 case ServiceEvent.kPauseBreakpoint:
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 } 1263 }
1259 1264
1260 Future stepOut() { 1265 Future stepOut() {
1261 return invokeRpc('resume', {'step': 'Out'}); 1266 return invokeRpc('resume', {'step': 'Out'});
1262 } 1267 }
1263 1268
1264 Future setName(String newName) { 1269 Future setName(String newName) {
1265 return invokeRpc('setName', {'name': newName}); 1270 return invokeRpc('setName', {'name': newName});
1266 } 1271 }
1267 1272
1273 Future setExceptionPauseInfo(String exceptions) {
1274 return invokeRpc('_setExceptionPauseInfo', {'exceptions': exceptions});
1275 }
1276
1268 Future<ServiceMap> getStack() { 1277 Future<ServiceMap> getStack() {
1269 return invokeRpc('getStack', {}); 1278 return invokeRpc('getStack', {});
1270 } 1279 }
1271 1280
1272 Future<ServiceObject> _eval(ServiceObject target, 1281 Future<ServiceObject> _eval(ServiceObject target,
1273 String expression) { 1282 String expression) {
1274 Map params = { 1283 Map params = {
1275 'targetId': target.id, 1284 'targetId': target.id,
1276 'expression': expression, 1285 'expression': expression,
1277 }; 1286 };
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1448 name = 'DartError($message)'; 1457 name = 'DartError($message)';
1449 vmName = name; 1458 vmName = name;
1450 } 1459 }
1451 1460
1452 String toString() => 'DartError($message)'; 1461 String toString() => 'DartError($message)';
1453 } 1462 }
1454 1463
1455 /// A [ServiceEvent] is an asynchronous event notification from the vm. 1464 /// A [ServiceEvent] is an asynchronous event notification from the vm.
1456 class ServiceEvent extends ServiceObject { 1465 class ServiceEvent extends ServiceObject {
1457 /// The possible 'kind' values. 1466 /// The possible 'kind' values.
1458 static const kIsolateStart = 'IsolateStart'; 1467 static const kIsolateStart = 'IsolateStart';
1459 static const kIsolateExit = 'IsolateExit'; 1468 static const kIsolateExit = 'IsolateExit';
1460 static const kIsolateUpdate = 'IsolateUpdate'; 1469 static const kIsolateUpdate = 'IsolateUpdate';
1461 static const kPauseStart = 'PauseStart'; 1470 static const kPauseStart = 'PauseStart';
1462 static const kPauseExit = 'PauseExit'; 1471 static const kPauseExit = 'PauseExit';
1463 static const kPauseBreakpoint = 'PauseBreakpoint'; 1472 static const kPauseBreakpoint = 'PauseBreakpoint';
1464 static const kPauseInterrupted = 'PauseInterrupted'; 1473 static const kPauseInterrupted = 'PauseInterrupted';
1465 static const kPauseException = 'PauseException'; 1474 static const kPauseException = 'PauseException';
1466 static const kResume = 'Resume'; 1475 static const kResume = 'Resume';
1467 static const kBreakpointAdded = 'BreakpointAdded'; 1476 static const kBreakpointAdded = 'BreakpointAdded';
1468 static const kBreakpointResolved = 'BreakpointResolved'; 1477 static const kBreakpointResolved = 'BreakpointResolved';
1469 static const kBreakpointRemoved = 'BreakpointRemoved'; 1478 static const kBreakpointRemoved = 'BreakpointRemoved';
1470 static const kGraph = '_Graph'; 1479 static const kGraph = '_Graph';
1471 static const kGC = 'GC'; 1480 static const kGC = 'GC';
1472 static const kInspect = 'Inspect'; 1481 static const kInspect = 'Inspect';
1473 static const kConnectionClosed = 'ConnectionClosed'; 1482 static const kDebuggerSettingsUpdate = '_DebuggerSettingsUpdate';
1483 static const kConnectionClosed = 'ConnectionClosed';
1474 1484
1475 ServiceEvent._empty(ServiceObjectOwner owner) : super._empty(owner); 1485 ServiceEvent._empty(ServiceObjectOwner owner) : super._empty(owner);
1476 1486
1477 ServiceEvent.connectionClosed(this.reason) : super._empty(null) { 1487 ServiceEvent.connectionClosed(this.reason) : super._empty(null) {
1478 kind = kConnectionClosed; 1488 kind = kConnectionClosed;
1479 } 1489 }
1480 1490
1481 @observable String kind; 1491 @observable String kind;
1482 @observable Breakpoint breakpoint; 1492 @observable Breakpoint breakpoint;
1483 @observable Frame topFrame; 1493 @observable Frame topFrame;
1484 @observable ServiceMap exception; 1494 @observable Instance exception;
1485 @observable ServiceObject inspectee; 1495 @observable ServiceObject inspectee;
1486 @observable ByteData data; 1496 @observable ByteData data;
1487 @observable int count; 1497 @observable int count;
1488 @observable String reason; 1498 @observable String reason;
1499 @observable String exceptions;
1489 int chunkIndex, chunkCount, nodeCount; 1500 int chunkIndex, chunkCount, nodeCount;
1490 1501
1491 @observable bool get isPauseEvent { 1502 @observable bool get isPauseEvent {
1492 return (kind == kPauseStart || 1503 return (kind == kPauseStart ||
1493 kind == kPauseExit || 1504 kind == kPauseExit ||
1494 kind == kPauseBreakpoint || 1505 kind == kPauseBreakpoint ||
1495 kind == kPauseInterrupted || 1506 kind == kPauseInterrupted ||
1496 kind == kPauseException); 1507 kind == kPauseException);
1497 } 1508 }
1498 1509
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 } 1541 }
1531 if (map['chunkCount'] != null) { 1542 if (map['chunkCount'] != null) {
1532 chunkCount = map['chunkCount']; 1543 chunkCount = map['chunkCount'];
1533 } 1544 }
1534 if (map['nodeCount'] != null) { 1545 if (map['nodeCount'] != null) {
1535 nodeCount = map['nodeCount']; 1546 nodeCount = map['nodeCount'];
1536 } 1547 }
1537 if (map['count'] != null) { 1548 if (map['count'] != null) {
1538 count = map['count']; 1549 count = map['count'];
1539 } 1550 }
1551 if (map['_debuggerSettings'] != null &&
1552 map['_debuggerSettings']['_exceptions'] != null) {
1553 exceptions = map['_debuggerSettings']['_exceptions'];
1554 }
1540 } 1555 }
1541 1556
1542 String toString() { 1557 String toString() {
1543 if (data == null) { 1558 if (data == null) {
1544 return "ServiceEvent(owner='${owner.id}', kind='${kind}')"; 1559 return "ServiceEvent(owner='${owner.id}', kind='${kind}')";
1545 } else { 1560 } else {
1546 return "ServiceEvent(owner='${owner.id}', kind='${kind}', " 1561 return "ServiceEvent(owner='${owner.id}', kind='${kind}', "
1547 "data.lengthInBytes=${data.lengthInBytes})"; 1562 "data.lengthInBytes=${data.lengthInBytes})";
1548 } 1563 }
1549 } 1564 }
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
2084 @observable Code unoptimizedCode; 2099 @observable Code unoptimizedCode;
2085 @observable bool isOptimizable; 2100 @observable bool isOptimizable;
2086 @observable bool isInlinable; 2101 @observable bool isInlinable;
2087 @observable FunctionKind kind; 2102 @observable FunctionKind kind;
2088 @observable int deoptimizations; 2103 @observable int deoptimizations;
2089 @observable String qualifiedName; 2104 @observable String qualifiedName;
2090 @observable int usageCounter; 2105 @observable int usageCounter;
2091 @observable bool isDart; 2106 @observable bool isDart;
2092 @observable ProfileFunction profile; 2107 @observable ProfileFunction profile;
2093 2108
2094 bool get canCache => true;
2095 bool get immutable => false; 2109 bool get immutable => false;
2096 2110
2097 ServiceFunction._empty(ServiceObject owner) : super._empty(owner); 2111 ServiceFunction._empty(ServiceObject owner) : super._empty(owner);
2098 2112
2099 void _update(ObservableMap map, bool mapIsRef) { 2113 void _update(ObservableMap map, bool mapIsRef) {
2100 name = map['name']; 2114 name = map['name'];
2101 vmName = (map.containsKey('vmName') ? map['vmName'] : name); 2115 vmName = (map.containsKey('vmName') ? map['vmName'] : name);
2102 2116
2103 _upgradeCollection(map, isolate); 2117 _upgradeCollection(map, isolate);
2104 2118
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
2337 Set<CallSite> callSites = new Set<CallSite>(); 2351 Set<CallSite> callSites = new Set<CallSite>();
2338 final lines = new ObservableList<ScriptLine>(); 2352 final lines = new ObservableList<ScriptLine>();
2339 final _hits = new Map<int, int>(); 2353 final _hits = new Map<int, int>();
2340 @observable String uri; 2354 @observable String uri;
2341 @observable String kind; 2355 @observable String kind;
2342 @observable int firstTokenPos; 2356 @observable int firstTokenPos;
2343 @observable int lastTokenPos; 2357 @observable int lastTokenPos;
2344 @observable int lineOffset; 2358 @observable int lineOffset;
2345 @observable int columnOffset; 2359 @observable int columnOffset;
2346 @observable Library library; 2360 @observable Library library;
2347 bool get canCache => true; 2361
2348 bool get immutable => true; 2362 bool get immutable => true;
2349 2363
2350 String _shortUri; 2364 String _shortUri;
2351 2365
2352 Script._empty(ServiceObjectOwner owner) : super._empty(owner); 2366 Script._empty(ServiceObjectOwner owner) : super._empty(owner);
2353 2367
2354 ScriptLine getLine(int line) { 2368 ScriptLine getLine(int line) {
2355 assert(_loaded); 2369 assert(_loaded);
2356 assert(line >= 1); 2370 assert(line >= 1);
2357 return lines[line - lineOffset - 1]; 2371 return lines[line - lineOffset - 1];
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
2838 @observable Script script; 2852 @observable Script script;
2839 @observable bool isOptimized = false; 2853 @observable bool isOptimized = false;
2840 @reflectable int startAddress = 0; 2854 @reflectable int startAddress = 0;
2841 @reflectable int endAddress = 0; 2855 @reflectable int endAddress = 0;
2842 @reflectable final instructions = new ObservableList<CodeInstruction>(); 2856 @reflectable final instructions = new ObservableList<CodeInstruction>();
2843 @observable ProfileCode profile; 2857 @observable ProfileCode profile;
2844 final List<CodeInlineInterval> inlineIntervals = 2858 final List<CodeInlineInterval> inlineIntervals =
2845 new List<CodeInlineInterval>(); 2859 new List<CodeInlineInterval>();
2846 final ObservableList<ServiceFunction> inlinedFunctions = 2860 final ObservableList<ServiceFunction> inlinedFunctions =
2847 new ObservableList<ServiceFunction>(); 2861 new ObservableList<ServiceFunction>();
2848 bool get canCache => true; 2862
2849 bool get immutable => true; 2863 bool get immutable => true;
2850 2864
2851 Code._empty(ServiceObjectOwner owner) : super._empty(owner); 2865 Code._empty(ServiceObjectOwner owner) : super._empty(owner);
2852 2866
2853 void _updateDescriptors(Script script) { 2867 void _updateDescriptors(Script script) {
2854 this.script = script; 2868 this.script = script;
2855 for (var instruction in instructions) { 2869 for (var instruction in instructions) {
2856 for (var descriptor in instruction.descriptors) { 2870 for (var descriptor in instruction.descriptors) {
2857 descriptor.processScript(script); 2871 descriptor.processScript(script);
2858 } 2872 }
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
3247 void _update(ObservableMap map, bool mapIsRef) { 3261 void _update(ObservableMap map, bool mapIsRef) {
3248 assert(!mapIsRef); 3262 assert(!mapIsRef);
3249 _loaded = true; 3263 _loaded = true;
3250 _upgradeCollection(map, owner); 3264 _upgradeCollection(map, owner);
3251 this.index = map['index']; 3265 this.index = map['index'];
3252 this.function = map['function']; 3266 this.function = map['function'];
3253 this.location = map['location']; 3267 this.location = map['location'];
3254 this.code = map['code']; 3268 this.code = map['code'];
3255 this.variables = map['vars']; 3269 this.variables = map['vars'];
3256 } 3270 }
3271
3272 String toString() => "Frame(${function.qualifiedName})";
3257 } 3273 }
3258 3274
3259 3275
3260 class ServiceMessage extends ServiceObject { 3276 class ServiceMessage extends ServiceObject {
3261 @observable int index; 3277 @observable int index;
3262 @observable String messageObjectId; 3278 @observable String messageObjectId;
3263 @observable int size; 3279 @observable int size;
3264 @observable ServiceFunction handler; 3280 @observable ServiceFunction handler;
3265 @observable SourceLocation location; 3281 @observable SourceLocation location;
3266 3282
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3319 var v = list[i]; 3335 var v = list[i];
3320 if ((v is ObservableMap) && _isServiceMap(v)) { 3336 if ((v is ObservableMap) && _isServiceMap(v)) {
3321 list[i] = owner.getFromMap(v); 3337 list[i] = owner.getFromMap(v);
3322 } else if (v is ObservableList) { 3338 } else if (v is ObservableList) {
3323 _upgradeObservableList(v, owner); 3339 _upgradeObservableList(v, owner);
3324 } else if (v is ObservableMap) { 3340 } else if (v is ObservableMap) {
3325 _upgradeObservableMap(v, owner); 3341 _upgradeObservableMap(v, owner);
3326 } 3342 }
3327 } 3343 }
3328 } 3344 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698