Index: pkg/compiler/lib/src/js_model/js_strategy.dart |
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2fcf86fee2305487832e7a2d4c8395c0ae9a3758 |
--- /dev/null |
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart |
@@ -0,0 +1,133 @@ |
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library dart2js.js_model.strategy; |
+ |
+import '../backend_strategy.dart'; |
+import '../common_elements.dart'; |
+import '../compiler.dart'; |
+import '../elements/entities.dart'; |
+import '../enqueue.dart'; |
+import '../io/source_information.dart'; |
+import '../js_emitter/sorter.dart'; |
+import '../js/js_source_mapping.dart'; |
+import '../js_backend/backend.dart'; |
+import '../js_backend/backend_usage.dart'; |
+import '../js_backend/constant_system_javascript.dart'; |
+import '../js_backend/interceptor_data.dart'; |
+import '../js_backend/native_data.dart'; |
+import '../kernel/kernel_backend_strategy.dart'; |
+import '../ssa/ssa.dart'; |
+import '../universe/class_set.dart'; |
+import '../universe/world_builder.dart'; |
+import '../world.dart'; |
+import 'elements.dart'; |
+ |
+class JsBackendStrategy implements BackendStrategy { |
+ final Compiler _compiler; |
+ final JsToFrontendMap _map = new JsToFrontendMap(); |
+ |
+ JsBackendStrategy(this._compiler); |
+ |
+ @override |
+ ClosedWorldRefiner createClosedWorldRefiner(ClosedWorld closedWorld) { |
+ CommonElements commonElements = |
+ new JsCommonElements(_map, closedWorld.commonElements); |
+ BackendUsage backendUsage = |
+ new JsBackendUsage(_map, closedWorld.backendUsage); |
+ NativeData nativeData = new JsNativeData(_map, closedWorld.nativeData); |
+ InterceptorData interceptorData = new InterceptorDataImpl( |
+ nativeData, |
+ commonElements, |
+ // TODO(johnniwinther): Convert these. |
+ const {}, |
+ new Set(), |
+ new Set()); |
+ |
+ Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes = |
+ <ClassEntity, ClassHierarchyNode>{}; |
+ Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{}; |
+ Set<ClassEntity> implementedClasses = new Set<ClassEntity>(); |
+ |
+ ClassHierarchyNode convertClassHierarchyNode(ClassHierarchyNode node) { |
+ ClassEntity cls = _map.toBackendClass(node.cls); |
+ if (closedWorld.isImplemented(node.cls)) { |
+ implementedClasses.add(cls); |
+ } |
+ ClassHierarchyNode newNode = classHierarchyNodes.putIfAbsent(cls, () { |
+ ClassHierarchyNode parentNode; |
+ if (node.parentNode != null) { |
+ parentNode = convertClassHierarchyNode(node.parentNode); |
+ } |
+ return new ClassHierarchyNode(parentNode, cls, node.hierarchyDepth); |
+ }); |
+ newNode.isAbstractlyInstantiated = node.isAbstractlyInstantiated; |
+ newNode.isDirectlyInstantiated = node.isDirectlyInstantiated; |
+ return newNode; |
+ } |
+ |
+ ClassSet convertClassSet(ClassSet classSet) { |
+ ClassEntity cls = _map.toBackendClass(classSet.cls); |
+ return classSets.putIfAbsent(cls, () { |
+ ClassHierarchyNode newNode = convertClassHierarchyNode(classSet.node); |
+ ClassSet newClassSet = new ClassSet(newNode); |
+ for (ClassHierarchyNode subtype in classSet.subtypeNodes) { |
+ ClassHierarchyNode newSubtype = convertClassHierarchyNode(subtype); |
+ newClassSet.addSubtype(newSubtype); |
+ } |
+ return newClassSet; |
+ }); |
+ } |
+ |
+ closedWorld |
+ .getClassHierarchyNode(closedWorld.commonElements.objectClass) |
+ .forEachSubclass((ClassEntity cls) { |
+ convertClassSet(closedWorld.getClassSet(cls)); |
+ }, ClassHierarchyNode.ALL); |
+ |
+ return new JsClosedWorld( |
+ commonElements: commonElements, |
+ constantSystem: const JavaScriptConstantSystem(), |
+ backendUsage: backendUsage, |
+ nativeData: nativeData, |
+ interceptorData: interceptorData, |
+ classHierarchyNodes: classHierarchyNodes, |
+ classSets: classSets, |
+ implementedClasses: implementedClasses, |
+ // TODO(johnniwinther): Support this. |
+ allTypedefs: const []); |
+ } |
+ |
+ @override |
+ Sorter get sorter { |
+ throw new UnimplementedError('JsBackendStrategy.sorter'); |
+ } |
+ |
+ @override |
+ void convertClosures(ClosedWorldRefiner closedWorldRefiner) {} |
+ |
+ @override |
+ SourceInformationStrategy get sourceInformationStrategy => |
+ const JavaScriptSourceInformationStrategy(); |
+ |
+ @override |
+ SsaBuilderTask createSsaBuilderTask(JavaScriptBackend backend, |
+ SourceInformationStrategy sourceInformationStrategy) { |
+ return new KernelSsaBuilderTask(backend.compiler); |
+ } |
+ |
+ @override |
+ WorkItemBuilder createCodegenWorkItemBuilder(ClosedWorld closedWorld) { |
+ return new KernelCodegenWorkItemBuilder(_compiler.backend, closedWorld); |
+ } |
+ |
+ @override |
+ CodegenWorldBuilder createCodegenWorldBuilder( |
+ NativeBasicData nativeBasicData, |
+ ClosedWorld closedWorld, |
+ SelectorConstraintsStrategy selectorConstraintsStrategy) { |
+ return new KernelCodegenWorldBuilder(_compiler.elementEnvironment, |
+ nativeBasicData, closedWorld, selectorConstraintsStrategy); |
+ } |
+} |