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 cf9e437ba8dd32acafffaadc102148b67609529d..a358c8cc29999affb7d808d11da4b0c656dc1eeb 100644 |
--- a/runtime/observatory/lib/src/service/object.dart |
+++ b/runtime/observatory/lib/src/service/object.dart |
@@ -1822,19 +1822,19 @@ class FunctionKind { |
bool hasDartCode() => isDart() || isStub(); |
static FunctionKind fromJSON(String value) { |
switch(value) { |
- case 'kRegularFunction': return kRegularFunction; |
- case 'kClosureFunction': return kClosureFunction; |
- case 'kGetterFunction': return kGetterFunction; |
- case 'kSetterFunction': return kSetterFunction; |
- case 'kConstructor': return kConstructor; |
- case 'kImplicitGetter': return kImplicitGetterFunction; |
- case 'kImplicitSetter': return kImplicitSetterFunction; |
- case 'kImplicitStaticFinalGetter': return kImplicitStaticFinalGetter; |
- case 'kIrregexpFunction': return kIrregexpFunction; |
- case 'kStaticInitializer': return kStaticInitializer; |
- case 'kMethodExtractor': return kMethodExtractor; |
- case 'kNoSuchMethodDispatcher': return kNoSuchMethodDispatcher; |
- case 'kInvokeFieldDispatcher': return kInvokeFieldDispatcher; |
+ case 'RegularFunction': return kRegularFunction; |
+ case 'ClosureFunction': return kClosureFunction; |
+ case 'GetterFunction': return kGetterFunction; |
+ case 'SetterFunction': return kSetterFunction; |
+ case 'Constructor': return kConstructor; |
+ case 'ImplicitGetter': return kImplicitGetterFunction; |
+ case 'ImplicitSetter': return kImplicitSetterFunction; |
+ case 'ImplicitStaticFinalGetter': return kImplicitStaticFinalGetter; |
+ case 'IrregexpFunction': return kIrregexpFunction; |
+ case 'StaticInitializer': return kStaticInitializer; |
+ case 'MethodExtractor': return kMethodExtractor; |
+ case 'NoSuchMethodDispatcher': return kNoSuchMethodDispatcher; |
+ case 'InvokeFieldDispatcher': return kInvokeFieldDispatcher; |
case 'Collected': return kCollected; |
case 'Native': return kNative; |
case 'Stub': return kStub; |
@@ -1865,11 +1865,11 @@ class FunctionKind { |
} |
class ServiceFunction extends ServiceObject with Coverage { |
- @observable Class owningClass; |
- @observable Library owningLibrary; |
+ // owner is a Library, Class, or ServiceFunction. |
+ @observable ServiceObject dartOwner; |
+ @observable Library library; |
@observable bool isStatic; |
@observable bool isConst; |
- @observable ServiceFunction parent; |
@observable Script script; |
@observable int tokenPos; |
@observable int endTokenPos; |
@@ -1895,17 +1895,21 @@ class ServiceFunction extends ServiceObject with Coverage { |
_upgradeCollection(map, isolate); |
- owningClass = map.containsKey('owningClass') ? map['owningClass'] : null; |
- owningLibrary = map.containsKey('owningLibrary') ? map['owningLibrary'] : null; |
+ dartOwner = map['owner']; |
kind = FunctionKind.fromJSON(map['kind']); |
isDart = !kind.isSynthetic(); |
- if (parent == null) { |
- qualifiedName = (owningClass != null) ? |
- "${owningClass.name}.${name}" : |
- name; |
+ if (dartOwner is ServiceFunction) { |
+ library = dartOwner.library; |
+ qualifiedName = "${dartOwner.qualifiedName}.${name}"; |
+ |
+ } else if (dartOwner is Class) { |
+ library = dartOwner.library; |
+ qualifiedName = "${dartOwner.name}.${name}"; |
+ |
} else { |
- qualifiedName = "${parent.qualifiedName}.${name}"; |
+ library = dartOwner; |
+ qualifiedName = name; |
} |
if (mapIsRef) { |
@@ -1915,22 +1919,23 @@ class ServiceFunction extends ServiceObject with Coverage { |
_loaded = true; |
isStatic = map['static']; |
isConst = map['const']; |
- parent = map['parent']; |
script = map['script']; |
tokenPos = map['tokenPos']; |
endTokenPos = map['endTokenPos']; |
- code = _convertNull(map['code']); |
- unoptimizedCode = _convertNull(map['unoptimizedCode']); |
- isOptimizable = map['optimizable']; |
- isInlinable = map['inlinable']; |
- deoptimizations = map['deoptimizations']; |
- usageCounter = map['usageCounter']; |
+ code = map['code']; |
+ isOptimizable = map['_optimizable']; |
+ isInlinable = map['_inlinable']; |
+ unoptimizedCode = map['_unoptimizedCode']; |
+ deoptimizations = map['_deoptimizations']; |
+ usageCounter = map['_usageCounter']; |
} |
} |
class Field extends ServiceObject { |
- @observable var /* Library or Class */ owner; |
+ // Library or Class. |
+ @observable ServiceObject dartOwner; |
+ @observable Library library; |
@observable Instance declaredType; |
@observable bool isStatic; |
@observable bool isFinal; |
@@ -1953,27 +1958,34 @@ class Field extends ServiceObject { |
name = map['name']; |
vmName = (map.containsKey('vmName') ? map['vmName'] : name); |
- owner = map['owner']; |
+ dartOwner = map['owner']; |
declaredType = map['declaredType']; |
isStatic = map['static']; |
isFinal = map['final']; |
isConst = map['const']; |
value = map['value']; |
+ if (dartOwner is Class) { |
+ library = dartOwner.library; |
+ |
+ } else { |
+ library = dartOwner; |
+ } |
+ |
if (mapIsRef) { |
return; |
} |
- guardNullable = map['guardNullable']; |
- guardClass = map['guardClass']; |
- guardLength = map['guardLength']; |
+ guardNullable = map['_guardNullable']; |
+ guardClass = map['_guardClass']; |
+ guardLength = map['_guardLength']; |
script = map['script']; |
tokenPos = map['tokenPos']; |
_loaded = true; |
} |
- String toString() => 'Field(${owner.name}.$name)'; |
+ String toString() => 'Field(${darOwner.name}.$name)'; |
} |
@@ -2109,7 +2121,7 @@ class Script extends ServiceObject with Coverage { |
@observable String kind; |
@observable int firstTokenPos; |
@observable int lastTokenPos; |
- @observable Library owningLibrary; |
+ @observable Library library; |
bool get canCache => true; |
bool get immutable => true; |
@@ -2143,7 +2155,7 @@ class Script extends ServiceObject with Coverage { |
} |
_parseTokenPosTable(map['tokenPosTable']); |
_processSource(map['source']); |
- owningLibrary = map['owningLibrary']; |
+ library = map['library']; |
} |
void _parseTokenPosTable(List<List<int>> table) { |
@@ -2554,29 +2566,29 @@ class Code extends ServiceObject { |
void _update(ObservableMap m, bool mapIsRef) { |
name = m['name']; |
vmName = (m.containsKey('vmName') ? m['vmName'] : name); |
- isOptimized = m['optimized'] != null ? m['optimized'] : false; |
+ isOptimized = m['_optimized']; |
kind = CodeKind.fromString(m['kind']); |
- startAddress = int.parse(m['start'], radix:16); |
- endAddress = int.parse(m['end'], radix:16); |
- function = isolate.getFromMap(m['function']); |
if (mapIsRef) { |
return; |
} |
_loaded = true; |
- objectPool = isolate.getFromMap(m['objectPool']); |
- var disassembly = m['disassembly']; |
+ startAddress = int.parse(m['_startAddress'], radix:16); |
+ endAddress = int.parse(m['_endAddress'], radix:16); |
+ function = isolate.getFromMap(m['function']); |
+ objectPool = isolate.getFromMap(m['_objectPool']); |
+ var disassembly = m['_disassembly']; |
if (disassembly != null) { |
_processDisassembly(disassembly); |
} |
- var descriptors = m['descriptors']; |
+ var descriptors = m['_descriptors']; |
if (descriptors != null) { |
descriptors = descriptors['members']; |
_processDescriptors(descriptors); |
} |
hasDisassembly = (instructions.length != 0) && (kind == CodeKind.Dart); |
inlinedFunctions.clear(); |
- var inlinedFunctionsTable = m['inlinedFunctions']; |
- var inlinedIntervals = m['inlinedIntervals']; |
+ var inlinedFunctionsTable = m['_inlinedFunctions']; |
+ var inlinedIntervals = m['_inlinedIntervals']; |
if (inlinedFunctionsTable != null) { |
// Iterate and upgrade each ServiceFunction. |
for (var i = 0; i < inlinedFunctionsTable.length; i++) { |
@@ -2885,14 +2897,6 @@ class MetricPoller { |
} |
} |
-// Convert any ServiceMaps representing a null instance into an actual null. |
-_convertNull(obj) { |
- if (obj.isNull) { |
- return null; |
- } |
- return obj; |
-} |
- |
// Returns true if [map] is a service map. i.e. it has the following keys: |
// 'id' and a 'type'. |
bool _isServiceMap(ObservableMap m) { |