| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 library universe.function_set; | 5 library universe.function_set; |
| 6 | 6 |
| 7 import '../common/names.dart' show Identifiers, Selectors; | 7 import '../common/names.dart' show Identifiers, Selectors; |
| 8 import '../elements/entities.dart'; | 8 import '../elements/entities.dart'; |
| 9 import '../types/types.dart'; | 9 import '../types/types.dart'; |
| 10 import '../util/util.dart' show Hashing, Setlet; | 10 import '../util/util.dart' show Hashing, Setlet; |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 assert(element.name == name); | 171 assert(element.name == name); |
| 172 // We try to avoid clearing the cache unless we have to. For that | 172 // We try to avoid clearing the cache unless we have to. For that |
| 173 // reason we keep the explicit contains check even though the add | 173 // reason we keep the explicit contains check even though the add |
| 174 // method ends up doing the work again (for sets). | 174 // method ends up doing the work again (for sets). |
| 175 if (!elements.contains(element)) { | 175 if (!elements.contains(element)) { |
| 176 if (isList && elements.length >= MAX_ELEMENTS_IN_LIST) { | 176 if (isList && elements.length >= MAX_ELEMENTS_IN_LIST) { |
| 177 elements = elements.toSet(); | 177 elements = elements.toSet(); |
| 178 isList = false; | 178 isList = false; |
| 179 } | 179 } |
| 180 if (isList) { | 180 if (isList) { |
| 181 List list = elements; | 181 List<MemberEntity> list = elements; |
| 182 list.add(element); | 182 list.add(element); |
| 183 } else { | 183 } else { |
| 184 Set set = elements; | 184 Set<MemberEntity> set = elements; |
| 185 set.add(element); | 185 set.add(element); |
| 186 } | 186 } |
| 187 if (!cache.isEmpty) cache.clear(); | 187 if (!cache.isEmpty) cache.clear(); |
| 188 } | 188 } |
| 189 } | 189 } |
| 190 | 190 |
| 191 void remove(MemberEntity element) { | 191 void remove(MemberEntity element) { |
| 192 assert(element.name == name); | 192 assert(element.name == name); |
| 193 if (isList) { | 193 if (isList) { |
| 194 List list = elements; | 194 List<MemberEntity> list = elements; |
| 195 int index = list.indexOf(element); | 195 int index = list.indexOf(element); |
| 196 if (index < 0) return; | 196 if (index < 0) return; |
| 197 MemberEntity last = list.removeLast(); | 197 MemberEntity last = list.removeLast(); |
| 198 if (index != list.length) { | 198 if (index != list.length) { |
| 199 list[index] = last; | 199 list[index] = last; |
| 200 } | 200 } |
| 201 if (!cache.isEmpty) cache.clear(); | 201 if (!cache.isEmpty) cache.clear(); |
| 202 } else { | 202 } else { |
| 203 Set set = elements; | 203 Set<MemberEntity> set = elements; |
| 204 if (set.remove(element)) { | 204 if (set.remove(element)) { |
| 205 // To avoid wobbling between the two representations, we do | 205 // To avoid wobbling between the two representations, we do |
| 206 // not transition back to the list representation even if we | 206 // not transition back to the list representation even if we |
| 207 // end up with few enough elements at this point. | 207 // end up with few enough elements at this point. |
| 208 if (!cache.isEmpty) cache.clear(); | 208 if (!cache.isEmpty) cache.clear(); |
| 209 } | 209 } |
| 210 } | 210 } |
| 211 } | 211 } |
| 212 | 212 |
| 213 bool contains(MemberEntity element) { | 213 bool contains(MemberEntity element) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 } else if (closedWorld.isInstantiated(cls)) { | 309 } else if (closedWorld.isInstantiated(cls)) { |
| 310 return new TypeMask.nonNullSubclass(cls, closedWorld); | 310 return new TypeMask.nonNullSubclass(cls, closedWorld); |
| 311 } else { | 311 } else { |
| 312 // TODO(johnniwinther): Avoid the need for this case. | 312 // TODO(johnniwinther): Avoid the need for this case. |
| 313 return const TypeMask.empty(); | 313 return const TypeMask.empty(); |
| 314 } | 314 } |
| 315 }), | 315 }), |
| 316 closedWorld); | 316 closedWorld); |
| 317 } | 317 } |
| 318 } | 318 } |
| OLD | NEW |