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

Side by Side Diff: pkg/compiler/lib/src/common/codegen.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 | « no previous file | pkg/compiler/lib/src/common/registry.dart » ('j') | 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) 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 dart2js.common.codegen; 5 library dart2js.common.codegen;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../compiler.dart' show 8 import '../compiler.dart' show
9 Compiler; 9 Compiler;
10 import '../constants/values.dart' show 10 import '../constants/values.dart' show
11 ConstantValue; 11 ConstantValue;
12 import '../dart_types.dart' show 12 import '../dart_types.dart' show
13 DartType, 13 DartType,
14 InterfaceType; 14 InterfaceType;
15 import '../elements/elements.dart' show 15 import '../elements/elements.dart' show
16 AstElement, 16 AstElement,
17 ClassElement, 17 ClassElement,
18 Element, 18 Element,
19 FunctionElement, 19 FunctionElement,
20 LocalFunctionElement; 20 LocalFunctionElement;
21 import '../enqueue.dart' show 21 import '../enqueue.dart' show
22 CodegenEnqueuer; 22 CodegenEnqueuer;
23 import '../js_backend/js_backend.dart' show
24 JavaScriptBackend;
25 import '../resolution/tree_elements.dart' show 23 import '../resolution/tree_elements.dart' show
26 TreeElements; 24 TreeElements;
27 import '../universe/selector.dart' show
28 Selector;
29 import '../universe/universe.dart' show 25 import '../universe/universe.dart' show
30 UniverseSelector; 26 UniverseSelector;
27 import '../universe/use.dart' show
28 StaticUse;
31 import '../universe/world_impact.dart' show 29 import '../universe/world_impact.dart' show
32 WorldImpact, 30 WorldImpact,
33 WorldImpactBuilder; 31 WorldImpactBuilder;
34 import '../util/util.dart' show 32 import '../util/util.dart' show
35 Pair, 33 Pair,
36 Setlet; 34 Setlet;
37 import 'registry.dart' show 35 import 'registry.dart' show
38 Registry, 36 Registry,
39 EagerRegistry; 37 EagerRegistry;
40 import 'work.dart' show 38 import 'work.dart' show
41 ItemCompilationContext, 39 ItemCompilationContext,
42 WorkItem; 40 WorkItem;
43 41
44 class CodegenImpact extends WorldImpact { 42 class CodegenImpact extends WorldImpact {
45 const CodegenImpact(); 43 const CodegenImpact();
46 44
47 // TODO(johnniwinther): Remove this. 45 // TODO(johnniwinther): Remove this.
48 Registry get registry => null; 46 Registry get registry => null;
49 47
50 Iterable<Element> get getterForSuperElements => const <Element>[];
51
52 Iterable<Element> get fieldGetters => const <Element>[];
53
54 Iterable<Element> get fieldSetters => const <Element>[];
55
56 Iterable<ConstantValue> get compileTimeConstants => const <ConstantValue>[]; 48 Iterable<ConstantValue> get compileTimeConstants => const <ConstantValue>[];
57 49
58 Iterable<Pair<DartType, DartType>> get typeVariableBoundsSubtypeChecks { 50 Iterable<Pair<DartType, DartType>> get typeVariableBoundsSubtypeChecks {
59 return const <Pair<DartType, DartType>>[]; 51 return const <Pair<DartType, DartType>>[];
60 } 52 }
61 53
62 Iterable<String> get constSymbols => const <String>[]; 54 Iterable<String> get constSymbols => const <String>[];
63 55
64 Iterable<Set<ClassElement>> get specializedGetInterceptors { 56 Iterable<Set<ClassElement>> get specializedGetInterceptors {
65 return const <Set<ClassElement>>[]; 57 return const <Set<ClassElement>>[];
66 } 58 }
67 59
68 bool get usesInterceptor => false; 60 bool get usesInterceptor => false;
69 61
70 Iterable<ClassElement> get typeConstants => const <ClassElement>[]; 62 Iterable<ClassElement> get typeConstants => const <ClassElement>[];
71 63
72 Iterable<Element> get asyncMarkers => const <FunctionElement>[]; 64 Iterable<Element> get asyncMarkers => const <FunctionElement>[];
73 } 65 }
74 66
75 class _CodegenImpact extends WorldImpactBuilder implements CodegenImpact { 67 class _CodegenImpact extends WorldImpactBuilder implements CodegenImpact {
76 // TODO(johnniwinther): Remove this. 68 // TODO(johnniwinther): Remove this.
77 final Registry registry; 69 final Registry registry;
78 70
79
80 Setlet<Element> _getterForSuperElements;
81 Setlet<Element> _fieldGetters;
82 Setlet<Element> _fieldSetters;
83 Setlet<ConstantValue> _compileTimeConstants; 71 Setlet<ConstantValue> _compileTimeConstants;
84 Setlet<Pair<DartType, DartType>> _typeVariableBoundsSubtypeChecks; 72 Setlet<Pair<DartType, DartType>> _typeVariableBoundsSubtypeChecks;
85 Setlet<String> _constSymbols; 73 Setlet<String> _constSymbols;
86 List<Set<ClassElement>> _specializedGetInterceptors; 74 List<Set<ClassElement>> _specializedGetInterceptors;
87 bool _usesInterceptor = false; 75 bool _usesInterceptor = false;
88 Setlet<ClassElement> _typeConstants; 76 Setlet<ClassElement> _typeConstants;
89 Setlet<FunctionElement> _asyncMarkers; 77 Setlet<FunctionElement> _asyncMarkers;
90 78
91 _CodegenImpact(this.registry); 79 _CodegenImpact(this.registry);
92 80
93 void registerGetterForSuperMethod(Element element) {
94 if (_getterForSuperElements == null) {
95 _getterForSuperElements = new Setlet<Element>();
96 }
97 _getterForSuperElements.add(element);
98 }
99
100 Iterable<Element> get getterForSuperElements {
101 return _getterForSuperElements != null
102 ? _getterForSuperElements : const <Element>[];
103 }
104
105 void registerFieldGetter(Element element) {
106 if (_fieldGetters == null) {
107 _fieldGetters = new Setlet<Element>();
108 }
109 _fieldGetters.add(element);
110 }
111
112 Iterable<Element> get fieldGetters {
113 return _fieldGetters != null
114 ? _fieldGetters : const <Element>[];
115 }
116
117 void registerFieldSetter(Element element) {
118 if (_fieldSetters == null) {
119 _fieldSetters = new Setlet<Element>();
120 }
121 _fieldSetters.add(element);
122 }
123
124 Iterable<Element> get fieldSetters {
125 return _fieldSetters != null
126 ? _fieldSetters : const <Element>[];
127 }
128
129 void registerCompileTimeConstant(ConstantValue constant) { 81 void registerCompileTimeConstant(ConstantValue constant) {
130 if (_compileTimeConstants == null) { 82 if (_compileTimeConstants == null) {
131 _compileTimeConstants = new Setlet<ConstantValue>(); 83 _compileTimeConstants = new Setlet<ConstantValue>();
132 } 84 }
133 _compileTimeConstants.add(constant); 85 _compileTimeConstants.add(constant);
134 } 86 }
135 87
136 Iterable<ConstantValue> get compileTimeConstants { 88 Iterable<ConstantValue> get compileTimeConstants {
137 return _compileTimeConstants != null 89 return _compileTimeConstants != null
138 ? _compileTimeConstants : const <ConstantValue>[]; 90 ? _compileTimeConstants : const <ConstantValue>[];
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 CodegenRegistry(Compiler compiler, AstElement currentElement) 169 CodegenRegistry(Compiler compiler, AstElement currentElement)
218 : this.compiler = compiler, 170 : this.compiler = compiler,
219 this.currentElement = currentElement, 171 this.currentElement = currentElement,
220 this.worldImpact = new _CodegenImpact(new EagerRegistry( 172 this.worldImpact = new _CodegenImpact(new EagerRegistry(
221 'EagerRegistry for $currentElement', compiler.enqueuer.codegen)); 173 'EagerRegistry for $currentElement', compiler.enqueuer.codegen));
222 174
223 bool get isForResolution => false; 175 bool get isForResolution => false;
224 176
225 String toString() => 'CodegenRegistry for $currentElement'; 177 String toString() => 'CodegenRegistry for $currentElement';
226 178
179 @deprecated
227 void registerInstantiatedClass(ClassElement element) { 180 void registerInstantiatedClass(ClassElement element) {
228 registerInstantiatedType(element.rawType); 181 registerInstantiation(element.rawType);
229 } 182 }
230 183
231 void registerInstantiatedType(InterfaceType type) { 184 void registerStaticUse(StaticUse staticUse) {
232 worldImpact.registerInstantiatedType(type); 185 worldImpact.registerStaticUse(staticUse);
233 } 186 }
234 187
235 void registerStaticUse(Element element) { 188 void registerDynamicUse(UniverseSelector selector) {
236 worldImpact.registerStaticUse(element); 189 worldImpact.registerDynamicUse(selector);
237 }
238
239 void registerDynamicInvocation(UniverseSelector selector) {
240 worldImpact.registerDynamicInvocation(selector);
241 compiler.dumpInfoTask.elementUsesSelector(currentElement, selector); 190 compiler.dumpInfoTask.elementUsesSelector(currentElement, selector);
242 } 191 }
243 192
244 void registerDynamicSetter(UniverseSelector selector) {
245 worldImpact.registerDynamicSetter(selector);
246 compiler.dumpInfoTask.elementUsesSelector(currentElement, selector);
247 }
248
249 void registerDynamicGetter(UniverseSelector selector) {
250 worldImpact.registerDynamicGetter(selector);
251 compiler.dumpInfoTask.elementUsesSelector(currentElement, selector);
252 }
253
254 void registerGetterForSuperMethod(Element element) {
255 worldImpact.registerGetterForSuperMethod(element);
256 }
257
258 void registerFieldGetter(Element element) {
259 worldImpact.registerFieldGetter(element);
260 }
261
262 void registerFieldSetter(Element element) {
263 worldImpact.registerFieldSetter(element);
264 }
265
266 void registerIsCheck(DartType type) { 193 void registerIsCheck(DartType type) {
267 worldImpact.registerIsCheck(type); 194 worldImpact.registerIsCheck(type);
268 } 195 }
269 196
270 void registerCompileTimeConstant(ConstantValue constant) { 197 void registerCompileTimeConstant(ConstantValue constant) {
271 worldImpact.registerCompileTimeConstant(constant); 198 worldImpact.registerCompileTimeConstant(constant);
272 } 199 }
273 200
274 void registerTypeVariableBoundsSubtypeCheck(DartType subtype, 201 void registerTypeVariableBoundsSubtypeCheck(DartType subtype,
275 DartType supertype) { 202 DartType supertype) {
276 worldImpact.registerTypeVariableBoundsSubtypeCheck(subtype, supertype); 203 worldImpact.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
277 } 204 }
278 205
279 void registerInstantiatedClosure(LocalFunctionElement element) { 206 void registerInstantiatedClosure(LocalFunctionElement element) {
280 worldImpact.registerClosure(element); 207 worldImpact.registerClosure(element);
281 } 208 }
282 209
283 void registerGetOfStaticFunction(FunctionElement element) {
284 worldImpact.registerClosurizedFunction(element);
285 }
286
287 void registerSelectorUse(Selector selector) {
288 if (selector.isGetter) {
289 registerDynamicGetter(new UniverseSelector(selector, null));
290 } else if (selector.isSetter) {
291 registerDynamicSetter(new UniverseSelector(selector, null));
292 } else {
293 registerDynamicInvocation(new UniverseSelector(selector, null));
294 }
295 }
296
297 void registerConstSymbol(String name) { 210 void registerConstSymbol(String name) {
298 worldImpact.registerConstSymbol(name); 211 worldImpact.registerConstSymbol(name);
299 } 212 }
300 213
301 void registerSpecializedGetInterceptor(Set<ClassElement> classes) { 214 void registerSpecializedGetInterceptor(Set<ClassElement> classes) {
302 worldImpact.registerSpecializedGetInterceptor(classes); 215 worldImpact.registerSpecializedGetInterceptor(classes);
303 } 216 }
304 217
305 void registerUseInterceptor() { 218 void registerUseInterceptor() {
306 worldImpact.registerUseInterceptor(); 219 worldImpact.registerUseInterceptor();
307 } 220 }
308 221
309 void registerTypeConstant(ClassElement element) { 222 void registerTypeConstant(ClassElement element) {
310 worldImpact.registerTypeConstant(element); 223 worldImpact.registerTypeConstant(element);
311 } 224 }
312 225
313 void registerStaticInvocation(Element element) {
314 registerStaticUse(element);
315 }
316
317 void registerSuperInvocation(Element element) {
318 registerStaticUse(element);
319 }
320
321 void registerDirectInvocation(Element element) {
322 registerStaticUse(element);
323 }
324
325 void registerInstantiation(InterfaceType type) { 226 void registerInstantiation(InterfaceType type) {
326 registerInstantiatedType(type); 227 worldImpact.registerInstantiatedType(type);
327 } 228 }
328 229
329 void registerAsyncMarker(FunctionElement element) { 230 void registerAsyncMarker(FunctionElement element) {
330 worldImpact.registerAsyncMarker(element); 231 worldImpact.registerAsyncMarker(element);
331 } 232 }
332 } 233 }
333 234
334 /// [WorkItem] used exclusively by the [CodegenEnqueuer]. 235 /// [WorkItem] used exclusively by the [CodegenEnqueuer].
335 class CodegenWorkItem extends WorkItem { 236 class CodegenWorkItem extends WorkItem {
336 CodegenRegistry registry; 237 CodegenRegistry registry;
(...skipping 21 matching lines...) Expand all
358 259
359 TreeElements get resolutionTree => element.resolvedAst.elements; 260 TreeElements get resolutionTree => element.resolvedAst.elements;
360 261
361 WorldImpact run(Compiler compiler, CodegenEnqueuer world) { 262 WorldImpact run(Compiler compiler, CodegenEnqueuer world) {
362 if (world.isProcessed(element)) return const WorldImpact(); 263 if (world.isProcessed(element)) return const WorldImpact();
363 264
364 registry = new CodegenRegistry(compiler, element); 265 registry = new CodegenRegistry(compiler, element);
365 return compiler.codegen(this, world); 266 return compiler.codegen(this, world);
366 } 267 }
367 } 268 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/common/registry.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698