Chromium Code Reviews| 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.kernel.backend_strategy; | |
| 6 | |
| 7 import 'package:kernel/ast.dart' as ir; | |
| 8 | |
| 9 import '../backend_strategy.dart'; | |
| 10 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | |
| 11 import '../common/tasks.dart'; | |
| 12 import '../compiler.dart'; | |
| 13 import '../elements/entities.dart'; | |
| 14 import '../enqueue.dart'; | |
| 15 import '../io/source_information.dart'; | |
| 16 import '../js_backend/backend.dart'; | |
| 17 import '../js_backend/native_data.dart'; | |
| 18 import '../js_emitter/sorter.dart'; | |
| 19 import '../kernel/element_map.dart'; | |
| 20 import '../native/behavior.dart'; | |
| 21 import '../ssa/builder_kernel.dart'; | |
| 22 import '../ssa/nodes.dart'; | |
| 23 import '../ssa/ssa.dart'; | |
| 24 import '../ssa/types.dart'; | |
| 25 import '../types/types.dart'; | |
| 26 import '../universe/selector.dart'; | |
| 27 import '../universe/world_builder.dart'; | |
| 28 import '../universe/world_impact.dart'; | |
| 29 import '../world.dart'; | |
| 30 import 'kernel_strategy.dart'; | |
| 31 | |
| 32 /// Backend strategy that uses the kernel elements as the backend model. | |
| 33 // TODO(johnniwinther): Replace this with a strategy based on the J-element | |
| 34 // model. | |
| 35 class KernelBackendStrategy implements BackendStrategy { | |
| 36 final Compiler _compiler; | |
| 37 | |
| 38 KernelBackendStrategy(this._compiler); | |
| 39 | |
| 40 @override | |
| 41 ClosedWorldRefiner createClosedWorldRefiner(KernelClosedWorld closedWorld) { | |
| 42 return closedWorld; | |
| 43 } | |
| 44 | |
| 45 @override | |
| 46 Sorter get sorter => | |
| 47 throw new UnimplementedError('KernelBackendStrategy.sorter'); | |
| 48 | |
| 49 @override | |
| 50 void convertClosures(ClosedWorldRefiner closedWorldRefiner) { | |
| 51 // TODO(johnniwinther,efortuna): Compute closure classes for kernel based | |
| 52 // elements. | |
| 53 } | |
| 54 | |
| 55 @override | |
| 56 WorkItemBuilder createCodegenWorkItemBuilder(ClosedWorld closedWorld) { | |
| 57 return new KernelCodegenWorkItemBuilder(_compiler.backend, closedWorld); | |
| 58 } | |
| 59 | |
| 60 @override | |
| 61 CodegenWorldBuilder createCodegenWorldBuilder( | |
| 62 NativeBasicData nativeBasicData, | |
| 63 ClosedWorld closedWorld, | |
| 64 SelectorConstraintsStrategy selectorConstraintsStrategy) { | |
| 65 return new KernelCodegenWorldBuilder(_compiler.elementEnvironment, | |
| 66 nativeBasicData, closedWorld, selectorConstraintsStrategy); | |
| 67 } | |
| 68 | |
| 69 @override | |
| 70 SsaBuilderTask createSsaBuilderTask(JavaScriptBackend backend, | |
| 71 SourceInformationStrategy sourceInformationStrategy) { | |
| 72 return new KernelSsaBuilderTask(backend.compiler); | |
| 73 } | |
| 74 } | |
| 75 | |
| 76 class KernelCodegenWorkItemBuilder implements WorkItemBuilder { | |
| 77 final JavaScriptBackend _backend; | |
| 78 final ClosedWorld _closedWorld; | |
| 79 | |
| 80 KernelCodegenWorkItemBuilder(this._backend, this._closedWorld); | |
| 81 | |
| 82 @override | |
| 83 CodegenWorkItem createWorkItem(MemberEntity entity) { | |
| 84 return new KernelCodegenWorkItem(_backend, _closedWorld, entity); | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 class KernelCodegenWorkItem extends CodegenWorkItem { | |
| 89 final JavaScriptBackend _backend; | |
| 90 final ClosedWorld _closedWorld; | |
| 91 final MemberEntity element; | |
| 92 final CodegenRegistry registry; | |
| 93 | |
| 94 KernelCodegenWorkItem(this._backend, this._closedWorld, this.element) | |
| 95 : registry = new CodegenRegistry(element); | |
| 96 | |
| 97 @override | |
| 98 WorldImpact run() { | |
| 99 return _backend.codegen(this, _closedWorld); | |
| 100 } | |
| 101 } | |
| 102 | |
| 103 /// Task for building SSA from kernel IR loaded from .dill. | |
| 104 class KernelSsaBuilderTask extends CompilerTask implements SsaBuilderTask { | |
| 105 final Compiler _compiler; | |
| 106 | |
| 107 KernelSsaBuilderTask(this._compiler) : super(_compiler.measurer); | |
| 108 | |
| 109 KernelToElementMap get _elementMap { | |
| 110 KernelFrontEndStrategy frontEndStrategy = _compiler.frontEndStrategy; | |
| 111 return frontEndStrategy.elementMap; | |
| 112 } | |
| 113 | |
| 114 @override | |
| 115 HGraph build(CodegenWorkItem work, ClosedWorld closedWorld) { | |
| 116 KernelSsaBuilder builder = new KernelSsaBuilder( | |
| 117 work.element, | |
| 118 _compiler, | |
| 119 _elementMap, | |
| 120 new KernelToTypeInferenceMapImpl(closedWorld), | |
| 121 closedWorld, | |
| 122 work.registry, | |
| 123 const SourceInformationBuilder(), | |
| 124 null); | |
| 125 return builder.build(); | |
| 126 } | |
| 127 } | |
| 128 | |
| 129 class KernelToTypeInferenceMapImpl implements KernelToTypeInferenceMap { | |
| 130 final ClosedWorld _closedWorld; | |
| 131 | |
| 132 KernelToTypeInferenceMapImpl(this._closedWorld); | |
| 133 | |
| 134 @override | |
| 135 TypeMask typeFromNativeBehavior( | |
| 136 NativeBehavior nativeBehavior, ClosedWorld closedWorld) { | |
| 137 return TypeMaskFactory.fromNativeBehavior(nativeBehavior, closedWorld); | |
| 138 } | |
| 139 | |
| 140 @override | |
| 141 TypeMask selectorTypeOf(Selector selector, TypeMask mask) { | |
| 142 return _closedWorld.commonMasks.dynamicType; | |
|
Siggi Cherem (dart-lang)
2017/05/24 17:18:28
\o/
We should rename `dynamic` to `awesome`, then
Johnni Winther
2017/05/29 07:50:53
Acknowledged.
| |
| 143 } | |
| 144 | |
| 145 @override | |
| 146 TypeMask getInferredTypeOf(MemberEntity member) { | |
| 147 return _closedWorld.commonMasks.dynamicType; | |
| 148 } | |
| 149 | |
| 150 @override | |
| 151 TypeMask inferredIndexType(ir.ForInStatement forInStatement) { | |
| 152 return _closedWorld.commonMasks.dynamicType; | |
| 153 } | |
| 154 | |
| 155 @override | |
| 156 bool isJsIndexableIterator( | |
| 157 ir.ForInStatement forInStatement, ClosedWorld closedWorld) { | |
| 158 return false; | |
| 159 } | |
| 160 | |
| 161 @override | |
| 162 TypeMask typeOfIteratorMoveNext(ir.ForInStatement forInStatement) { | |
| 163 return _closedWorld.commonMasks.dynamicType; | |
| 164 } | |
| 165 | |
| 166 @override | |
| 167 TypeMask typeOfIteratorCurrent(ir.ForInStatement forInStatement) { | |
| 168 return _closedWorld.commonMasks.dynamicType; | |
| 169 } | |
| 170 | |
| 171 @override | |
| 172 TypeMask typeOfIterator(ir.ForInStatement forInStatement) { | |
| 173 return _closedWorld.commonMasks.dynamicType; | |
| 174 } | |
| 175 | |
| 176 @override | |
| 177 TypeMask typeOfListLiteral( | |
| 178 MemberEntity owner, ir.ListLiteral listLiteral, ClosedWorld closedWorld) { | |
| 179 return _closedWorld.commonMasks.dynamicType; | |
| 180 } | |
| 181 | |
| 182 @override | |
| 183 TypeMask typeOfSet(ir.PropertySet write, ClosedWorld closedWorld) { | |
| 184 return _closedWorld.commonMasks.dynamicType; | |
| 185 } | |
| 186 | |
| 187 @override | |
| 188 TypeMask typeOfGet(ir.PropertyGet read) { | |
| 189 return _closedWorld.commonMasks.dynamicType; | |
| 190 } | |
| 191 | |
| 192 @override | |
| 193 TypeMask typeOfInvocation( | |
| 194 ir.MethodInvocation invocation, ClosedWorld closedWorld) { | |
| 195 return _closedWorld.commonMasks.dynamicType; | |
| 196 } | |
| 197 | |
| 198 @override | |
| 199 TypeMask getReturnTypeOf(FunctionEntity function) { | |
| 200 return _closedWorld.commonMasks.dynamicType; | |
| 201 } | |
| 202 } | |
| OLD | NEW |