Index: runtime/observatory/lib/src/service/object.dart |
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart |
index 0426b5d96dc635824505ed2156633436c757d300..396d5d94ee3d404ab45a88dae8e50443569e5762 100644 |
--- a/runtime/observatory/lib/src/service/object.dart |
+++ b/runtime/observatory/lib/src/service/object.dart |
@@ -365,6 +365,19 @@ abstract class HeapObject extends ServiceObject { |
@observable int retainedSize; |
HeapObject._empty(ServiceObjectOwner owner) : super._empty(owner); |
+ |
+ void _update(ObservableMap map, bool mapIsRef) { |
+ if (map['class'] != null) { |
+ // Sent with refs for some types. Load it if available, but don't clobber |
+ // it with null for kinds that only send if for full responses. |
+ clazz = map['class']; |
+ } |
+ |
+ if (mapIsRef) { |
+ return; |
+ } |
+ size = map['size']; |
+ } |
} |
abstract class Coverage { |
@@ -1624,7 +1637,7 @@ class ServiceMap extends ServiceObject implements ObservableMap { |
_map.addAll(map); |
name = _map['name']; |
- vmName = (_map.containsKey('vmName') ? _map['vmName'] : name); |
+ vmName = (_map.containsKey('_vmName') ? _map['_vmName'] : name); |
} |
// TODO(turnidge): These are temporary until we have a proper root |
@@ -1909,7 +1922,7 @@ class LibraryDependency { |
} |
-class Library extends ServiceObject with Coverage { |
+class Library extends HeapObject with Coverage { |
@observable String uri; |
@reflectable final dependencies = new ObservableList<LibraryDependency>(); |
@reflectable final scripts = new ObservableList<Script>(); |
@@ -1923,6 +1936,9 @@ class Library extends ServiceObject with Coverage { |
Library._empty(ServiceObjectOwner owner) : super._empty(owner); |
void _update(ObservableMap map, bool mapIsRef) { |
+ _upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
+ |
uri = map['uri']; |
var shortUri = uri; |
if (uri.startsWith('file://') || |
@@ -1934,12 +1950,11 @@ class Library extends ServiceObject with Coverage { |
// When there is no name for a library, use the shortUri. |
name = shortUri; |
} |
- vmName = (map.containsKey('vmName') ? map['vmName'] : name); |
+ vmName = (map.containsKey('_vmName') ? map['_vmName'] : name); |
if (mapIsRef) { |
return; |
} |
_loaded = true; |
- _upgradeCollection(map, isolate); |
dependencies.clear(); |
dependencies.addAll(map["dependencies"].map(LibraryDependency._fromMap)); |
scripts.clear(); |
@@ -2005,7 +2020,7 @@ class Allocations { |
bool get empty => accumulated.empty && current.empty; |
} |
-class Class extends ServiceObject with Coverage { |
+class Class extends HeapObject with Coverage { |
@observable Library library; |
@observable bool isAbstract; |
@@ -2038,8 +2053,14 @@ class Class extends ServiceObject with Coverage { |
Class._empty(ServiceObjectOwner owner) : super._empty(owner); |
void _update(ObservableMap map, bool mapIsRef) { |
+ _upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
+ |
name = map['name']; |
- vmName = (map.containsKey('vmName') ? map['vmName'] : name); |
+ vmName = (map.containsKey('_vmName') ? map['_vmName'] : name); |
+ if (vmName == '::') { |
+ name = 'top-level-class'; // Better than '' |
+ } |
var idPrefix = "classes/"; |
assert(id.startsWith(idPrefix)); |
vmCid = int.parse(id.substring(idPrefix.length)); |
@@ -2132,11 +2153,8 @@ class Class extends ServiceObject with Coverage { |
String toString() => 'Class($vmName)'; |
} |
-class Instance extends ServiceObject { |
+class Instance extends HeapObject { |
@observable String kind; |
- @observable Class clazz; |
- @observable int size; |
- @observable int retainedSize; |
@observable String valueAsString; // If primitive. |
@observable bool valueAsStringIsTruncated; |
@observable ServiceFunction function; // If a closure. |
@@ -2203,9 +2221,9 @@ class Instance extends ServiceObject { |
void _update(ObservableMap map, bool mapIsRef) { |
// Extract full properties. |
_upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
kind = map['kind']; |
- clazz = map['class']; |
valueAsString = map['valueAsString']; |
// Coerce absence to false. |
valueAsStringIsTruncated = map['valueAsStringIsTruncated'] == true; |
@@ -2219,8 +2237,6 @@ class Instance extends ServiceObject { |
return; |
} |
- size = map['size']; |
- |
isCaseSensitive = map['isCaseSensitive']; |
isMultiLine = map['isMultiLine']; |
oneByteFunction = map['_oneByteFunction']; |
@@ -2293,10 +2309,7 @@ class Instance extends ServiceObject { |
} |
-class Context extends ServiceObject { |
- @observable Class clazz; |
- @observable int size; |
- |
+class Context extends HeapObject { |
@observable var parentContext; |
@observable int length; |
@observable var variables; |
@@ -2306,6 +2319,7 @@ class Context extends ServiceObject { |
void _update(ObservableMap map, bool mapIsRef) { |
// Extract full properties. |
_upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
length = map['length']; |
parentContext = map['parent']; |
@@ -2314,8 +2328,6 @@ class Context extends ServiceObject { |
return; |
} |
- size = map['size']; |
- clazz = map['class']; |
variables = map['variables']; |
// We are fully loaded. |
@@ -2354,6 +2366,7 @@ class FunctionKind { |
case 'Native': return kNative; |
case 'Stub': return kStub; |
case 'Tag': return kTag; |
+ case 'SignatureFunction': return kSignatureFunction; |
} |
Logger.root.severe('Unrecognized function kind: $value'); |
throw new FallThroughError(); |
@@ -2376,10 +2389,11 @@ class FunctionKind { |
static FunctionKind kNative = new FunctionKind._internal('Native'); |
static FunctionKind kTag = new FunctionKind._internal('Tag'); |
static FunctionKind kStub = new FunctionKind._internal('Stub'); |
+ static FunctionKind kSignatureFunction = new FunctionKind._internal('SignatureFunction'); |
static FunctionKind kUNKNOWN = new FunctionKind._internal('UNKNOWN'); |
} |
-class ServiceFunction extends ServiceObject with Coverage { |
+class ServiceFunction extends HeapObject with Coverage { |
// owner is a Library, Class, or ServiceFunction. |
@observable ServiceObject dartOwner; |
@observable Library library; |
@@ -2404,10 +2418,11 @@ class ServiceFunction extends ServiceObject with Coverage { |
ServiceFunction._empty(ServiceObject owner) : super._empty(owner); |
void _update(ObservableMap map, bool mapIsRef) { |
- name = map['name']; |
- vmName = (map.containsKey('vmName') ? map['vmName'] : name); |
- |
_upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
+ |
+ name = map['name']; |
+ vmName = (map.containsKey('_vmName') ? map['_vmName'] : name); |
dartOwner = map['owner']; |
kind = FunctionKind.fromJSON(map['_kind']); |
@@ -2447,7 +2462,7 @@ class ServiceFunction extends ServiceObject with Coverage { |
} |
-class Field extends ServiceObject { |
+class Field extends HeapObject { |
// Library or Class. |
@observable ServiceObject dartOwner; |
@observable Library library; |
@@ -2469,9 +2484,10 @@ class Field extends ServiceObject { |
void _update(ObservableMap map, bool mapIsRef) { |
// Extract full properties. |
_upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
name = map['name']; |
- vmName = (map.containsKey('vmName') ? map['vmName'] : name); |
+ vmName = (map.containsKey('_vmName') ? map['_vmName'] : name); |
dartOwner = map['owner']; |
declaredType = map['declaredType']; |
isStatic = map['static']; |
@@ -2641,7 +2657,7 @@ class LocalVarLocation { |
LocalVarLocation(this.line, this.column, this.endColumn); |
} |
-class Script extends ServiceObject with Coverage { |
+class Script extends HeapObject with Coverage { |
Set<CallSite> callSites = new Set<CallSite>(); |
final lines = new ObservableList<ScriptLine>(); |
final _hits = new Map<int, int>(); |
@@ -2675,6 +2691,8 @@ class Script extends ServiceObject with Coverage { |
void _update(ObservableMap map, bool mapIsRef) { |
_upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
+ |
uri = map['uri']; |
kind = map['_kind']; |
_shortUri = uri.substring(uri.lastIndexOf('/') + 1); |
@@ -3046,15 +3064,15 @@ class ObjectPool extends HeapObject { |
ObjectPool._empty(ServiceObjectOwner owner) : super._empty(owner); |
- void _update(ObservableMap m, bool mapIsRef) { |
- _upgradeCollection(m, isolate); |
- clazz = m['class']; |
- length = m['length']; |
+ void _update(ObservableMap map, bool mapIsRef) { |
+ _upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
+ |
+ length = map['length']; |
if (mapIsRef) { |
return; |
} |
- size = m['size']; |
- entries = m['_entries']; |
+ entries = map['_entries']; |
} |
} |
@@ -3069,17 +3087,17 @@ class ICData extends HeapObject { |
ICData._empty(ServiceObjectOwner owner) : super._empty(owner); |
- void _update(ObservableMap m, bool mapIsRef) { |
- _upgradeCollection(m, isolate); |
- clazz = m['class']; |
- dartOwner = m['_owner']; |
- selector = m['_selector']; |
+ void _update(ObservableMap map, bool mapIsRef) { |
+ _upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
+ |
+ dartOwner = map['_owner']; |
+ selector = map['_selector']; |
if (mapIsRef) { |
return; |
} |
- size = m['size']; |
- argumentsDescriptor = m['_argumentsDescriptor']; |
- entries = m['_entries']; |
+ argumentsDescriptor = map['_argumentsDescriptor']; |
+ entries = map['_entries']; |
} |
} |
@@ -3092,15 +3110,15 @@ class Instructions extends HeapObject { |
Instructions._empty(ServiceObjectOwner owner) : super._empty(owner); |
- void _update(ObservableMap m, bool mapIsRef) { |
- _upgradeCollection(m, isolate); |
- clazz = m['class']; |
- code = m['_code']; |
+ void _update(ObservableMap map, bool mapIsRef) { |
+ _upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
+ |
+ code = map['_code']; |
if (mapIsRef) { |
return; |
} |
- size = m['size']; |
- objectPool = m['_objectPool']; |
+ objectPool = map['_objectPool']; |
} |
} |
@@ -3112,14 +3130,14 @@ class TokenStream extends HeapObject { |
TokenStream._empty(ServiceObjectOwner owner) : super._empty(owner); |
- void _update(ObservableMap m, bool mapIsRef) { |
+ void _update(ObservableMap map, bool mapIsRef) { |
+ _upgradeCollection(map, isolate); |
+ super._update(map, mapIsRef); |
+ |
if (mapIsRef) { |
return; |
} |
- _upgradeCollection(m, isolate); |
- clazz = m['class']; |
- size = m['size']; |
- privateKey = m['privateKey']; |
+ privateKey = map['privateKey']; |
} |
} |
@@ -3290,14 +3308,13 @@ class Code extends HeapObject { |
void _update(ObservableMap m, bool mapIsRef) { |
name = m['name']; |
- vmName = (m.containsKey('vmName') ? m['vmName'] : name); |
+ vmName = (m.containsKey('_vmName') ? m['_vmName'] : name); |
isOptimized = m['_optimized']; |
kind = CodeKind.fromString(m['kind']); |
if (mapIsRef) { |
return; |
} |
_loaded = true; |
- size = m['size']; |
startAddress = int.parse(m['_startAddress'], radix:16); |
endAddress = int.parse(m['_endAddress'], radix:16); |
function = isolate.getFromMap(m['function']); |
@@ -3332,6 +3349,9 @@ class Code extends HeapObject { |
return; |
} |
_processInline(inlinedFunctionsTable, inlinedIntervals); |
+ |
+ _upgradeCollection(m, isolate); |
+ super._update(m, mapIsRef); |
} |
CodeInlineInterval findInterval(int pc) { |