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

Side by Side Diff: pkg/compiler/lib/src/common/codegen.dart

Issue 2807593002: Use entities in impact transformers. (Closed)
Patch Set: Created 3 years, 8 months 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_elements.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 '../elements/resolution_types.dart'
9 show ResolutionDartType, ResolutionInterfaceType;
10 import '../elements/elements.dart' 8 import '../elements/elements.dart'
11 show 9 show
10 AsyncMarker,
12 ClassElement, 11 ClassElement,
13 Element,
14 FunctionElement,
15 LocalFunctionElement, 12 LocalFunctionElement,
16 MemberElement, 13 MemberElement,
17 ResolvedAst; 14 ResolvedAst;
18 import '../elements/entities.dart'; 15 import '../elements/entities.dart';
16 import '../elements/types.dart' show DartType, InterfaceType;
19 import '../js_backend/backend.dart' show JavaScriptBackend; 17 import '../js_backend/backend.dart' show JavaScriptBackend;
20 import '../universe/use.dart' show ConstantUse, DynamicUse, StaticUse, TypeUse; 18 import '../universe/use.dart' show ConstantUse, DynamicUse, StaticUse, TypeUse;
21 import '../universe/world_impact.dart' 19 import '../universe/world_impact.dart'
22 show WorldImpact, WorldImpactBuilderImpl, WorldImpactVisitor; 20 show WorldImpact, WorldImpactBuilderImpl, WorldImpactVisitor;
21 import '../util/enumset.dart';
23 import '../util/util.dart' show Pair, Setlet; 22 import '../util/util.dart' show Pair, Setlet;
24 import 'work.dart' show WorkItem; 23 import 'work.dart' show WorkItem;
25 24
26 class CodegenImpact extends WorldImpact { 25 class CodegenImpact extends WorldImpact {
27 const CodegenImpact(); 26 const CodegenImpact();
28 27
29 Iterable<Pair<ResolutionDartType, ResolutionDartType>> 28 Iterable<Pair<DartType, DartType>> get typeVariableBoundsSubtypeChecks {
30 get typeVariableBoundsSubtypeChecks { 29 return const <Pair<DartType, DartType>>[];
31 return const <Pair<ResolutionDartType, ResolutionDartType>>[];
32 } 30 }
33 31
34 Iterable<String> get constSymbols => const <String>[]; 32 Iterable<String> get constSymbols => const <String>[];
35 33
36 Iterable<Set<ClassEntity>> get specializedGetInterceptors { 34 Iterable<Set<ClassEntity>> get specializedGetInterceptors {
37 return const <Set<ClassEntity>>[]; 35 return const <Set<ClassEntity>>[];
38 } 36 }
39 37
40 bool get usesInterceptor => false; 38 bool get usesInterceptor => false;
41 39
42 Iterable<Element> get asyncMarkers => const <FunctionElement>[]; 40 Iterable<AsyncMarker> get asyncMarkers => <AsyncMarker>[];
43 } 41 }
44 42
45 class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact { 43 class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact {
46 Setlet<Pair<ResolutionDartType, ResolutionDartType>> 44 Setlet<Pair<DartType, DartType>> _typeVariableBoundsSubtypeChecks;
47 _typeVariableBoundsSubtypeChecks;
48 Setlet<String> _constSymbols; 45 Setlet<String> _constSymbols;
49 List<Set<ClassEntity>> _specializedGetInterceptors; 46 List<Set<ClassEntity>> _specializedGetInterceptors;
50 bool _usesInterceptor = false; 47 bool _usesInterceptor = false;
51 Setlet<FunctionElement> _asyncMarkers; 48 EnumSet<AsyncMarker> _asyncMarkers;
52 49
53 _CodegenImpact(); 50 _CodegenImpact();
54 51
55 void apply(WorldImpactVisitor visitor) { 52 void apply(WorldImpactVisitor visitor) {
56 staticUses.forEach(visitor.visitStaticUse); 53 staticUses.forEach(visitor.visitStaticUse);
57 dynamicUses.forEach(visitor.visitDynamicUse); 54 dynamicUses.forEach(visitor.visitDynamicUse);
58 typeUses.forEach(visitor.visitTypeUse); 55 typeUses.forEach(visitor.visitTypeUse);
59 } 56 }
60 57
61 void registerTypeVariableBoundsSubtypeCheck( 58 void registerTypeVariableBoundsSubtypeCheck(
62 ResolutionDartType subtype, ResolutionDartType supertype) { 59 DartType subtype, DartType supertype) {
63 if (_typeVariableBoundsSubtypeChecks == null) { 60 if (_typeVariableBoundsSubtypeChecks == null) {
64 _typeVariableBoundsSubtypeChecks = 61 _typeVariableBoundsSubtypeChecks = new Setlet<Pair<DartType, DartType>>();
65 new Setlet<Pair<ResolutionDartType, ResolutionDartType>>();
66 } 62 }
67 _typeVariableBoundsSubtypeChecks.add( 63 _typeVariableBoundsSubtypeChecks
68 new Pair<ResolutionDartType, ResolutionDartType>(subtype, supertype)); 64 .add(new Pair<DartType, DartType>(subtype, supertype));
69 } 65 }
70 66
71 Iterable<Pair<ResolutionDartType, ResolutionDartType>> 67 Iterable<Pair<DartType, DartType>> get typeVariableBoundsSubtypeChecks {
72 get typeVariableBoundsSubtypeChecks {
73 return _typeVariableBoundsSubtypeChecks != null 68 return _typeVariableBoundsSubtypeChecks != null
74 ? _typeVariableBoundsSubtypeChecks 69 ? _typeVariableBoundsSubtypeChecks
75 : const <Pair<ResolutionDartType, ResolutionDartType>>[]; 70 : const <Pair<DartType, DartType>>[];
76 } 71 }
77 72
78 void registerConstSymbol(String name) { 73 void registerConstSymbol(String name) {
79 if (_constSymbols == null) { 74 if (_constSymbols == null) {
80 _constSymbols = new Setlet<String>(); 75 _constSymbols = new Setlet<String>();
81 } 76 }
82 _constSymbols.add(name); 77 _constSymbols.add(name);
83 } 78 }
84 79
85 Iterable<String> get constSymbols { 80 Iterable<String> get constSymbols {
(...skipping 12 matching lines...) Expand all
98 ? _specializedGetInterceptors 93 ? _specializedGetInterceptors
99 : const <Set<ClassEntity>>[]; 94 : const <Set<ClassEntity>>[];
100 } 95 }
101 96
102 void registerUseInterceptor() { 97 void registerUseInterceptor() {
103 _usesInterceptor = true; 98 _usesInterceptor = true;
104 } 99 }
105 100
106 bool get usesInterceptor => _usesInterceptor; 101 bool get usesInterceptor => _usesInterceptor;
107 102
108 void registerAsyncMarker(FunctionElement element) { 103 void registerAsyncMarker(AsyncMarker asyncMarker) {
109 if (_asyncMarkers == null) { 104 if (_asyncMarkers == null) {
110 _asyncMarkers = new Setlet<FunctionElement>(); 105 _asyncMarkers = new EnumSet<AsyncMarker>();
111 } 106 }
112 _asyncMarkers.add(element); 107 _asyncMarkers.add(asyncMarker);
113 } 108 }
114 109
115 Iterable<Element> get asyncMarkers { 110 Iterable<AsyncMarker> get asyncMarkers {
116 return _asyncMarkers != null ? _asyncMarkers : const <FunctionElement>[]; 111 return _asyncMarkers != null
112 ? _asyncMarkers.iterable(AsyncMarker.values)
113 : const <AsyncMarker>[];
117 } 114 }
118 } 115 }
119 116
120 // TODO(johnniwinther): Split this class into interface and implementation. 117 // TODO(johnniwinther): Split this class into interface and implementation.
121 // TODO(johnniwinther): Move this implementation to the JS backend. 118 // TODO(johnniwinther): Move this implementation to the JS backend.
122 class CodegenRegistry { 119 class CodegenRegistry {
123 final MemberElement currentElement; 120 final MemberElement currentElement;
124 final _CodegenImpact worldImpact; 121 final _CodegenImpact worldImpact;
125 122
126 CodegenRegistry(MemberElement currentElement) 123 CodegenRegistry(MemberElement currentElement)
(...skipping 19 matching lines...) Expand all
146 143
147 void registerTypeUse(TypeUse typeUse) { 144 void registerTypeUse(TypeUse typeUse) {
148 worldImpact.registerTypeUse(typeUse); 145 worldImpact.registerTypeUse(typeUse);
149 } 146 }
150 147
151 void registerConstantUse(ConstantUse constantUse) { 148 void registerConstantUse(ConstantUse constantUse) {
152 worldImpact.registerConstantUse(constantUse); 149 worldImpact.registerConstantUse(constantUse);
153 } 150 }
154 151
155 void registerTypeVariableBoundsSubtypeCheck( 152 void registerTypeVariableBoundsSubtypeCheck(
156 ResolutionDartType subtype, ResolutionDartType supertype) { 153 DartType subtype, DartType supertype) {
157 worldImpact.registerTypeVariableBoundsSubtypeCheck(subtype, supertype); 154 worldImpact.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
158 } 155 }
159 156
160 void registerInstantiatedClosure(LocalFunctionElement element) { 157 void registerInstantiatedClosure(LocalFunctionElement element) {
161 worldImpact.registerStaticUse(new StaticUse.closure(element)); 158 worldImpact.registerStaticUse(new StaticUse.closure(element));
162 } 159 }
163 160
164 void registerConstSymbol(String name) { 161 void registerConstSymbol(String name) {
165 worldImpact.registerConstSymbol(name); 162 worldImpact.registerConstSymbol(name);
166 } 163 }
167 164
168 void registerSpecializedGetInterceptor(Set<ClassEntity> classes) { 165 void registerSpecializedGetInterceptor(Set<ClassEntity> classes) {
169 worldImpact.registerSpecializedGetInterceptor(classes); 166 worldImpact.registerSpecializedGetInterceptor(classes);
170 } 167 }
171 168
172 void registerUseInterceptor() { 169 void registerUseInterceptor() {
173 worldImpact.registerUseInterceptor(); 170 worldImpact.registerUseInterceptor();
174 } 171 }
175 172
176 void registerInstantiation(ResolutionInterfaceType type) { 173 void registerInstantiation(InterfaceType type) {
177 registerTypeUse(new TypeUse.instantiation(type)); 174 registerTypeUse(new TypeUse.instantiation(type));
178 } 175 }
179 176
180 void registerAsyncMarker(FunctionElement element) { 177 void registerAsyncMarker(AsyncMarker asyncMarker) {
181 worldImpact.registerAsyncMarker(element); 178 worldImpact.registerAsyncMarker(asyncMarker);
182 } 179 }
183 } 180 }
184 181
185 /// [WorkItem] used exclusively by the [CodegenEnqueuer]. 182 /// [WorkItem] used exclusively by the [CodegenEnqueuer].
186 class CodegenWorkItem extends WorkItem { 183 class CodegenWorkItem extends WorkItem {
187 CodegenRegistry registry; 184 CodegenRegistry registry;
188 final ResolvedAst resolvedAst; 185 final ResolvedAst resolvedAst;
189 final JavaScriptBackend backend; 186 final JavaScriptBackend backend;
190 187
191 factory CodegenWorkItem(JavaScriptBackend backend, MemberElement element) { 188 factory CodegenWorkItem(JavaScriptBackend backend, MemberElement element) {
(...skipping 12 matching lines...) Expand all
204 201
205 MemberElement get element => resolvedAst.element; 202 MemberElement get element => resolvedAst.element;
206 203
207 WorldImpact run() { 204 WorldImpact run() {
208 registry = new CodegenRegistry(element); 205 registry = new CodegenRegistry(element);
209 return backend.codegen(this); 206 return backend.codegen(this);
210 } 207 }
211 208
212 String toString() => 'CodegenWorkItem(${resolvedAst.element})'; 209 String toString() => 'CodegenWorkItem(${resolvedAst.element})';
213 } 210 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/common_elements.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698