Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 compiler.src.inferrer.node_tracer; | 5 library compiler.src.inferrer.node_tracer; |
| 6 | 6 |
| 7 import '../common/names.dart' show Identifiers; | 7 import '../common/names.dart' show Identifiers; |
| 8 import '../compiler.dart' show Compiler; | 8 import '../compiler.dart' show Compiler; |
| 9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
| 10 import '../types/types.dart' show ContainerTypeMask, MapTypeMask; | 10 import '../types/types.dart' show ContainerTypeMask, MapTypeMask; |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 addNewEscapeInformation(info); | 213 addNewEscapeInformation(info); |
| 214 } | 214 } |
| 215 } | 215 } |
| 216 | 216 |
| 217 void analyzeStoredIntoList(ListTypeInformation list) { | 217 void analyzeStoredIntoList(ListTypeInformation list) { |
| 218 inferrer.analyzeListAndEnqueue(list); | 218 inferrer.analyzeListAndEnqueue(list); |
| 219 if (list.bailedOut) { | 219 if (list.bailedOut) { |
| 220 bailout('Stored in a list that bailed out'); | 220 bailout('Stored in a list that bailed out'); |
| 221 } else { | 221 } else { |
| 222 list.flowsInto.forEach((flow) { | 222 list.flowsInto.forEach((flow) { |
| 223 flow.users.forEach((user) { | 223 flow.users.forEach((dynamic user) { |
| 224 if (user is! DynamicCallSiteTypeInformation) return; | 224 if (user is! DynamicCallSiteTypeInformation) return; |
| 225 if (user.receiver != flow) return; | 225 if (user.receiver != flow) return; |
| 226 if (inferrer.returnsListElementTypeSet.contains(user.selector)) { | 226 if (inferrer.returnsListElementTypeSet.contains(user.selector)) { |
| 227 addNewEscapeInformation(user); | 227 addNewEscapeInformation(user); |
| 228 } else if (!doesNotEscapeListSet.contains(user.selector.name)) { | 228 } else if (!doesNotEscapeListSet.contains(user.selector.name)) { |
| 229 bailout('Escape from a list via [${user.selector.name}]'); | 229 bailout('Escape from a list via [${user.selector.name}]'); |
| 230 } | 230 } |
| 231 }); | 231 }); |
| 232 }); | 232 }); |
| 233 } | 233 } |
| 234 } | 234 } |
| 235 | 235 |
| 236 void analyzeStoredIntoMap(MapTypeInformation map) { | 236 void analyzeStoredIntoMap(MapTypeInformation map) { |
| 237 inferrer.analyzeMapAndEnqueue(map); | 237 inferrer.analyzeMapAndEnqueue(map); |
| 238 if (map.bailedOut) { | 238 if (map.bailedOut) { |
| 239 bailout('Stored in a map that bailed out'); | 239 bailout('Stored in a map that bailed out'); |
| 240 } else { | 240 } else { |
| 241 map.flowsInto.forEach((flow) { | 241 map.flowsInto.forEach((flow) { |
| 242 flow.users.forEach((user) { | 242 flow.users.forEach((dynamic user) { |
| 243 if (user is! DynamicCallSiteTypeInformation) return; | 243 if (user is! DynamicCallSiteTypeInformation) return; |
| 244 if (user.receiver != flow) return; | 244 if (user.receiver != flow) return; |
| 245 if (user.selector.isIndex) { | 245 if (user.selector.isIndex) { |
| 246 addNewEscapeInformation(user); | 246 addNewEscapeInformation(user); |
| 247 } else if (!doesNotEscapeMapSet.contains(user.selector.name)) { | 247 } else if (!doesNotEscapeMapSet.contains(user.selector.name)) { |
| 248 bailout('Escape from a map via [${user.selector.name}]'); | 248 bailout('Escape from a map via [${user.selector.name}]'); |
| 249 } | 249 } |
| 250 }); | 250 }); |
| 251 }); | 251 }); |
| 252 } | 252 } |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 } | 385 } |
| 386 | 386 |
| 387 if (info.targetsIncludeComplexNoSuchMethod(inferrer) && | 387 if (info.targetsIncludeComplexNoSuchMethod(inferrer) && |
| 388 info.arguments != null && | 388 info.arguments != null && |
| 389 info.arguments.contains(currentUser)) { | 389 info.arguments.contains(currentUser)) { |
| 390 bailout('Passed to noSuchMethod'); | 390 bailout('Passed to noSuchMethod'); |
| 391 } | 391 } |
| 392 | 392 |
| 393 Iterable<Element> inferredTargetTypes = | 393 Iterable<Element> inferredTargetTypes = |
| 394 info.targets.map((MemberElement element) { | 394 info.targets.map((MemberElement element) { |
| 395 // TODO(ahe): Is this a bug? | |
|
ahe
2017/06/15 09:36:39
I'll file a bug and update the comment.
ahe
2017/06/15 11:41:57
Done.
| |
| 396 // ignore: RETURN_OF_INVALID_TYPE | |
| 395 return inferrer.types.getInferredTypeOf(element); | 397 return inferrer.types.getInferredTypeOf(element); |
| 396 }); | 398 }); |
| 397 if (inferredTargetTypes.any((user) => user == currentUser)) { | 399 if (inferredTargetTypes.any((user) => user == currentUser)) { |
| 398 addNewEscapeInformation(info); | 400 addNewEscapeInformation(info); |
| 399 } | 401 } |
| 400 } | 402 } |
| 401 | 403 |
| 402 /** | 404 /** |
| 403 * Check whether element is the parameter of a list adding method. | 405 * Check whether element is the parameter of a list adding method. |
| 404 * The definition of what a list adding method is has to stay in sync with | 406 * The definition of what a list adding method is has to stay in sync with |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 471 } | 473 } |
| 472 if (isParameterOfListAddingMethod(element) || | 474 if (isParameterOfListAddingMethod(element) || |
| 473 isParameterOfMapAddingMethod(element)) { | 475 isParameterOfMapAddingMethod(element)) { |
| 474 // These elements are being handled in | 476 // These elements are being handled in |
| 475 // [visitDynamicCallSiteTypeInformation]. | 477 // [visitDynamicCallSiteTypeInformation]. |
| 476 return; | 478 return; |
| 477 } | 479 } |
| 478 addNewEscapeInformation(info); | 480 addNewEscapeInformation(info); |
| 479 } | 481 } |
| 480 } | 482 } |
| OLD | NEW |