OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of service; | 5 part of service; |
6 | 6 |
7 /// A [ServiceObject] is an object known to the VM service and is tied | 7 /// A [ServiceObject] is an object known to the VM service and is tied |
8 /// to an owning [Isolate]. | 8 /// to an owning [Isolate]. |
9 abstract class ServiceObject extends Observable { | 9 abstract class ServiceObject extends Observable { |
10 /// The owner of this [ServiceObject]. This can be an [Isolate], a | 10 /// The owner of this [ServiceObject]. This can be an [Isolate], a |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 /// If [this] was created from a reference, load the full object | 92 /// If [this] was created from a reference, load the full object |
93 /// from the service by calling [reload]. Else, return [this]. | 93 /// from the service by calling [reload]. Else, return [this]. |
94 Future<ServiceObject> load() { | 94 Future<ServiceObject> load() { |
95 if (loaded) { | 95 if (loaded) { |
96 return new Future.value(this); | 96 return new Future.value(this); |
97 } | 97 } |
98 // Call reload which will fill in the entire object. | 98 // Call reload which will fill in the entire object. |
99 return reload(); | 99 return reload(); |
100 } | 100 } |
101 | 101 |
| 102 Future<ServiceObject> _inProgressReload; |
| 103 |
102 /// Reload [this]. Returns a future which completes to [this] or | 104 /// Reload [this]. Returns a future which completes to [this] or |
103 /// a [ServiceError]. | 105 /// a [ServiceError]. |
104 Future<ServiceObject> reload() { | 106 Future<ServiceObject> reload() { |
105 if (id == '') { | 107 if (id == '') { |
106 // Errors don't have ids. | 108 // Errors don't have ids. |
107 assert(serviceType == 'Error'); | 109 assert(serviceType == 'Error'); |
108 return new Future.value(this); | 110 return new Future.value(this); |
109 } | 111 } |
110 if (loaded && immutable) { | 112 if (loaded && immutable) { |
111 return new Future.value(this); | 113 return new Future.value(this); |
112 } | 114 } |
113 return vm.getAsMap(link).then((ObservableMap map) { | 115 if (_inProgressReload == null) { |
114 var mapType = _stripRef(map['type']); | 116 _inProgressReload = vm.getAsMap(link).then((ObservableMap map) { |
115 if (mapType != _serviceType) { | 117 var mapType = _stripRef(map['type']); |
116 // If the type changes, return a new object instead of | 118 if (mapType != _serviceType) { |
117 // updating the existing one. | 119 // If the type changes, return a new object instead of |
118 assert(mapType == 'Error' || mapType == 'Null'); | 120 // updating the existing one. |
119 return new ServiceObject._fromMap(owner, map); | 121 assert(mapType == 'Error' || mapType == 'Null'); |
120 } | 122 return new ServiceObject._fromMap(owner, map); |
121 update(map); | 123 } |
122 return this; | 124 update(map); |
| 125 return this; |
| 126 }).whenComplete(() { |
| 127 // This reload is complete. |
| 128 _inProgressReload = null; |
123 }); | 129 }); |
| 130 } |
| 131 return _inProgressReload; |
124 } | 132 } |
125 | 133 |
126 /// Update [this] using [map] as a source. [map] can be a reference. | 134 /// Update [this] using [map] as a source. [map] can be a reference. |
127 void update(ObservableMap map) { | 135 void update(ObservableMap map) { |
128 assert(_isServiceMap(map)); | 136 assert(_isServiceMap(map)); |
129 | 137 |
130 // Don't allow the type to change on an object update. | 138 // Don't allow the type to change on an object update. |
131 // TODO(turnidge): Make this a ServiceError? | 139 // TODO(turnidge): Make this a ServiceError? |
132 var mapIsRef = _hasRef(map['type']); | 140 var mapIsRef = _hasRef(map['type']); |
133 var mapType = _stripRef(map['type']); | 141 var mapType = _stripRef(map['type']); |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 @observable String kind; | 820 @observable String kind; |
813 | 821 |
814 bool get canCache => true; | 822 bool get canCache => true; |
815 bool get immutable => true; | 823 bool get immutable => true; |
816 | 824 |
817 String _shortUrl; | 825 String _shortUrl; |
818 String _url; | 826 String _url; |
819 | 827 |
820 Script._empty(ServiceObjectOwner owner) : super._empty(owner); | 828 Script._empty(ServiceObjectOwner owner) : super._empty(owner); |
821 | 829 |
| 830 /// This function maps a token position to a line number. |
| 831 int tokenToLine(int token) => _tokenToLine[token]; |
| 832 Map _tokenToLine; |
| 833 |
| 834 /// This function maps a token position to a column number. |
| 835 int tokenToCol(int token) => _tokenToCol[token]; |
| 836 Map _tokenToCol; |
| 837 |
822 void _update(ObservableMap map, bool mapIsRef) { | 838 void _update(ObservableMap map, bool mapIsRef) { |
823 kind = map['kind']; | 839 kind = map['kind']; |
824 _url = map['name']; | 840 _url = map['name']; |
825 _shortUrl = _url.substring(_url.lastIndexOf('/') + 1); | 841 _shortUrl = _url.substring(_url.lastIndexOf('/') + 1); |
826 name = _shortUrl; | 842 name = _shortUrl; |
827 vmName = _url; | 843 vmName = _url; |
828 _processSource(map['source']); | 844 _processSource(map['source']); |
| 845 _parseTokenPosTable(map['tokenPosTable']); |
| 846 } |
| 847 |
| 848 void _parseTokenPosTable(List<List<int>> table) { |
| 849 if (table == null) { |
| 850 return; |
| 851 } |
| 852 _tokenToLine = {}; |
| 853 _tokenToCol = {}; |
| 854 for (var line in table) { |
| 855 // Each entry begins with a line number... |
| 856 var lineNumber = line[0]; |
| 857 for (var pos = 1; pos < line.length; pos += 2) { |
| 858 // ...and is followed by (token offset, col number) pairs. |
| 859 var tokenOffset = line[pos]; |
| 860 var colNumber = line[pos+1]; |
| 861 _tokenToLine[tokenOffset] = lineNumber; |
| 862 _tokenToCol[tokenOffset] = colNumber; |
| 863 } |
| 864 } |
829 } | 865 } |
830 | 866 |
831 void _processHits(List scriptHits) { | 867 void _processHits(List scriptHits) { |
832 if (!_loaded) { | 868 if (!_loaded) { |
833 // Eagerly grab script source. | 869 // Eagerly grab script source. |
834 load(); | 870 load(); |
835 } | 871 } |
836 // Update hits table. | 872 // Update hits table. |
837 for (var i = 0; i < scriptHits.length; i += 2) { | 873 for (var i = 0; i < scriptHits.length; i += 2) { |
838 var line = scriptHits[i]; | 874 var line = scriptHits[i]; |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1172 var v = list[i]; | 1208 var v = list[i]; |
1173 if ((v is ObservableMap) && _isServiceMap(v)) { | 1209 if ((v is ObservableMap) && _isServiceMap(v)) { |
1174 list[i] = owner.getFromMap(v); | 1210 list[i] = owner.getFromMap(v); |
1175 } else if (v is ObservableList) { | 1211 } else if (v is ObservableList) { |
1176 _upgradeObservableList(v, owner); | 1212 _upgradeObservableList(v, owner); |
1177 } else if (v is ObservableMap) { | 1213 } else if (v is ObservableMap) { |
1178 _upgradeObservableMap(v, owner); | 1214 _upgradeObservableMap(v, owner); |
1179 } | 1215 } |
1180 } | 1216 } |
1181 } | 1217 } |
OLD | NEW |