| 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 136de497f07471bd27903823a7805c71b5e5c4f4..f3ebd195b37c6fc738faf9252981ee3ab5a8c13e 100644
 | 
| --- a/runtime/observatory/lib/src/service/object.dart
 | 
| +++ b/runtime/observatory/lib/src/service/object.dart
 | 
| @@ -102,6 +102,9 @@ abstract class ServiceObject extends Observable {
 | 
|    @reflectable String get vmType => _vmType;
 | 
|    String _vmType;
 | 
|  
 | 
| +  bool get isICData => vmType == 'ICData';
 | 
| +  bool get isInstructions => vmType == 'Instructions';
 | 
| +  bool get isObjectPool => vmType == 'ObjectPool';
 | 
|    bool get isContext => type == 'Context';
 | 
|    bool get isError => type == 'Error';
 | 
|    bool get isInstance => type == 'Instance';
 | 
| @@ -203,12 +206,21 @@ abstract class ServiceObject extends Observable {
 | 
|          break;
 | 
|        case 'Object':
 | 
|          switch (vmType) {
 | 
| -          case 'PcDescriptors':
 | 
| -            obj = new PcDescriptors._empty(owner);
 | 
| +          case 'ICData':
 | 
| +            obj = new ICData._empty(owner);
 | 
| +            break;
 | 
| +          case 'Instructions':
 | 
| +            obj = new Instructions._empty(owner);
 | 
|              break;
 | 
|            case 'LocalVarDescriptors':
 | 
|              obj = new LocalVarDescriptors._empty(owner);
 | 
|              break;
 | 
| +          case 'ObjectPool':
 | 
| +            obj = new ObjectPool._empty(owner);
 | 
| +            break;
 | 
| +          case 'PcDescriptors':
 | 
| +            obj = new PcDescriptors._empty(owner);
 | 
| +            break;
 | 
|            case 'TokenStream':
 | 
|              obj = new TokenStream._empty(owner);
 | 
|              break;
 | 
| @@ -336,6 +348,14 @@ abstract class ServiceObject extends Observable {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +abstract class HeapObject extends ServiceObject {
 | 
| +  @observable Class clazz;
 | 
| +  @observable int size;
 | 
| +  @observable int retainedSize;
 | 
| +
 | 
| +  HeapObject._empty(ServiceObjectOwner owner) : super._empty(owner);
 | 
| +}
 | 
| +
 | 
|  abstract class Coverage {
 | 
|    // Following getters and functions will be provided by [ServiceObject].
 | 
|    String get id;
 | 
| @@ -1937,7 +1957,6 @@ class Instance extends ServiceObject {
 | 
|  
 | 
|      kind = map['kind'];
 | 
|      clazz = map['class'];
 | 
| -    size = map['size'];
 | 
|      valueAsString = map['valueAsString'];
 | 
|      // Coerce absence to false.
 | 
|      valueAsStringIsTruncated = map['valueAsStringIsTruncated'] == true;
 | 
| @@ -1951,6 +1970,8 @@ class Instance extends ServiceObject {
 | 
|        return;
 | 
|      }
 | 
|  
 | 
| +    size = map['size'];
 | 
| +
 | 
|      oneByteFunction = map['_oneByteFunction'];
 | 
|      twoByteFunction = map['_twoByteFunction'];
 | 
|      externalOneByteFunction = map['_externalOneByteFunction'];
 | 
| @@ -2035,7 +2056,6 @@ class Context extends ServiceObject {
 | 
|      // Extract full properties.
 | 
|      _upgradeCollection(map, isolate);
 | 
|  
 | 
| -    size = map['size'];
 | 
|      length = map['length'];
 | 
|      parentContext = map['parent'];
 | 
|  
 | 
| @@ -2043,6 +2063,7 @@ class Context extends ServiceObject {
 | 
|        return;
 | 
|      }
 | 
|  
 | 
| +    size = map['size'];
 | 
|      clazz = map['class'];
 | 
|      variables = map['variables'];
 | 
|  
 | 
| @@ -2124,6 +2145,7 @@ class ServiceFunction extends ServiceObject with Coverage {
 | 
|    @observable int usageCounter;
 | 
|    @observable bool isDart;
 | 
|    @observable ProfileFunction profile;
 | 
| +  @observable Instance icDataArray;
 | 
|  
 | 
|    bool get immutable => false;
 | 
|  
 | 
| @@ -2137,7 +2159,7 @@ class ServiceFunction extends ServiceObject with Coverage {
 | 
|  
 | 
|      dartOwner = map['owner'];
 | 
|      kind = FunctionKind.fromJSON(map['_kind']);
 | 
| -    isDart = !kind.isSynthetic();
 | 
| +    isDart = kind.isDart();
 | 
|  
 | 
|      if (dartOwner is ServiceFunction) {
 | 
|        ServiceFunction ownerFunction = dartOwner;
 | 
| @@ -2168,6 +2190,7 @@ class ServiceFunction extends ServiceObject with Coverage {
 | 
|      unoptimizedCode = map['_unoptimizedCode'];
 | 
|      deoptimizations = map['_deoptimizations'];
 | 
|      usageCounter = map['_usageCounter'];
 | 
| +    icDataArray = map['_icDataArray'];
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -2762,9 +2785,74 @@ class LocalVarDescriptors extends ServiceObject {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -class TokenStream extends ServiceObject {
 | 
| -  @observable Class clazz;
 | 
| -  @observable int size;
 | 
| +class ObjectPool extends HeapObject {
 | 
| +  bool get canCache => false;
 | 
| +  bool get immutable => false;
 | 
| +
 | 
| +  @observable int length;
 | 
| +  @observable List entries;
 | 
| +
 | 
| +  ObjectPool._empty(ServiceObjectOwner owner) : super._empty(owner);
 | 
| +
 | 
| +  void _update(ObservableMap m, bool mapIsRef) {
 | 
| +    _upgradeCollection(m, isolate);
 | 
| +    clazz = m['class'];
 | 
| +    length = m['length'];
 | 
| +    if (mapIsRef) {
 | 
| +      return;
 | 
| +    }
 | 
| +    size = m['size'];
 | 
| +    entries = m['_entries'];
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +class ICData extends HeapObject {
 | 
| +  @observable ServiceObject dartOwner;
 | 
| +  @observable String selector;
 | 
| +  @observable Instance argumentsDescriptor;
 | 
| +  @observable Instance entries;
 | 
| +
 | 
| +  bool get canCache => false;
 | 
| +  bool get immutable => false;
 | 
| +
 | 
| +  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'];
 | 
| +    if (mapIsRef) {
 | 
| +      return;
 | 
| +    }
 | 
| +    size = m['size'];
 | 
| +    argumentsDescriptor = m['_argumentsDescriptor'];
 | 
| +    entries = m['_entries'];
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +class Instructions extends HeapObject {
 | 
| +  bool get canCache => false;
 | 
| +  bool get immutable => true;
 | 
| +
 | 
| +  @observable Code code;
 | 
| +  @observable ObjectPool objectPool;
 | 
| +
 | 
| +  Instructions._empty(ServiceObjectOwner owner) : super._empty(owner);
 | 
| +
 | 
| +  void _update(ObservableMap m, bool mapIsRef) {
 | 
| +    _upgradeCollection(m, isolate);
 | 
| +    clazz = m['class'];
 | 
| +    code = m['_code'];
 | 
| +    if (mapIsRef) {
 | 
| +      return;
 | 
| +    }
 | 
| +    size = m['size'];
 | 
| +    objectPool = m['_objectPool'];
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +class TokenStream extends HeapObject {
 | 
|    bool get canCache => false;
 | 
|    bool get immutable => true;
 | 
|  
 | 
| @@ -2870,7 +2958,7 @@ class CodeInlineInterval {
 | 
|    CodeInlineInterval(this.start, this.end);
 | 
|  }
 | 
|  
 | 
| -class Code extends ServiceObject {
 | 
| +class Code extends HeapObject {
 | 
|    @observable CodeKind kind;
 | 
|    @observable ServiceObject objectPool;
 | 
|    @observable ServiceFunction function;
 | 
| @@ -2949,6 +3037,7 @@ class Code extends ServiceObject {
 | 
|        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']);
 | 
| 
 |