| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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.kernel.frontend_strategy; | 5 library dart2js.kernel.frontend_strategy; |
| 6 | 6 |
| 7 import '../closure.dart'; | 7 import '../closure.dart'; |
| 8 import '../backend_strategy.dart'; | |
| 9 import '../common.dart'; | 8 import '../common.dart'; |
| 10 import '../common_elements.dart'; | 9 import '../common_elements.dart'; |
| 11 import '../common/backend_api.dart'; | 10 import '../common/backend_api.dart'; |
| 12 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | |
| 13 import '../common/resolution.dart'; | 11 import '../common/resolution.dart'; |
| 14 import '../common/tasks.dart'; | 12 import '../common/tasks.dart'; |
| 15 import '../common/work.dart'; | 13 import '../common/work.dart'; |
| 16 import '../compiler.dart'; | |
| 17 import '../elements/elements.dart'; | 14 import '../elements/elements.dart'; |
| 18 import '../elements/entities.dart'; | 15 import '../elements/entities.dart'; |
| 19 import '../elements/types.dart'; | 16 import '../elements/types.dart'; |
| 20 import '../environment.dart' as env; | 17 import '../environment.dart' as env; |
| 21 import '../enqueue.dart'; | 18 import '../enqueue.dart'; |
| 22 import '../frontend_strategy.dart'; | 19 import '../frontend_strategy.dart'; |
| 23 import '../io/source_information.dart'; | |
| 24 import '../js_backend/backend.dart'; | 20 import '../js_backend/backend.dart'; |
| 25 import '../js_backend/backend_usage.dart'; | 21 import '../js_backend/backend_usage.dart'; |
| 26 import '../js_backend/custom_elements_analysis.dart'; | 22 import '../js_backend/custom_elements_analysis.dart'; |
| 27 import '../js_backend/interceptor_data.dart'; | 23 import '../js_backend/interceptor_data.dart'; |
| 28 import '../js_backend/mirrors_analysis.dart'; | 24 import '../js_backend/mirrors_analysis.dart'; |
| 29 import '../js_backend/mirrors_data.dart'; | 25 import '../js_backend/mirrors_data.dart'; |
| 30 import '../js_backend/native_data.dart'; | 26 import '../js_backend/native_data.dart'; |
| 31 import '../js_backend/no_such_method_registry.dart'; | 27 import '../js_backend/no_such_method_registry.dart'; |
| 32 import '../js_backend/runtime_types.dart'; | 28 import '../js_backend/runtime_types.dart'; |
| 33 import '../js_emitter/sorter.dart'; | |
| 34 import '../kernel/element_map.dart'; | |
| 35 import '../library_loader.dart'; | 29 import '../library_loader.dart'; |
| 36 import '../native/resolver.dart'; | 30 import '../native/resolver.dart'; |
| 37 import '../serialization/task.dart'; | 31 import '../serialization/task.dart'; |
| 38 import '../ssa/builder_kernel.dart'; | |
| 39 import '../ssa/nodes.dart'; | |
| 40 import '../ssa/ssa.dart'; | |
| 41 import '../patch_parser.dart'; | 32 import '../patch_parser.dart'; |
| 42 import '../resolved_uri_translator.dart'; | 33 import '../resolved_uri_translator.dart'; |
| 43 import '../universe/world_builder.dart'; | 34 import '../universe/world_builder.dart'; |
| 44 import '../universe/world_impact.dart'; | 35 import '../universe/world_impact.dart'; |
| 45 import '../world.dart'; | 36 import '../world.dart'; |
| 46 import 'element_map_impl.dart'; | 37 import 'element_map_impl.dart'; |
| 47 | 38 |
| 48 /// Front end strategy that loads '.dill' files and builds a resolved element | 39 /// Front end strategy that loads '.dill' files and builds a resolved element |
| 49 /// model from kernel IR nodes. | 40 /// model from kernel IR nodes. |
| 50 class KernelFrontEndStrategy implements FrontEndStrategy { | 41 class KernelFrontEndStrategy implements FrontEndStrategy { |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 @override | 229 @override |
| 239 MirrorsCodegenAnalysis close() { | 230 MirrorsCodegenAnalysis close() { |
| 240 // TODO(johnniwinther): Implement this. | 231 // TODO(johnniwinther): Implement this. |
| 241 return new MirrorsCodegenAnalysisImpl(); | 232 return new MirrorsCodegenAnalysisImpl(); |
| 242 } | 233 } |
| 243 | 234 |
| 244 @override | 235 @override |
| 245 void onResolutionComplete() {} | 236 void onResolutionComplete() {} |
| 246 } | 237 } |
| 247 | 238 |
| 248 /// Backend strategy that uses the kernel elements as the backend model. | |
| 249 // TODO(johnniwinther): Replace this with a strategy based on the J-element | |
| 250 // model. | |
| 251 class KernelBackendStrategy implements BackendStrategy { | |
| 252 final Compiler _compiler; | |
| 253 | |
| 254 KernelBackendStrategy(this._compiler); | |
| 255 | |
| 256 @override | |
| 257 ClosedWorldRefiner createClosedWorldRefiner(KernelClosedWorld closedWorld) { | |
| 258 return closedWorld; | |
| 259 } | |
| 260 | |
| 261 @override | |
| 262 Sorter get sorter => | |
| 263 throw new UnimplementedError('KernelBackendStrategy.sorter'); | |
| 264 | |
| 265 @override | |
| 266 void convertClosures(ClosedWorldRefiner closedWorldRefiner) { | |
| 267 // TODO(johnniwinther,efortuna): Compute closure classes for kernel based | |
| 268 // elements. | |
| 269 } | |
| 270 | |
| 271 @override | |
| 272 WorkItemBuilder createCodegenWorkItemBuilder(ClosedWorld closedWorld) { | |
| 273 return new KernelCodegenWorkItemBuilder(_compiler.backend, closedWorld); | |
| 274 } | |
| 275 | |
| 276 @override | |
| 277 CodegenWorldBuilder createCodegenWorldBuilder( | |
| 278 NativeBasicData nativeBasicData, | |
| 279 ClosedWorld closedWorld, | |
| 280 SelectorConstraintsStrategy selectorConstraintsStrategy) { | |
| 281 return new KernelCodegenWorldBuilder(_compiler.elementEnvironment, | |
| 282 nativeBasicData, closedWorld, selectorConstraintsStrategy); | |
| 283 } | |
| 284 | |
| 285 @override | |
| 286 SsaBuilderTask createSsaBuilderTask(JavaScriptBackend backend, | |
| 287 SourceInformationStrategy sourceInformationStrategy) { | |
| 288 return new KernelSsaBuilderTask(backend.compiler); | |
| 289 } | |
| 290 } | |
| 291 | |
| 292 class MirrorsCodegenAnalysisImpl implements MirrorsCodegenAnalysis { | 239 class MirrorsCodegenAnalysisImpl implements MirrorsCodegenAnalysis { |
| 293 @override | 240 @override |
| 294 int get preMirrorsMethodCount { | 241 int get preMirrorsMethodCount { |
| 295 throw new UnimplementedError( | 242 throw new UnimplementedError( |
| 296 'MirrorsCodegenAnalysisImpl.preMirrorsMethodCount'); | 243 'MirrorsCodegenAnalysisImpl.preMirrorsMethodCount'); |
| 297 } | 244 } |
| 298 | 245 |
| 299 @override | 246 @override |
| 300 void onQueueEmpty(Enqueuer enqueuer, Iterable<ClassEntity> recentClasses) { | 247 void onQueueEmpty(Enqueuer enqueuer, Iterable<ClassEntity> recentClasses) { |
| 301 throw new UnimplementedError('MirrorsCodegenAnalysisImpl.onQueueEmpty'); | 248 throw new UnimplementedError('MirrorsCodegenAnalysisImpl.onQueueEmpty'); |
| 302 } | 249 } |
| 303 } | 250 } |
| 304 | |
| 305 class KernelCodegenWorkItemBuilder implements WorkItemBuilder { | |
| 306 final JavaScriptBackend _backend; | |
| 307 final ClosedWorld _closedWorld; | |
| 308 | |
| 309 KernelCodegenWorkItemBuilder(this._backend, this._closedWorld); | |
| 310 | |
| 311 @override | |
| 312 CodegenWorkItem createWorkItem(MemberEntity entity) { | |
| 313 return new KernelCodegenWorkItem(_backend, _closedWorld, entity); | |
| 314 } | |
| 315 } | |
| 316 | |
| 317 class KernelCodegenWorkItem extends CodegenWorkItem { | |
| 318 final JavaScriptBackend _backend; | |
| 319 final ClosedWorld _closedWorld; | |
| 320 final MemberEntity element; | |
| 321 final CodegenRegistry registry; | |
| 322 | |
| 323 KernelCodegenWorkItem(this._backend, this._closedWorld, this.element) | |
| 324 : registry = new CodegenRegistry(element); | |
| 325 | |
| 326 @override | |
| 327 WorldImpact run() { | |
| 328 return _backend.codegen(this, _closedWorld); | |
| 329 } | |
| 330 } | |
| 331 | |
| 332 /// Task for building SSA from kernel IR loaded from .dill. | |
| 333 class KernelSsaBuilderTask extends CompilerTask implements SsaBuilderTask { | |
| 334 final Compiler _compiler; | |
| 335 | |
| 336 KernelSsaBuilderTask(this._compiler) : super(_compiler.measurer); | |
| 337 | |
| 338 KernelToElementMap get _elementMap { | |
| 339 KernelFrontEndStrategy frontEndStrategy = _compiler.frontEndStrategy; | |
| 340 return frontEndStrategy.elementMap; | |
| 341 } | |
| 342 | |
| 343 @override | |
| 344 HGraph build(CodegenWorkItem work, ClosedWorld closedWorld) { | |
| 345 KernelSsaBuilder builder = new KernelSsaBuilder( | |
| 346 work.element, | |
| 347 _compiler, | |
| 348 _elementMap, | |
| 349 closedWorld, | |
| 350 work.registry, | |
| 351 const SourceInformationBuilder(), | |
| 352 null); | |
| 353 return builder.build(); | |
| 354 } | |
| 355 } | |
| OLD | NEW |