| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 '../common/codegen.dart' show CodegenRegistry; | 5 import '../common/codegen.dart' show CodegenRegistry; |
| 6 import '../compiler.dart'; | 6 import '../compiler.dart'; |
| 7 import '../elements/elements.dart'; | 7 import '../elements/elements.dart'; |
| 8 import '../elements/entities.dart' show Entity, Local; | 8 import '../elements/entities.dart' show Entity, Local; |
| 9 import '../elements/resolution_types.dart'; | 9 import '../elements/resolution_types.dart'; |
| 10 import '../js_backend/js_backend.dart'; | 10 import '../js_backend/js_backend.dart'; |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 HSubGraphBlockInformation wrapStatementGraph(SubGraph statements) { | 182 HSubGraphBlockInformation wrapStatementGraph(SubGraph statements) { |
| 183 if (statements == null) return null; | 183 if (statements == null) return null; |
| 184 return new HSubGraphBlockInformation(statements); | 184 return new HSubGraphBlockInformation(statements); |
| 185 } | 185 } |
| 186 | 186 |
| 187 HSubExpressionBlockInformation wrapExpressionGraph(SubExpression expression) { | 187 HSubExpressionBlockInformation wrapExpressionGraph(SubExpression expression) { |
| 188 if (expression == null) return null; | 188 if (expression == null) return null; |
| 189 return new HSubExpressionBlockInformation(expression); | 189 return new HSubExpressionBlockInformation(expression); |
| 190 } | 190 } |
| 191 | 191 |
| 192 HInstruction buildFunctionType(ResolutionFunctionType type) { | |
| 193 type.accept(new ReifiedTypeRepresentationBuilder(closedWorld), this); | |
| 194 return pop(); | |
| 195 } | |
| 196 | |
| 197 HInstruction buildFunctionTypeConversion( | |
| 198 HInstruction original, ResolutionDartType type, int kind); | |
| 199 | |
| 200 /// Returns the current source element. | 192 /// Returns the current source element. |
| 201 /// | 193 /// |
| 202 /// The returned element is a declaration element. | 194 /// The returned element is a declaration element. |
| 203 Element get sourceElement; | 195 Element get sourceElement; |
| 204 | 196 |
| 205 // TODO(karlklose): this is needed to avoid a bug where the resolved type is | 197 // TODO(karlklose): this is needed to avoid a bug where the resolved type is |
| 206 // not stored on a type annotation in the closure translator. Remove when | 198 // not stored on a type annotation in the closure translator. Remove when |
| 207 // fixed. | 199 // fixed. |
| 208 bool hasDirectLocal(Local local) { | 200 bool hasDirectLocal(Local local) { |
| 209 return !localsHandler.isAccessedDirectly(local) || | 201 return !localsHandler.isAccessedDirectly(local) || |
| (...skipping 25 matching lines...) Expand all Loading... |
| 235 open(newBlock); | 227 open(newBlock); |
| 236 } | 228 } |
| 237 | 229 |
| 238 HInstruction callSetRuntimeTypeInfo( | 230 HInstruction callSetRuntimeTypeInfo( |
| 239 HInstruction typeInfo, HInstruction newObject); | 231 HInstruction typeInfo, HInstruction newObject); |
| 240 | 232 |
| 241 /// The element for which this SSA builder is being used. | 233 /// The element for which this SSA builder is being used. |
| 242 Element get targetElement; | 234 Element get targetElement; |
| 243 TypeBuilder get typeBuilder; | 235 TypeBuilder get typeBuilder; |
| 244 } | 236 } |
| 245 | |
| 246 class ReifiedTypeRepresentationBuilder | |
| 247 implements DartTypeVisitor<dynamic, GraphBuilder> { | |
| 248 final ClosedWorld closedWorld; | |
| 249 | |
| 250 ReifiedTypeRepresentationBuilder(this.closedWorld); | |
| 251 | |
| 252 void visit(ResolutionDartType type, GraphBuilder builder) => | |
| 253 type.accept(this, builder); | |
| 254 | |
| 255 void visitVoidType(ResolutionVoidType type, GraphBuilder builder) { | |
| 256 ClassElement cls = builder.backend.helpers.VoidRuntimeType; | |
| 257 builder.push(new HVoidType(type, new TypeMask.exact(cls, closedWorld))); | |
| 258 } | |
| 259 | |
| 260 void visitTypeVariableType( | |
| 261 ResolutionTypeVariableType type, GraphBuilder builder) { | |
| 262 ClassElement cls = builder.backend.helpers.RuntimeType; | |
| 263 TypeMask instructionType = new TypeMask.subclass(cls, closedWorld); | |
| 264 | |
| 265 // TODO(floitsch): this hack maps type variables of generic function | |
| 266 // typedefs to dynamic. For example: `typedef F = Function<T>(T)`. | |
| 267 if (type is MethodTypeVariableType) { | |
| 268 visitDynamicType(const ResolutionDynamicType(), builder); | |
| 269 return; | |
| 270 } | |
| 271 | |
| 272 if (!builder.sourceElement.enclosingElement.isClosure && | |
| 273 builder.sourceElement.isInstanceMember) { | |
| 274 HInstruction receiver = builder.localsHandler.readThis(); | |
| 275 builder.push(new HReadTypeVariable(type, receiver, instructionType)); | |
| 276 } else { | |
| 277 builder.push(new HReadTypeVariable.noReceiver( | |
| 278 type, | |
| 279 builder.typeBuilder | |
| 280 .addTypeVariableReference(type, builder.sourceElement), | |
| 281 instructionType)); | |
| 282 } | |
| 283 } | |
| 284 | |
| 285 void visitFunctionType(ResolutionFunctionType type, GraphBuilder builder) { | |
| 286 type.returnType.accept(this, builder); | |
| 287 HInstruction returnType = builder.pop(); | |
| 288 List<HInstruction> inputs = <HInstruction>[returnType]; | |
| 289 | |
| 290 for (ResolutionDartType parameter in type.parameterTypes) { | |
| 291 parameter.accept(this, builder); | |
| 292 inputs.add(builder.pop()); | |
| 293 } | |
| 294 | |
| 295 for (ResolutionDartType parameter in type.optionalParameterTypes) { | |
| 296 parameter.accept(this, builder); | |
| 297 inputs.add(builder.pop()); | |
| 298 } | |
| 299 | |
| 300 List<ResolutionDartType> namedParameterTypes = type.namedParameterTypes; | |
| 301 List<String> names = type.namedParameters; | |
| 302 for (int index = 0; index < names.length; index++) { | |
| 303 ast.DartString dartString = new ast.DartString.literal(names[index]); | |
| 304 inputs.add( | |
| 305 builder.graph.addConstantString(dartString, builder.closedWorld)); | |
| 306 namedParameterTypes[index].accept(this, builder); | |
| 307 inputs.add(builder.pop()); | |
| 308 } | |
| 309 | |
| 310 ClassElement cls = builder.backend.helpers.RuntimeFunctionType; | |
| 311 builder.push( | |
| 312 new HFunctionType(inputs, type, new TypeMask.exact(cls, closedWorld))); | |
| 313 } | |
| 314 | |
| 315 void visitMalformedType(MalformedType type, GraphBuilder builder) { | |
| 316 visitDynamicType(const ResolutionDynamicType(), builder); | |
| 317 } | |
| 318 | |
| 319 void visitInterfaceType(ResolutionInterfaceType type, GraphBuilder builder) { | |
| 320 List<HInstruction> inputs = <HInstruction>[]; | |
| 321 for (ResolutionDartType typeArgument in type.typeArguments) { | |
| 322 typeArgument.accept(this, builder); | |
| 323 inputs.add(builder.pop()); | |
| 324 } | |
| 325 ClassElement cls; | |
| 326 if (type.typeArguments.isEmpty) { | |
| 327 cls = builder.backend.helpers.RuntimeTypePlain; | |
| 328 } else { | |
| 329 cls = builder.backend.helpers.RuntimeTypeGeneric; | |
| 330 } | |
| 331 builder.push( | |
| 332 new HInterfaceType(inputs, type, new TypeMask.exact(cls, closedWorld))); | |
| 333 } | |
| 334 | |
| 335 void visitTypedefType(ResolutionTypedefType type, GraphBuilder builder) { | |
| 336 ResolutionDartType unaliased = type.unaliased; | |
| 337 if (unaliased is ResolutionTypedefType) throw 'unable to unalias $type'; | |
| 338 unaliased.accept(this, builder); | |
| 339 } | |
| 340 | |
| 341 void visitDynamicType(ResolutionDynamicType type, GraphBuilder builder) { | |
| 342 JavaScriptBackend backend = builder.compiler.backend; | |
| 343 ClassElement cls = backend.helpers.DynamicRuntimeType; | |
| 344 builder.push(new HDynamicType(type, new TypeMask.exact(cls, closedWorld))); | |
| 345 } | |
| 346 } | |
| OLD | NEW |