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 |