| 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 part of type_graph_inferrer; | 5 part of type_graph_inferrer; |
| 6 | 6 |
| 7 class ClosureTracerVisitor extends TracerVisitor<ApplyableTypeInformation> { | 7 class ClosureTracerVisitor extends TracerVisitor<ApplyableTypeInformation> { |
| 8 final Iterable<FunctionElement> tracedElements; | 8 final Iterable<FunctionElement> tracedElements; |
| 9 final List<CallSiteTypeInformation> callsToAnalyze = | 9 final List<CallSiteTypeInformation> callsToAnalyze = |
| 10 new List<CallSiteTypeInformation>(); | 10 new List<CallSiteTypeInformation>(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 print("Closure $tracedType might be passed to apply: $reason"); | 31 print("Closure $tracedType might be passed to apply: $reason"); |
| 32 } | 32 } |
| 33 } | 33 } |
| 34 | 34 |
| 35 void registerCallForLaterAnalysis(CallSiteTypeInformation info) { | 35 void registerCallForLaterAnalysis(CallSiteTypeInformation info) { |
| 36 callsToAnalyze.add(info); | 36 callsToAnalyze.add(info); |
| 37 } | 37 } |
| 38 | 38 |
| 39 void analyzeCall(CallSiteTypeInformation info) { | 39 void analyzeCall(CallSiteTypeInformation info) { |
| 40 Selector selector = info.selector; | 40 Selector selector = info.selector; |
| 41 TypeMask mask = info.mask; | |
| 42 tracedElements.forEach((FunctionElement functionElement) { | 41 tracedElements.forEach((FunctionElement functionElement) { |
| 43 if (!selector.signatureApplies(functionElement)) return; | 42 if (!selector.signatureApplies(functionElement)) return; |
| 44 inferrer.updateParameterAssignments(info, functionElement, info.arguments, | 43 inferrer.updateParameterAssignments(info, functionElement, info.arguments, |
| 45 selector, mask, remove: false, addToQueue: false); | 44 selector, remove: false, addToQueue: false); |
| 46 }); | 45 }); |
| 47 } | 46 } |
| 48 | 47 |
| 49 visitClosureCallSiteTypeInformation(ClosureCallSiteTypeInformation info) { | 48 visitClosureCallSiteTypeInformation(ClosureCallSiteTypeInformation info) { |
| 50 super.visitClosureCallSiteTypeInformation(info); | 49 super.visitClosureCallSiteTypeInformation(info); |
| 51 if (info.closure == currentUser) { | 50 if (info.closure == currentUser) { |
| 52 registerCallForLaterAnalysis(info); | 51 registerCallForLaterAnalysis(info); |
| 53 } else { | 52 } else { |
| 54 bailout('Passed to a closure'); | 53 bailout('Passed to a closure'); |
| 55 } | 54 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 | 113 |
| 115 visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) { | 114 visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) { |
| 116 super.visitStaticCallSiteTypeInformation(info); | 115 super.visitStaticCallSiteTypeInformation(info); |
| 117 if (info.calledElement == tracedElements.first | 116 if (info.calledElement == tracedElements.first |
| 118 && info.selector != null | 117 && info.selector != null |
| 119 && info.selector.isGetter) { | 118 && info.selector.isGetter) { |
| 120 addNewEscapeInformation(info); | 119 addNewEscapeInformation(info); |
| 121 } | 120 } |
| 122 } | 121 } |
| 123 } | 122 } |
| OLD | NEW |