OLD | NEW |
(Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 library dart2js.js_model.strategy; |
| 6 |
| 7 import '../backend_strategy.dart'; |
| 8 import '../common_elements.dart'; |
| 9 import '../compiler.dart'; |
| 10 import '../elements/entities.dart'; |
| 11 import '../enqueue.dart'; |
| 12 import '../io/source_information.dart'; |
| 13 import '../js_emitter/sorter.dart'; |
| 14 import '../js/js_source_mapping.dart'; |
| 15 import '../js_backend/backend.dart'; |
| 16 import '../js_backend/backend_usage.dart'; |
| 17 import '../js_backend/constant_system_javascript.dart'; |
| 18 import '../js_backend/interceptor_data.dart'; |
| 19 import '../js_backend/native_data.dart'; |
| 20 import '../kernel/kernel_backend_strategy.dart'; |
| 21 import '../ssa/ssa.dart'; |
| 22 import '../universe/class_set.dart'; |
| 23 import '../universe/world_builder.dart'; |
| 24 import '../world.dart'; |
| 25 import 'elements.dart'; |
| 26 |
| 27 class JsBackendStrategy implements BackendStrategy { |
| 28 final Compiler _compiler; |
| 29 final JsToFrontendMap _map = new JsToFrontendMap(); |
| 30 |
| 31 JsBackendStrategy(this._compiler); |
| 32 |
| 33 @override |
| 34 ClosedWorldRefiner createClosedWorldRefiner(ClosedWorld closedWorld) { |
| 35 CommonElements commonElements = |
| 36 new JsCommonElements(_map, closedWorld.commonElements); |
| 37 BackendUsage backendUsage = |
| 38 new JsBackendUsage(_map, closedWorld.backendUsage); |
| 39 NativeData nativeData = new JsNativeData(_map, closedWorld.nativeData); |
| 40 InterceptorData interceptorData = new InterceptorDataImpl( |
| 41 nativeData, |
| 42 commonElements, |
| 43 // TODO(johnniwinther): Convert these. |
| 44 const {}, |
| 45 new Set(), |
| 46 new Set()); |
| 47 |
| 48 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes = |
| 49 <ClassEntity, ClassHierarchyNode>{}; |
| 50 Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{}; |
| 51 Set<ClassEntity> implementedClasses = new Set<ClassEntity>(); |
| 52 |
| 53 ClassHierarchyNode convertClassHierarchyNode(ClassHierarchyNode node) { |
| 54 ClassEntity cls = _map.toBackendClass(node.cls); |
| 55 if (closedWorld.isImplemented(node.cls)) { |
| 56 implementedClasses.add(cls); |
| 57 } |
| 58 ClassHierarchyNode newNode = classHierarchyNodes.putIfAbsent(cls, () { |
| 59 ClassHierarchyNode parentNode; |
| 60 if (node.parentNode != null) { |
| 61 parentNode = convertClassHierarchyNode(node.parentNode); |
| 62 } |
| 63 return new ClassHierarchyNode(parentNode, cls, node.hierarchyDepth); |
| 64 }); |
| 65 newNode.isAbstractlyInstantiated = node.isAbstractlyInstantiated; |
| 66 newNode.isDirectlyInstantiated = node.isDirectlyInstantiated; |
| 67 return newNode; |
| 68 } |
| 69 |
| 70 ClassSet convertClassSet(ClassSet classSet) { |
| 71 ClassEntity cls = _map.toBackendClass(classSet.cls); |
| 72 return classSets.putIfAbsent(cls, () { |
| 73 ClassHierarchyNode newNode = convertClassHierarchyNode(classSet.node); |
| 74 ClassSet newClassSet = new ClassSet(newNode); |
| 75 for (ClassHierarchyNode subtype in classSet.subtypeNodes) { |
| 76 ClassHierarchyNode newSubtype = convertClassHierarchyNode(subtype); |
| 77 newClassSet.addSubtype(newSubtype); |
| 78 } |
| 79 return newClassSet; |
| 80 }); |
| 81 } |
| 82 |
| 83 closedWorld |
| 84 .getClassHierarchyNode(closedWorld.commonElements.objectClass) |
| 85 .forEachSubclass((ClassEntity cls) { |
| 86 convertClassSet(closedWorld.getClassSet(cls)); |
| 87 }, ClassHierarchyNode.ALL); |
| 88 |
| 89 return new JsClosedWorld( |
| 90 commonElements: commonElements, |
| 91 constantSystem: const JavaScriptConstantSystem(), |
| 92 backendUsage: backendUsage, |
| 93 nativeData: nativeData, |
| 94 interceptorData: interceptorData, |
| 95 classHierarchyNodes: classHierarchyNodes, |
| 96 classSets: classSets, |
| 97 implementedClasses: implementedClasses, |
| 98 // TODO(johnniwinther): Support this. |
| 99 allTypedefs: const []); |
| 100 } |
| 101 |
| 102 @override |
| 103 Sorter get sorter { |
| 104 throw new UnimplementedError('JsBackendStrategy.sorter'); |
| 105 } |
| 106 |
| 107 @override |
| 108 void convertClosures(ClosedWorldRefiner closedWorldRefiner) {} |
| 109 |
| 110 @override |
| 111 SourceInformationStrategy get sourceInformationStrategy => |
| 112 const JavaScriptSourceInformationStrategy(); |
| 113 |
| 114 @override |
| 115 SsaBuilderTask createSsaBuilderTask(JavaScriptBackend backend, |
| 116 SourceInformationStrategy sourceInformationStrategy) { |
| 117 return new KernelSsaBuilderTask(backend.compiler); |
| 118 } |
| 119 |
| 120 @override |
| 121 WorkItemBuilder createCodegenWorkItemBuilder(ClosedWorld closedWorld) { |
| 122 return new KernelCodegenWorkItemBuilder(_compiler.backend, closedWorld); |
| 123 } |
| 124 |
| 125 @override |
| 126 CodegenWorldBuilder createCodegenWorldBuilder( |
| 127 NativeBasicData nativeBasicData, |
| 128 ClosedWorld closedWorld, |
| 129 SelectorConstraintsStrategy selectorConstraintsStrategy) { |
| 130 return new KernelCodegenWorldBuilder(_compiler.elementEnvironment, |
| 131 nativeBasicData, closedWorld, selectorConstraintsStrategy); |
| 132 } |
| 133 } |
OLD | NEW |