| 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 0d67ddedba446a94574fbe5698205973a859fcc3..f9402c9aa7990bad66f1872cbbbda7abd8418e6a 100644
|
| --- a/runtime/observatory/lib/src/service/object.dart
|
| +++ b/runtime/observatory/lib/src/service/object.dart
|
| @@ -267,6 +267,9 @@ abstract class ServiceObject extends Observable {
|
| case 'Sentinel':
|
| obj = new Sentinel._empty(owner);
|
| break;
|
| + case 'TypeArguments':
|
| + obj = new TypeArguments._empty(owner);
|
| + break;
|
| case 'Instance':
|
| obj = new Instance._empty(owner);
|
| break;
|
| @@ -1363,7 +1366,9 @@ class Isolate extends ServiceObjectOwner implements M.Isolate {
|
| if (cls.superclass == null) {
|
| rootClasses.add(cls);
|
| }
|
| - if ((cls.vmName == 'Object') && (cls.isPatch == false)) {
|
| + if ((cls.vmName == 'Object') &&
|
| + (cls.isPatch == false) &&
|
| + (cls.library.uri == 'dart:core')) {
|
| objectClass = cls;
|
| }
|
| }
|
| @@ -2586,6 +2591,11 @@ class BoundField implements M.BoundField {
|
| : value = new Guarded(value);
|
| }
|
|
|
| +class NativeField implements M.NativeField {
|
| + final int value;
|
| + NativeField(this.value);
|
| +}
|
| +
|
| class MapAssociation implements M.MapAssociation {
|
| final Guarded<Instance> key;
|
| final Guarded<Instance> value;
|
| @@ -2599,7 +2609,7 @@ class Instance extends HeapObject implements M.Instance {
|
| @observable String valueAsString; // If primitive.
|
| @observable bool valueAsStringIsTruncated;
|
| @observable ServiceFunction closureFunction; // If a closure.
|
| - @observable Context context; // If a closure.
|
| + @observable Context closureContext; // If a closure.
|
| @observable int length; // If a List, Map or TypedData.
|
| int count;
|
| int offset;
|
| @@ -2608,7 +2618,7 @@ class Instance extends HeapObject implements M.Instance {
|
| @observable String name;
|
| @observable Class typeClass;
|
| @observable Class parameterizedClass;
|
| - @observable ServiceObject typeArguments;
|
| + @observable TypeArguments typeArguments;
|
| @observable int parameterIndex;
|
| @observable Instance targetType;
|
| @observable Instance bound;
|
| @@ -2631,12 +2641,7 @@ class Instance extends HeapObject implements M.Instance {
|
| @observable bool isCaseSensitive; // If a RegExp.
|
| @observable bool isMultiLine; // If a RegExp.
|
|
|
| - bool get isAbstractType {
|
| - return (kind == M.InstanceKind.type ||
|
| - kind == M.InstanceKind.typeRef ||
|
| - kind == M.InstanceKind.typeParameter ||
|
| - kind == M.InstanceKind.boundedType);
|
| - }
|
| + bool get isAbstractType => M.isAbstractType(kind);
|
| bool get isNull => kind == M.InstanceKind.vNull;
|
| bool get isBool => kind == M.InstanceKind.bool;
|
| bool get isDouble => kind == M.InstanceKind.double;
|
| @@ -2691,7 +2696,7 @@ class Instance extends HeapObject implements M.Instance {
|
| // Coerce absence to false.
|
| valueAsStringIsTruncated = map['valueAsStringIsTruncated'] == true;
|
| closureFunction = map['closureFunction'];
|
| - context = map['closureContext'];
|
| + closureContext = map['closureContext'];
|
| name = map['name'];
|
| length = map['length'];
|
| pattern = map['pattern'];
|
| @@ -2713,10 +2718,17 @@ class Instance extends HeapObject implements M.Instance {
|
| oneByteBytecode = map['_oneByteBytecode'];
|
| twoByteBytecode = map['_twoByteBytecode'];
|
|
|
| - nativeFields = map['_nativeFields'];
|
| if (map['fields'] != null) {
|
| fields = map['fields']
|
| .map((f) => new BoundField(f['decl'], f['value'])).toList();
|
| + } else {
|
| + fields = null;
|
| + }
|
| + if (map['_nativeFields'] != null) {
|
| + nativeFields = map['_nativeFields']
|
| + .map((f) => new NativeField(f['value'])).toList();
|
| + } else {
|
| + nativeFields = null;
|
| }
|
| if (map['elements'] != null) {
|
| // Should be:
|
| @@ -2724,10 +2736,14 @@ class Instance extends HeapObject implements M.Instance {
|
| // some times we obtain object that are not InstanceRef
|
| elements = map['elements'].map((e) => new Guarded<ServiceObject>(e))
|
| .toList();
|
| + } else {
|
| + elements = null;
|
| }
|
| if (map['associations'] != null) {
|
| associations = map['associations'].map((a) =>
|
| new MapAssociation(a['key'], a['value'])).toList();
|
| + } else {
|
| + associations = null;
|
| };
|
| if (map['bytes'] != null) {
|
| Uint8List bytes = BASE64.decode(map['bytes']);
|
| @@ -2761,6 +2777,8 @@ class Instance extends HeapObject implements M.Instance {
|
| case "Float64x2List":
|
| typedElements = bytes.buffer.asFloat64x2List(); break;
|
| }
|
| + } else {
|
| + typedElements = null;
|
| }
|
| parameterizedClass = map['parameterizedClass'];
|
| typeArguments = map['typeArguments'];
|
| @@ -3705,6 +3723,26 @@ class ICData extends HeapObject implements M.ICData {
|
| }
|
| }
|
|
|
| +class TypeArguments extends HeapObject implements M.TypeArguments {
|
| + HeapObject dartOwner;
|
| + String name;
|
| + Iterable<Instance> types;
|
| +
|
| + TypeArguments._empty(ServiceObjectOwner owner) : super._empty(owner);
|
| +
|
| + void _update(ObservableMap map, bool mapIsRef) {
|
| + _upgradeCollection(map, isolate);
|
| + super._update(map, mapIsRef);
|
| +
|
| + dartOwner = map['_owner'];
|
| + name = map['name'];
|
| + if (mapIsRef) {
|
| + return;
|
| + }
|
| + types = map['types'];
|
| + }
|
| +}
|
| +
|
| class MegamorphicCache extends HeapObject implements M.MegamorphicCache {
|
| @observable int mask;
|
| @observable Instance buckets;
|
|
|