| 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']);
|
|
|