Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(193)

Side by Side Diff: pkg/compiler/lib/src/universe/world_impact.dart

Issue 1424923004: Add StaticUse for more precise registration of statically known element use. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/compiler/lib/src/universe/use.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 dart2js.universe.world_impact; 5 library dart2js.universe.world_impact;
6 6
7 import '../dart_types.dart' show 7 import '../dart_types.dart' show
8 DartType, 8 DartType,
9 InterfaceType; 9 InterfaceType;
10 import '../elements/elements.dart' show 10 import '../elements/elements.dart' show
11 Element, 11 Element,
12 LocalFunctionElement, 12 LocalFunctionElement,
13 MethodElement; 13 MethodElement;
14 import '../util/util.dart' show 14 import '../util/util.dart' show
15 Setlet; 15 Setlet;
16 16
17 import 'universe.dart' show 17 import 'universe.dart' show
18 UniverseSelector; 18 UniverseSelector;
19 import 'use.dart' show
20 StaticUse;
19 21
20 class WorldImpact { 22 class WorldImpact {
21 const WorldImpact(); 23 const WorldImpact();
22 24
23 Iterable<UniverseSelector> get dynamicInvocations => 25 Iterable<UniverseSelector> get dynamicUses =>
24 const <UniverseSelector>[]; 26 const <UniverseSelector>[];
25 Iterable<UniverseSelector> get dynamicGetters => const <UniverseSelector>[];
26 Iterable<UniverseSelector> get dynamicSetters => const <UniverseSelector>[];
27 27
28 // TODO(johnniwinther): Split this into more precise subsets. 28 Iterable<StaticUse> get staticUses => const <StaticUse>[];
29 Iterable<Element> get staticUses => const <Element>[];
30 29
31 // TODO(johnniwinther): Replace this by called constructors with type 30 // TODO(johnniwinther): Replace this by called constructors with type
32 // arguments. 31 // arguments.
33 Iterable<InterfaceType> get instantiatedTypes => const <InterfaceType>[]; 32 Iterable<InterfaceType> get instantiatedTypes => const <InterfaceType>[];
34 33
35 // TODO(johnniwinther): Collect checked types for checked mode separately to 34 // TODO(johnniwinther): Collect checked types for checked mode separately to
36 // support serialization. 35 // support serialization.
37 Iterable<DartType> get isChecks => const <DartType>[]; 36 Iterable<DartType> get isChecks => const <DartType>[];
38 37
39 Iterable<DartType> get checkedModeChecks => const <DartType>[]; 38 Iterable<DartType> get checkedModeChecks => const <DartType>[];
40 39
41 Iterable<DartType> get asCasts => const <DartType>[]; 40 Iterable<DartType> get asCasts => const <DartType>[];
42 41
43 Iterable<DartType> get onCatchTypes => const <DartType>[]; 42 Iterable<DartType> get onCatchTypes => const <DartType>[];
44 43
45 Iterable<MethodElement> get closurizedFunctions => const <MethodElement>[];
46
47 Iterable<LocalFunctionElement> get closures => const <LocalFunctionElement>[]; 44 Iterable<LocalFunctionElement> get closures => const <LocalFunctionElement>[];
48 45
49 Iterable<DartType> get typeLiterals => const <DartType>[]; 46 Iterable<DartType> get typeLiterals => const <DartType>[];
50 47
51 String toString() => dump(this); 48 String toString() => dump(this);
52 49
53 static String dump(WorldImpact worldImpact) { 50 static String dump(WorldImpact worldImpact) {
54 StringBuffer sb = new StringBuffer(); 51 StringBuffer sb = new StringBuffer();
55 printOn(sb, worldImpact); 52 printOn(sb, worldImpact);
56 return sb.toString(); 53 return sb.toString();
57 } 54 }
58 55
59 static void printOn(StringBuffer sb, WorldImpact worldImpact) { 56 static void printOn(StringBuffer sb, WorldImpact worldImpact) {
60 void add(String title, Iterable iterable) { 57 void add(String title, Iterable iterable) {
61 if (iterable.isNotEmpty) { 58 if (iterable.isNotEmpty) {
62 sb.write('\n $title:'); 59 sb.write('\n $title:');
63 iterable.forEach((e) => sb.write('\n $e')); 60 iterable.forEach((e) => sb.write('\n $e'));
64 } 61 }
65 } 62 }
66 63
67 add('dynamic invocations', worldImpact.dynamicInvocations); 64 add('dynamic uses', worldImpact.dynamicUses);
68 add('dynamic getters', worldImpact.dynamicGetters);
69 add('dynamic setters', worldImpact.dynamicSetters);
70 add('static uses', worldImpact.staticUses); 65 add('static uses', worldImpact.staticUses);
71 add('instantiated types', worldImpact.instantiatedTypes); 66 add('instantiated types', worldImpact.instantiatedTypes);
72 add('is-checks', worldImpact.isChecks); 67 add('is-checks', worldImpact.isChecks);
73 add('checked-mode checks', worldImpact.checkedModeChecks); 68 add('checked-mode checks', worldImpact.checkedModeChecks);
74 add('as-casts', worldImpact.asCasts); 69 add('as-casts', worldImpact.asCasts);
75 add('on-catch-types', worldImpact.onCatchTypes); 70 add('on-catch-types', worldImpact.onCatchTypes);
76 add('closurized functions', worldImpact.closurizedFunctions);
77 add('closures', worldImpact.closures); 71 add('closures', worldImpact.closures);
78 add('type literals', worldImpact.typeLiterals); 72 add('type literals', worldImpact.typeLiterals);
79 } 73 }
80 } 74 }
81 75
82 class WorldImpactBuilder { 76 class WorldImpactBuilder {
83 // TODO(johnniwinther): Do we benefit from lazy initialization of the 77 // TODO(johnniwinther): Do we benefit from lazy initialization of the
84 // [Setlet]s? 78 // [Setlet]s?
85 Setlet<UniverseSelector> _dynamicInvocations; 79 Setlet<UniverseSelector> _dynamicUses;
86 Setlet<UniverseSelector> _dynamicGetters;
87 Setlet<UniverseSelector> _dynamicSetters;
88 Setlet<InterfaceType> _instantiatedTypes; 80 Setlet<InterfaceType> _instantiatedTypes;
89 Setlet<Element> _staticUses; 81 Setlet<StaticUse> _staticUses;
90 Setlet<DartType> _isChecks; 82 Setlet<DartType> _isChecks;
91 Setlet<DartType> _asCasts; 83 Setlet<DartType> _asCasts;
92 Setlet<DartType> _checkedModeChecks; 84 Setlet<DartType> _checkedModeChecks;
93 Setlet<DartType> _onCatchTypes; 85 Setlet<DartType> _onCatchTypes;
94 Setlet<MethodElement> _closurizedFunctions;
95 Setlet<LocalFunctionElement> _closures; 86 Setlet<LocalFunctionElement> _closures;
96 Setlet<DartType> _typeLiterals; 87 Setlet<DartType> _typeLiterals;
97 88
98 void registerDynamicGetter(UniverseSelector selector) { 89 void registerDynamicUse(UniverseSelector dynamicUse) {
99 assert(selector != null); 90 assert(dynamicUse != null);
100 if (_dynamicGetters == null) { 91 if (_dynamicUses == null) {
101 _dynamicGetters = new Setlet<UniverseSelector>(); 92 _dynamicUses = new Setlet<UniverseSelector>();
102 } 93 }
103 _dynamicGetters.add(selector); 94 _dynamicUses.add(dynamicUse);
104 } 95 }
105 96
106 Iterable<UniverseSelector> get dynamicGetters { 97 Iterable<UniverseSelector> get dynamicUses {
107 return _dynamicGetters != null 98 return _dynamicUses != null
108 ? _dynamicGetters : const <UniverseSelector>[]; 99 ? _dynamicUses : const <UniverseSelector>[];
109 }
110
111 void registerDynamicInvocation(UniverseSelector selector) {
112 assert(selector != null);
113 if (_dynamicInvocations == null) {
114 _dynamicInvocations = new Setlet<UniverseSelector>();
115 }
116 _dynamicInvocations.add(selector);
117 }
118
119 Iterable<UniverseSelector> get dynamicInvocations {
120 return _dynamicInvocations != null
121 ? _dynamicInvocations : const <UniverseSelector>[];
122 }
123
124 void registerDynamicSetter(UniverseSelector selector) {
125 assert(selector != null);
126 if (_dynamicSetters == null) {
127 _dynamicSetters = new Setlet<UniverseSelector>();
128 }
129 _dynamicSetters.add(selector);
130 }
131
132 Iterable<UniverseSelector> get dynamicSetters {
133 return _dynamicSetters != null
134 ? _dynamicSetters : const <UniverseSelector>[];
135 } 100 }
136 101
137 void registerInstantiatedType(InterfaceType type) { 102 void registerInstantiatedType(InterfaceType type) {
138 assert(type != null); 103 assert(type != null);
139 if (_instantiatedTypes == null) { 104 if (_instantiatedTypes == null) {
140 _instantiatedTypes = new Setlet<InterfaceType>(); 105 _instantiatedTypes = new Setlet<InterfaceType>();
141 } 106 }
142 _instantiatedTypes.add(type); 107 _instantiatedTypes.add(type);
143 } 108 }
144 109
145 Iterable<InterfaceType> get instantiatedTypes { 110 Iterable<InterfaceType> get instantiatedTypes {
146 return _instantiatedTypes != null 111 return _instantiatedTypes != null
147 ? _instantiatedTypes : const <InterfaceType>[]; 112 ? _instantiatedTypes : const <InterfaceType>[];
148 } 113 }
149 114
150 void registerTypeLiteral(DartType type) { 115 void registerTypeLiteral(DartType type) {
151 assert(type != null); 116 assert(type != null);
152 if (_typeLiterals == null) { 117 if (_typeLiterals == null) {
153 _typeLiterals = new Setlet<DartType>(); 118 _typeLiterals = new Setlet<DartType>();
154 } 119 }
155 _typeLiterals.add(type); 120 _typeLiterals.add(type);
156 } 121 }
157 122
158 Iterable<DartType> get typeLiterals { 123 Iterable<DartType> get typeLiterals {
159 return _typeLiterals != null 124 return _typeLiterals != null
160 ? _typeLiterals : const <DartType>[]; 125 ? _typeLiterals : const <DartType>[];
161 } 126 }
162 127
163 void registerStaticUse(Element element) { 128 void registerStaticUse(StaticUse staticUse) {
164 assert(element != null); 129 assert(staticUse != null);
165 if (_staticUses == null) { 130 if (_staticUses == null) {
166 _staticUses = new Setlet<Element>(); 131 _staticUses = new Setlet<StaticUse>();
167 } 132 }
168 _staticUses.add(element); 133 _staticUses.add(staticUse);
169 } 134 }
170 135
171 Iterable<Element> get staticUses { 136 Iterable<StaticUse> get staticUses {
172 return _staticUses != null ? _staticUses : const <Element>[]; 137 return _staticUses != null ? _staticUses : const <StaticUse>[];
173 } 138 }
174 139
175 void registerIsCheck(DartType type) { 140 void registerIsCheck(DartType type) {
176 assert(type != null); 141 assert(type != null);
177 if (_isChecks == null) { 142 if (_isChecks == null) {
178 _isChecks = new Setlet<DartType>(); 143 _isChecks = new Setlet<DartType>();
179 } 144 }
180 _isChecks.add(type); 145 _isChecks.add(type);
181 } 146 }
182 147
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 _onCatchTypes = new Setlet<DartType>(); 180 _onCatchTypes = new Setlet<DartType>();
216 } 181 }
217 _onCatchTypes.add(type); 182 _onCatchTypes.add(type);
218 } 183 }
219 184
220 Iterable<DartType> get onCatchTypes { 185 Iterable<DartType> get onCatchTypes {
221 return _onCatchTypes != null 186 return _onCatchTypes != null
222 ? _onCatchTypes : const <DartType>[]; 187 ? _onCatchTypes : const <DartType>[];
223 } 188 }
224 189
225 void registerClosurizedFunction(MethodElement element) {
226 if (_closurizedFunctions == null) {
227 _closurizedFunctions = new Setlet<MethodElement>();
228 }
229 _closurizedFunctions.add(element);
230 }
231
232 Iterable<MethodElement> get closurizedFunctions {
233 return _closurizedFunctions != null
234 ? _closurizedFunctions : const <MethodElement>[];
235 }
236
237 void registerClosure(LocalFunctionElement element) { 190 void registerClosure(LocalFunctionElement element) {
238 if (_closures == null) { 191 if (_closures == null) {
239 _closures = new Setlet<LocalFunctionElement>(); 192 _closures = new Setlet<LocalFunctionElement>();
240 } 193 }
241 _closures.add(element); 194 _closures.add(element);
242 } 195 }
243 196
244 Iterable<LocalFunctionElement> get closures { 197 Iterable<LocalFunctionElement> get closures {
245 return _closures != null 198 return _closures != null
246 ? _closures : const <LocalFunctionElement>[]; 199 ? _closures : const <LocalFunctionElement>[];
247 } 200 }
248 } 201 }
249 202
250 /// Mutable implementation of [WorldImpact] used to transform 203 /// Mutable implementation of [WorldImpact] used to transform
251 /// [ResolutionImpact] or [CodegenImpact] to [WorldImpact]. 204 /// [ResolutionImpact] or [CodegenImpact] to [WorldImpact].
252 class TransformedWorldImpact implements WorldImpact { 205 class TransformedWorldImpact implements WorldImpact {
253 final WorldImpact worldImpact; 206 final WorldImpact worldImpact;
254 207
255 Setlet<Element> _staticUses; 208 Setlet<StaticUse> _staticUses;
256 Setlet<InterfaceType> _instantiatedTypes; 209 Setlet<InterfaceType> _instantiatedTypes;
257 Setlet<UniverseSelector> _dynamicGetters; 210 Setlet<UniverseSelector> _dynamicUses;
258 Setlet<UniverseSelector> _dynamicInvocations;
259 Setlet<UniverseSelector> _dynamicSetters;
260 211
261 TransformedWorldImpact(this.worldImpact); 212 TransformedWorldImpact(this.worldImpact);
262 213
263 @override 214 @override
264 Iterable<DartType> get asCasts => worldImpact.asCasts; 215 Iterable<DartType> get asCasts => worldImpact.asCasts;
265 216
266 @override 217 @override
267 Iterable<DartType> get checkedModeChecks => worldImpact.checkedModeChecks; 218 Iterable<DartType> get checkedModeChecks => worldImpact.checkedModeChecks;
268 219
269 @override 220 @override
270 Iterable<MethodElement> get closurizedFunctions { 221 Iterable<UniverseSelector> get dynamicUses {
271 return worldImpact.closurizedFunctions; 222 return _dynamicUses != null
223 ? _dynamicUses : worldImpact.dynamicUses;
272 } 224 }
273 225
274 @override 226 @override
275 Iterable<UniverseSelector> get dynamicGetters {
276 return _dynamicGetters != null
277 ? _dynamicGetters : worldImpact.dynamicGetters;
278 }
279
280 @override
281 Iterable<UniverseSelector> get dynamicInvocations {
282 return _dynamicInvocations != null
283 ? _dynamicInvocations : worldImpact.dynamicInvocations;
284 }
285
286 @override
287 Iterable<UniverseSelector> get dynamicSetters {
288 return _dynamicSetters != null
289 ? _dynamicSetters : worldImpact.dynamicSetters;
290 }
291
292 @override
293 Iterable<DartType> get isChecks => worldImpact.isChecks; 227 Iterable<DartType> get isChecks => worldImpact.isChecks;
294 228
295 @override 229 @override
296 Iterable<DartType> get onCatchTypes => worldImpact.onCatchTypes; 230 Iterable<DartType> get onCatchTypes => worldImpact.onCatchTypes;
297 231
298 _unsupported(String message) => throw new UnsupportedError(message); 232 _unsupported(String message) => throw new UnsupportedError(message);
299 233
300 void registerDynamicGetter(UniverseSelector selector) { 234 void registerDynamicUse(UniverseSelector selector) {
301 if (_dynamicGetters == null) { 235 if (_dynamicUses == null) {
302 _dynamicGetters = new Setlet<UniverseSelector>(); 236 _dynamicUses = new Setlet<UniverseSelector>();
303 _dynamicGetters.addAll(worldImpact.dynamicGetters); 237 _dynamicUses.addAll(worldImpact.dynamicUses);
304 } 238 }
305 _dynamicGetters.add(selector); 239 _dynamicUses.add(selector);
306 }
307
308 void registerDynamicInvocation(UniverseSelector selector) {
309 if (_dynamicInvocations == null) {
310 _dynamicInvocations = new Setlet<UniverseSelector>();
311 _dynamicInvocations.addAll(worldImpact.dynamicInvocations);
312 }
313 _dynamicInvocations.add(selector);
314 }
315
316 void registerDynamicSetter(UniverseSelector selector) {
317 if (_dynamicSetters == null) {
318 _dynamicSetters = new Setlet<UniverseSelector>();
319 _dynamicSetters.addAll(worldImpact.dynamicSetters);
320 }
321 _dynamicSetters.add(selector);
322 } 240 }
323 241
324 void registerInstantiatedType(InterfaceType type) { 242 void registerInstantiatedType(InterfaceType type) {
325 if (_instantiatedTypes == null) { 243 if (_instantiatedTypes == null) {
326 _instantiatedTypes = new Setlet<InterfaceType>(); 244 _instantiatedTypes = new Setlet<InterfaceType>();
327 _instantiatedTypes.addAll(worldImpact.instantiatedTypes); 245 _instantiatedTypes.addAll(worldImpact.instantiatedTypes);
328 } 246 }
329 _instantiatedTypes.add(type); 247 _instantiatedTypes.add(type);
330 } 248 }
331 249
332 @override 250 @override
333 Iterable<InterfaceType> get instantiatedTypes { 251 Iterable<InterfaceType> get instantiatedTypes {
334 return _instantiatedTypes != null 252 return _instantiatedTypes != null
335 ? _instantiatedTypes : worldImpact.instantiatedTypes; 253 ? _instantiatedTypes : worldImpact.instantiatedTypes;
336 } 254 }
337 255
338 @override 256 @override
339 Iterable<DartType> get typeLiterals { 257 Iterable<DartType> get typeLiterals {
340 return worldImpact.typeLiterals; 258 return worldImpact.typeLiterals;
341 } 259 }
342 260
343 void registerStaticUse(Element element) { 261 void registerStaticUse(StaticUse staticUse) {
344 if (_staticUses == null) { 262 if (_staticUses == null) {
345 _staticUses = new Setlet<Element>(); 263 _staticUses = new Setlet<StaticUse>();
346 _staticUses.addAll(worldImpact.staticUses); 264 _staticUses.addAll(worldImpact.staticUses);
347 } 265 }
348 _staticUses.add(element); 266 _staticUses.add(staticUse);
349 } 267 }
350 268
351 @override 269 @override
352 Iterable<Element> get staticUses { 270 Iterable<StaticUse> get staticUses {
353 return _staticUses != null ? _staticUses : worldImpact.staticUses; 271 return _staticUses != null ? _staticUses : worldImpact.staticUses;
354 } 272 }
355 273
356 @override 274 @override
357 Iterable<LocalFunctionElement> get closures => worldImpact.closures; 275 Iterable<LocalFunctionElement> get closures => worldImpact.closures;
358 276
359 String toString() { 277 String toString() {
360 StringBuffer sb = new StringBuffer(); 278 StringBuffer sb = new StringBuffer();
361 sb.write('TransformedWorldImpact($worldImpact)'); 279 sb.write('TransformedWorldImpact($worldImpact)');
362 WorldImpact.printOn(sb, this); 280 WorldImpact.printOn(sb, this);
363 return sb.toString(); 281 return sb.toString();
364 } 282 }
365 } 283 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/universe/use.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698