| 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) {
 | 
| 
 |