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

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

Issue 2494093002: Refactor enqueuers (Closed)
Patch Set: Updated cf. comments. Created 4 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/compiler.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.backend_api; 5 library dart2js.backend_api;
6 6
7 import 'dart:async' show Future; 7 import 'dart:async' show Future;
8 8
9 import '../common.dart'; 9 import '../common.dart';
10 import '../common/codegen.dart' show CodegenImpact; 10 import '../common/codegen.dart' show CodegenImpact;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 /// Set of classes that need to be considered for reflection although not 76 /// Set of classes that need to be considered for reflection although not
77 /// otherwise visible during resolution. 77 /// otherwise visible during resolution.
78 Iterable<ClassElement> classesRequiredForReflection = const []; 78 Iterable<ClassElement> classesRequiredForReflection = const [];
79 79
80 // Given a [FunctionElement], return a buffer with the code generated for it 80 // Given a [FunctionElement], return a buffer with the code generated for it
81 // or null if no code was generated. 81 // or null if no code was generated.
82 CodeBuffer codeOf(Element element) => null; 82 CodeBuffer codeOf(Element element) => null;
83 83
84 void initializeHelperClasses() {} 84 void initializeHelperClasses() {}
85 85
86 void enqueueHelpers(ResolutionEnqueuer world, Registry registry); 86 void enqueueHelpers(ResolutionEnqueuer world);
87 87
88 /// Creates an [Enqueuer] for code generation specific to this backend. 88 /// Creates an [Enqueuer] for code generation specific to this backend.
89 Enqueuer createCodegenEnqueuer(Compiler compiler); 89 Enqueuer createCodegenEnqueuer(Compiler compiler);
90 90
91 WorldImpact codegen(CodegenWorkItem work); 91 WorldImpact codegen(CodegenWorkItem work);
92 92
93 // The backend determines the native resolution enqueuer, with a no-op 93 // The backend determines the native resolution enqueuer, with a no-op
94 // default, so tools like dart2dart can ignore the native classes. 94 // default, so tools like dart2dart can ignore the native classes.
95 native.NativeEnqueuer nativeResolutionEnqueuer(world) { 95 native.NativeEnqueuer nativeResolutionEnqueuer(world) {
96 return new native.NativeEnqueuer(); 96 return new native.NativeEnqueuer();
(...skipping 13 matching lines...) Expand all
110 110
111 bool classNeedsRti(ClassElement cls); 111 bool classNeedsRti(ClassElement cls);
112 bool methodNeedsRti(FunctionElement function); 112 bool methodNeedsRti(FunctionElement function);
113 113
114 /// Enable compilation of code with compile time errors. Returns `true` if 114 /// Enable compilation of code with compile time errors. Returns `true` if
115 /// supported by the backend. 115 /// supported by the backend.
116 bool enableCodegenWithErrorsIfSupported(Spannable node); 116 bool enableCodegenWithErrorsIfSupported(Spannable node);
117 117
118 /// Enable deferred loading. Returns `true` if the backend supports deferred 118 /// Enable deferred loading. Returns `true` if the backend supports deferred
119 /// loading. 119 /// loading.
120 bool enableDeferredLoadingIfSupported(Spannable node, Registry registry); 120 bool enableDeferredLoadingIfSupported(
121 ResolutionEnqueuer enqueuer, Spannable node);
121 122
122 /// Called during codegen when [constant] has been used. 123 /// Called during codegen when [constant] has been used.
123 void computeImpactForCompileTimeConstant(ConstantValue constant, 124 void computeImpactForCompileTimeConstant(ConstantValue constant,
124 WorldImpactBuilder impactBuilder, bool isForResolution) {} 125 WorldImpactBuilder impactBuilder, bool isForResolution) {}
125 126
126 /// Called to notify to the backend that a class is being instantiated. 127 /// Called to notify to the backend that a class is being instantiated.
127 // TODO(johnniwinther): Remove this. It's only called once for each [cls] and 128 // TODO(johnniwinther): Remove this. It's only called once for each [cls] and
128 // only with [Compiler.globalDependencies] as [registry]. 129 // only with [Compiler.globalDependencies] as [registry].
129 void registerInstantiatedClass( 130 void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {}
130 ClassElement cls, Enqueuer enqueuer, Registry registry) {}
131 131
132 /// Called to notify to the backend that a class is implemented by an 132 /// Called to notify to the backend that a class is implemented by an
133 /// instantiated class. 133 /// instantiated class.
134 void registerImplementedClass( 134 void registerImplementedClass(ClassElement cls, Enqueuer enqueuer) {}
135 ClassElement cls, Enqueuer enqueuer, Registry registry) {}
136 135
137 /// Called to instruct to the backend register [type] as instantiated on 136 /// Called to instruct to the backend register [type] as instantiated on
138 /// [enqueuer]. 137 /// [enqueuer].
139 void registerInstantiatedType( 138 void registerInstantiatedType(InterfaceType type) {}
140 InterfaceType type, Enqueuer enqueuer, Registry registry,
141 {bool mirrorUsage: false}) {
142 registry.registerDependency(type.element);
143 enqueuer.registerInstantiatedType(type, mirrorUsage: mirrorUsage);
144 }
145 139
146 /// Register a runtime type variable bound tests between [typeArgument] and 140 /// Register a runtime type variable bound tests between [typeArgument] and
147 /// [bound]. 141 /// [bound].
148 void registerTypeVariableBoundsSubtypeCheck( 142 void registerTypeVariableBoundsSubtypeCheck(
149 DartType typeArgument, DartType bound) {} 143 DartType typeArgument, DartType bound) {}
150 144
151 /** 145 /**
152 * Call this to register that an instantiated generic class has a call 146 * Call this to register that an instantiated generic class has a call
153 * method. 147 * method.
154 */ 148 */
155 void registerCallMethodWithFreeTypeVariables( 149 void registerCallMethodWithFreeTypeVariables(
156 Element callMethod, Enqueuer enqueuer, Registry registry) {} 150 Element callMethod, Enqueuer enqueuer) {}
157 151
158 /// Called to instruct the backend to register that a closure exists for a 152 /// Called to instruct the backend to register that a closure exists for a
159 /// function on an instantiated generic class. 153 /// function on an instantiated generic class.
160 void registerClosureWithFreeTypeVariables( 154 void registerClosureWithFreeTypeVariables(
161 Element closure, Enqueuer enqueuer, Registry registry) {} 155 Element closure, Enqueuer enqueuer) {}
162 156
163 /// Call this to register that a member has been closurized. 157 /// Call this to register that a member has been closurized.
164 void registerBoundClosure(Enqueuer enqueuer) {} 158 void registerBoundClosure(Enqueuer enqueuer) {}
165 159
166 /// Call this to register that a static function has been closurized. 160 /// Call this to register that a static function has been closurized.
167 void registerGetOfStaticFunction(Enqueuer enqueuer) {} 161 void registerGetOfStaticFunction(Enqueuer enqueuer) {}
168 162
169 /** 163 /**
170 * Call this to register that the [:runtimeType:] property has been accessed. 164 * Call this to register that the [:runtimeType:] property has been accessed.
171 */ 165 */
172 void registerRuntimeType(Enqueuer enqueuer, Registry registry) {} 166 void registerRuntimeType(Enqueuer enqueuer) {}
173 167
174 /// Call this to register a `noSuchMethod` implementation. 168 /// Call this to register a `noSuchMethod` implementation.
175 void registerNoSuchMethod(FunctionElement noSuchMethodElement) {} 169 void registerNoSuchMethod(FunctionElement noSuchMethodElement) {}
176 170
177 /// Call this method to enable support for `noSuchMethod`. 171 /// Call this method to enable support for `noSuchMethod`.
178 void enableNoSuchMethod(Enqueuer enqueuer) {} 172 void enableNoSuchMethod(Enqueuer enqueuer) {}
179 173
180 /// Returns whether or not `noSuchMethod` support has been enabled. 174 /// Returns whether or not `noSuchMethod` support has been enabled.
181 bool get enabledNoSuchMethod => false; 175 bool get enabledNoSuchMethod => false;
182 176
(...skipping 23 matching lines...) Expand all
206 // TODO(johnniwinther): Remove this when patching is only done by the 200 // TODO(johnniwinther): Remove this when patching is only done by the
207 // JavaScript backend. 201 // JavaScript backend.
208 Uri canonicalUri = library.canonicalUri; 202 Uri canonicalUri = library.canonicalUri;
209 if (canonicalUri == js_backend.BackendHelpers.DART_JS_HELPER || 203 if (canonicalUri == js_backend.BackendHelpers.DART_JS_HELPER ||
210 canonicalUri == js_backend.BackendHelpers.DART_INTERCEPTORS) { 204 canonicalUri == js_backend.BackendHelpers.DART_INTERCEPTORS) {
211 return true; 205 return true;
212 } 206 }
213 return false; 207 return false;
214 } 208 }
215 209
216 void registerStaticUse(Element element, {bool forResolution}) {} 210 void registerStaticUse(Enqueuer enqueuer, Element element) {}
217 211
218 /// This method is called immediately after the [LibraryElement] [library] has 212 /// This method is called immediately after the [LibraryElement] [library] has
219 /// been created. 213 /// been created.
220 void onLibraryCreated(LibraryElement library) {} 214 void onLibraryCreated(LibraryElement library) {}
221 215
222 /// This method is called immediately after the [library] and its parts have 216 /// This method is called immediately after the [library] and its parts have
223 /// been scanned. 217 /// been scanned.
224 Future onLibraryScanned(LibraryElement library, LibraryLoader loader) { 218 Future onLibraryScanned(LibraryElement library, LibraryLoader loader) {
225 // TODO(johnniwinther): Move this to [JavaScriptBackend]. 219 // TODO(johnniwinther): Move this to [JavaScriptBackend].
226 if (!compiler.serialization.isDeserialized(library)) { 220 if (!compiler.serialization.isDeserialized(library)) {
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 void registerInstantiatedType(InterfaceType type); 355 void registerInstantiatedType(InterfaceType type);
362 356
363 /// Resolves [typeName] to a type in the context of [node]. 357 /// Resolves [typeName] to a type in the context of [node].
364 DartType resolveTypeFromString(Node node, String typeName); 358 DartType resolveTypeFromString(Node node, String typeName);
365 } 359 }
366 360
367 /// Backend transformation methods for the world impacts. 361 /// Backend transformation methods for the world impacts.
368 class ImpactTransformer { 362 class ImpactTransformer {
369 /// Transform the [ResolutionImpact] into a [WorldImpact] adding the 363 /// Transform the [ResolutionImpact] into a [WorldImpact] adding the
370 /// backend dependencies for features used in [worldImpact]. 364 /// backend dependencies for features used in [worldImpact].
371 WorldImpact transformResolutionImpact(ResolutionImpact worldImpact) { 365 WorldImpact transformResolutionImpact(
366 ResolutionEnqueuer enqueuer, ResolutionImpact worldImpact) {
372 return worldImpact; 367 return worldImpact;
373 } 368 }
374 369
375 /// Transform the [CodegenImpact] into a [WorldImpact] adding the 370 /// Transform the [CodegenImpact] into a [WorldImpact] adding the
376 /// backend dependencies for features used in [worldImpact]. 371 /// backend dependencies for features used in [worldImpact].
377 WorldImpact transformCodegenImpact(CodegenImpact worldImpact) { 372 WorldImpact transformCodegenImpact(CodegenImpact worldImpact) {
378 return worldImpact; 373 return worldImpact;
379 } 374 }
380 } 375 }
381 376
(...skipping 21 matching lines...) Expand all
403 ClassElement get typeImplementation; 398 ClassElement get typeImplementation;
404 ClassElement get boolImplementation; 399 ClassElement get boolImplementation;
405 ClassElement get nullImplementation; 400 ClassElement get nullImplementation;
406 ClassElement get uint32Implementation; 401 ClassElement get uint32Implementation;
407 ClassElement get uint31Implementation; 402 ClassElement get uint31Implementation;
408 ClassElement get positiveIntImplementation; 403 ClassElement get positiveIntImplementation;
409 ClassElement get syncStarIterableImplementation; 404 ClassElement get syncStarIterableImplementation;
410 ClassElement get asyncFutureImplementation; 405 ClassElement get asyncFutureImplementation;
411 ClassElement get asyncStarStreamImplementation; 406 ClassElement get asyncStarStreamImplementation;
412 } 407 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/compiler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698