| 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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import '../closure.dart'; |
| 8 import '../common.dart'; |
| 9 import '../common_elements.dart'; |
| 7 import '../compiler.dart'; | 10 import '../compiler.dart'; |
| 8 import '../constants/values.dart'; | 11 import '../constants/values.dart'; |
| 9 import '../elements/entities.dart'; | 12 import '../elements/entities.dart'; |
| 13 import '../elements/types.dart'; |
| 14 import '../kernel/element_map.dart'; |
| 15 import '../js_model/locals.dart'; |
| 10 import '../types/types.dart'; | 16 import '../types/types.dart'; |
| 11 import '../world.dart'; | 17 import '../world.dart'; |
| 18 import 'builder_kernel.dart'; |
| 12 import 'inferrer_engine.dart'; | 19 import 'inferrer_engine.dart'; |
| 13 import 'type_graph_inferrer.dart'; | 20 import 'type_graph_inferrer.dart'; |
| 14 import 'type_graph_nodes.dart'; | 21 import 'type_graph_nodes.dart'; |
| 15 import 'type_system.dart'; | 22 import 'type_system.dart'; |
| 16 | 23 |
| 17 class KernelTypeGraphInferrer extends TypeGraphInferrer<ir.Node> { | 24 class KernelTypeGraphInferrer extends TypeGraphInferrer<ir.Node> { |
| 18 final Compiler _compiler; | 25 final Compiler _compiler; |
| 26 final KernelToElementMapForBuilding _elementMap; |
| 27 final GlobalLocalsMap _globalLocalsMap; |
| 28 final ClosureDataLookup<ir.Node> _closureDataLookup; |
| 19 | 29 |
| 20 KernelTypeGraphInferrer(this._compiler, ClosedWorld closedWorld, | 30 KernelTypeGraphInferrer( |
| 21 ClosedWorldRefiner closedWorldRefiner, {bool disableTypeInference: false}) | 31 this._compiler, |
| 32 this._elementMap, |
| 33 this._globalLocalsMap, |
| 34 this._closureDataLookup, |
| 35 ClosedWorld closedWorld, |
| 36 ClosedWorldRefiner closedWorldRefiner, |
| 37 {bool disableTypeInference: false}) |
| 22 : super(closedWorld, closedWorldRefiner, | 38 : super(closedWorld, closedWorldRefiner, |
| 23 disableTypeInference: disableTypeInference); | 39 disableTypeInference: disableTypeInference); |
| 24 | 40 |
| 25 @override | 41 @override |
| 26 InferrerEngine<ir.Node> createInferrerEngineFor(FunctionEntity main) { | 42 InferrerEngine<ir.Node> createInferrerEngineFor(FunctionEntity main) { |
| 27 return new KernelInferrerEngine( | 43 return new KernelInferrerEngine(_compiler, _elementMap, _globalLocalsMap, |
| 28 _compiler, closedWorld, closedWorldRefiner, main); | 44 _closureDataLookup, closedWorld, closedWorldRefiner, main); |
| 29 } | 45 } |
| 30 | 46 |
| 31 @override | 47 @override |
| 32 GlobalTypeInferenceResults createResults() { | 48 GlobalTypeInferenceResults createResults() { |
| 33 return new KernelGlobalTypeInferenceResults(this, closedWorld); | 49 return new KernelGlobalTypeInferenceResults(this, closedWorld); |
| 34 } | 50 } |
| 35 } | 51 } |
| 36 | 52 |
| 37 class KernelGlobalTypeInferenceResults | 53 class KernelGlobalTypeInferenceResults |
| 38 extends GlobalTypeInferenceResults<ir.Node> { | 54 extends GlobalTypeInferenceResults<ir.Node> { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 54 } | 70 } |
| 55 | 71 |
| 56 GlobalTypeInferenceParameterResult<ir.Node> createParameterResult( | 72 GlobalTypeInferenceParameterResult<ir.Node> createParameterResult( |
| 57 TypeGraphInferrer<ir.Node> inferrer, Local parameter) { | 73 TypeGraphInferrer<ir.Node> inferrer, Local parameter) { |
| 58 return new GlobalTypeInferenceParameterResultImpl<ir.Node>( | 74 return new GlobalTypeInferenceParameterResultImpl<ir.Node>( |
| 59 parameter, inferrer, dynamicType); | 75 parameter, inferrer, dynamicType); |
| 60 } | 76 } |
| 61 } | 77 } |
| 62 | 78 |
| 63 class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> { | 79 class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> { |
| 64 KernelInferrerEngine(Compiler compiler, ClosedWorld closedWorld, | 80 final KernelToElementMapForBuilding _elementMap; |
| 65 ClosedWorldRefiner closedWorldRefiner, FunctionEntity mainElement) | 81 final GlobalLocalsMap _globalLocalsMap; |
| 66 : super(compiler, closedWorld, closedWorldRefiner, mainElement, | 82 final ClosureDataLookup<ir.Node> _closureDataLookup; |
| 67 const KernelTypeSystemStrategy()); | 83 |
| 84 KernelInferrerEngine( |
| 85 Compiler compiler, |
| 86 this._elementMap, |
| 87 this._globalLocalsMap, |
| 88 this._closureDataLookup, |
| 89 ClosedWorld closedWorld, |
| 90 ClosedWorldRefiner closedWorldRefiner, |
| 91 FunctionEntity mainElement) |
| 92 : super( |
| 93 compiler, |
| 94 closedWorld, |
| 95 closedWorldRefiner, |
| 96 mainElement, |
| 97 new KernelTypeSystemStrategy( |
| 98 _elementMap, _globalLocalsMap, _closureDataLookup)); |
| 68 | 99 |
| 69 @override | 100 @override |
| 70 ConstantValue getFieldConstant(FieldEntity field) { | 101 ConstantValue getFieldConstant(FieldEntity field) { |
| 71 throw new UnimplementedError('KernelInferrerEngine.getFieldConstant'); | 102 throw new UnimplementedError('KernelInferrerEngine.getFieldConstant'); |
| 72 } | 103 } |
| 73 | 104 |
| 74 @override | 105 @override |
| 75 bool isFieldInitializerPotentiallyNull( | 106 bool isFieldInitializerPotentiallyNull( |
| 76 FieldEntity field, ir.Node initializer) { | 107 FieldEntity field, ir.Node initializer) { |
| 77 throw new UnimplementedError( | 108 throw new UnimplementedError( |
| 78 'KernelInferrerEngine.isFieldInitializerPotentiallyNull'); | 109 'KernelInferrerEngine.isFieldInitializerPotentiallyNull'); |
| 79 } | 110 } |
| 80 | 111 |
| 81 @override | 112 @override |
| 82 TypeInformation computeMemberTypeInformation( | 113 TypeInformation computeMemberTypeInformation( |
| 83 MemberEntity member, ir.Node body) { | 114 MemberEntity member, ir.Node body) { |
| 84 throw new UnimplementedError( | 115 KernelTypeGraphBuilder visitor = |
| 85 'KernelInferrerEngine.computeMemberTypeInformation'); | 116 new KernelTypeGraphBuilder(member, compiler, _elementMap, this); |
| 117 return visitor.run(); |
| 86 } | 118 } |
| 87 | 119 |
| 88 @override | 120 @override |
| 89 FunctionEntity lookupCallMethod(ClassEntity cls) { | 121 FunctionEntity lookupCallMethod(ClassEntity cls) { |
| 90 throw new UnimplementedError('KernelInferrerEngine.lookupCallMethod'); | 122 throw new UnimplementedError('KernelInferrerEngine.lookupCallMethod'); |
| 91 } | 123 } |
| 92 | 124 |
| 93 @override | 125 @override |
| 94 void forEachParameter(FunctionEntity method, void f(Local parameter)) { | 126 void forEachParameter(FunctionEntity method, void f(Local parameter)) { |
| 95 throw new UnimplementedError('KernelInferrerEngine.forEachParameter'); | 127 throw new UnimplementedError('KernelInferrerEngine.forEachParameter'); |
| 96 } | 128 } |
| 97 | 129 |
| 98 @override | 130 @override |
| 99 ir.Node computeMemberBody(MemberEntity member) { | 131 ir.Node computeMemberBody(MemberEntity member) { |
| 100 throw new UnimplementedError('KernelInferrerEngine.computeMemberBody'); | 132 MemberDefinition definition = _elementMap.getMemberDefinition(member); |
| 133 switch (definition.kind) { |
| 134 case MemberKind.regular: |
| 135 ir.Member node = definition.node; |
| 136 if (node is ir.Field) { |
| 137 return node.initializer; |
| 138 } else if (node is ir.Procedure) { |
| 139 return node.function; |
| 140 } |
| 141 break; |
| 142 case MemberKind.constructor: |
| 143 case MemberKind.constructorBody: |
| 144 ir.Member node = definition.node; |
| 145 if (node is ir.Constructor) { |
| 146 return node.function; |
| 147 } else if (node is ir.Procedure) { |
| 148 return node.function; |
| 149 } |
| 150 break; |
| 151 case MemberKind.closureCall: |
| 152 ir.Member node = definition.node; |
| 153 if (node is ir.FunctionDeclaration) { |
| 154 return node.function; |
| 155 } else if (node is ir.FunctionExpression) { |
| 156 return node.function; |
| 157 } |
| 158 break; |
| 159 case MemberKind.closureField: |
| 160 break; |
| 161 } |
| 162 failedAt(member, 'Unexpected member definition: $definition.'); |
| 163 return null; |
| 101 } | 164 } |
| 102 | 165 |
| 103 @override | 166 @override |
| 104 int computeMemberSize(MemberEntity member) { | 167 int computeMemberSize(MemberEntity member) { |
| 105 throw new UnimplementedError('KernelInferrerEngine.computeMemberSize'); | 168 // TODO(johnniwinther): Find an ordering that can be shared between the |
| 169 // front ends. |
| 170 return 0; |
| 106 } | 171 } |
| 107 | 172 |
| 108 @override | 173 @override |
| 109 GlobalTypeInferenceElementData<ir.Node> createElementData() { | 174 GlobalTypeInferenceElementData<ir.Node> createElementData() { |
| 110 throw new UnimplementedError('KernelInferrerEngine.createElementData'); | 175 throw new UnimplementedError('KernelInferrerEngine.createElementData'); |
| 111 } | 176 } |
| 112 } | 177 } |
| 113 | 178 |
| 114 class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> { | 179 class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> { |
| 115 const KernelTypeSystemStrategy(); | 180 KernelToElementMapForBuilding _elementMap; |
| 181 GlobalLocalsMap _globalLocalsMap; |
| 182 ClosureDataLookup<ir.Node> _closureDataLookup; |
| 183 |
| 184 KernelTypeSystemStrategy( |
| 185 this._elementMap, this._globalLocalsMap, this._closureDataLookup); |
| 186 |
| 187 ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment; |
| 116 | 188 |
| 117 @override | 189 @override |
| 118 bool checkClassEntity(ClassEntity cls) => true; | 190 bool checkClassEntity(ClassEntity cls) => true; |
| 119 | 191 |
| 120 @override | 192 @override |
| 121 bool checkMapNode(ir.Node node) => true; | 193 bool checkMapNode(ir.Node node) => true; |
| 122 | 194 |
| 123 @override | 195 @override |
| 124 bool checkListNode(ir.Node node) => true; | 196 bool checkListNode(ir.Node node) => true; |
| 125 | 197 |
| 126 @override | 198 @override |
| 127 bool checkLoopPhiNode(ir.Node node) => true; | 199 bool checkLoopPhiNode(ir.Node node) => true; |
| 128 | 200 |
| 129 @override | 201 @override |
| 130 bool checkPhiNode(ir.Node node) => true; | 202 bool checkPhiNode(ir.Node node) => true; |
| 131 | 203 |
| 132 @override | 204 @override |
| 133 void forEachParameter(FunctionEntity function, void f(Local parameter)) { | 205 void forEachParameter(FunctionEntity function, void f(Local parameter)) { |
| 134 throw new UnimplementedError('KernelTypeSystemStrategy.forEachParameter'); | 206 throw new UnimplementedError('KernelTypeSystemStrategy.forEachParameter'); |
| 135 } | 207 } |
| 136 | 208 |
| 137 @override | 209 @override |
| 138 ParameterTypeInformation createParameterTypeInformation( | 210 ParameterTypeInformation createParameterTypeInformation( |
| 139 Local parameter, TypeSystem<ir.Node> types) { | 211 Local parameter, TypeSystem<ir.Node> types) { |
| 140 throw new UnimplementedError( | 212 MemberEntity context = parameter.memberContext; |
| 141 'KernelTypeSystemStrategy.createParameterTypeInformation'); | 213 KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(context); |
| 214 ir.FunctionNode functionNode = |
| 215 localsMap.getFunctionNodeForParameter(parameter); |
| 216 DartType type = |
| 217 _elementMap.getDartType(localsMap.getParameterType(parameter)); |
| 218 MemberEntity member; |
| 219 bool isClosure = false; |
| 220 if (functionNode.parent is ir.Member) { |
| 221 member = _elementMap.getMember(functionNode.parent); |
| 222 } else if (functionNode.parent is ir.FunctionExpression || |
| 223 functionNode.parent is ir.FunctionDeclaration) { |
| 224 ClosureRepresentationInfo info = |
| 225 _closureDataLookup.getClosureInfo(functionNode.parent); |
| 226 member = info.callMethod; |
| 227 isClosure = true; |
| 228 } |
| 229 MemberTypeInformation memberTypeInformation = |
| 230 types.getInferredTypeOfMember(member); |
| 231 if (isClosure) { |
| 232 return new ParameterTypeInformation.localFunction( |
| 233 memberTypeInformation, parameter, type, member); |
| 234 } else if (member.isInstanceMember) { |
| 235 return new ParameterTypeInformation.instanceMember(memberTypeInformation, |
| 236 parameter, type, member, new ParameterAssignments()); |
| 237 } else { |
| 238 return new ParameterTypeInformation.static( |
| 239 memberTypeInformation, parameter, type, member); |
| 240 } |
| 142 } | 241 } |
| 143 | 242 |
| 144 @override | 243 @override |
| 145 MemberTypeInformation createMemberTypeInformation(MemberEntity member) { | 244 MemberTypeInformation createMemberTypeInformation(MemberEntity member) { |
| 146 throw new UnimplementedError( | 245 if (member.isField) { |
| 147 'KernelTypeSystemStrategy.createParameterTypeInformation'); | 246 FieldEntity field = member; |
| 247 DartType type = _elementEnvironment.getFieldType(field); |
| 248 return new FieldTypeInformation(field, type); |
| 249 } else if (member.isGetter) { |
| 250 FunctionEntity getter = member; |
| 251 DartType type = _elementEnvironment.getFunctionType(getter); |
| 252 return new GetterTypeInformation(getter, type); |
| 253 } else if (member.isSetter) { |
| 254 FunctionEntity setter = member; |
| 255 return new SetterTypeInformation(setter); |
| 256 } else if (member.isFunction) { |
| 257 FunctionEntity method = member; |
| 258 DartType type = _elementEnvironment.getFunctionType(method); |
| 259 return new MethodTypeInformation(method, type); |
| 260 } else { |
| 261 ConstructorEntity constructor = member; |
| 262 if (constructor.isFactoryConstructor) { |
| 263 DartType type = _elementEnvironment.getFunctionType(constructor); |
| 264 return new FactoryConstructorTypeInformation(constructor, type); |
| 265 } else { |
| 266 return new GenerativeConstructorTypeInformation(constructor); |
| 267 } |
| 268 } |
| 148 } | 269 } |
| 149 } | 270 } |
| OLD | NEW |