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 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import '../closure.dart'; | 7 import '../closure.dart'; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/codegen.dart' show CodegenRegistry; | 9 import '../common/codegen.dart' show CodegenRegistry; |
10 import '../common/names.dart'; | 10 import '../common/names.dart'; |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 ClassEntity cls = _elementMap.getClass(constructedClass); | 285 ClassEntity cls = _elementMap.getClass(constructedClass); |
286 InterfaceType thisType = _elementMap.elementEnvironment.getThisType(cls); | 286 InterfaceType thisType = _elementMap.elementEnvironment.getThisType(cls); |
287 _worldBuilder.forEachInstanceField(cls, | 287 _worldBuilder.forEachInstanceField(cls, |
288 (ClassEntity enclosingClass, FieldEntity member) { | 288 (ClassEntity enclosingClass, FieldEntity member) { |
289 var value = fieldValues[member]; | 289 var value = fieldValues[member]; |
290 assert(value != null, 'No value for field ${member}'); | 290 assert(value != null, 'No value for field ${member}'); |
291 constructorArguments.add(value); | 291 constructorArguments.add(value); |
292 }); | 292 }); |
293 | 293 |
294 // Create the runtime type information, if needed. | 294 // Create the runtime type information, if needed. |
295 bool hasRtiInput = backend.rtiNeed.classNeedsRtiField(cls); | 295 bool hasRtiInput = closedWorld.rtiNeed.classNeedsRtiField(cls); |
296 if (hasRtiInput) { | 296 if (hasRtiInput) { |
297 // Read the values of the type arguments and create a HTypeInfoExpression | 297 // Read the values of the type arguments and create a HTypeInfoExpression |
298 // to set on the newly create object. | 298 // to set on the newly create object. |
299 List<HInstruction> typeArguments = <HInstruction>[]; | 299 List<HInstruction> typeArguments = <HInstruction>[]; |
300 for (ir.DartType typeParameter | 300 for (ir.DartType typeParameter |
301 in constructedClass.thisType.typeArguments) { | 301 in constructedClass.thisType.typeArguments) { |
302 HInstruction argument = localsHandler.readLocal(localsHandler | 302 HInstruction argument = localsHandler.readLocal(localsHandler |
303 .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter))); | 303 .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter))); |
304 typeArguments.add(argument); | 304 typeArguments.add(argument); |
305 } | 305 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 // If there are locals that escape (i.e. mutated in closures), we pass the | 350 // If there are locals that escape (i.e. mutated in closures), we pass the |
351 // box to the constructor. | 351 // box to the constructor. |
352 ClosureScope scopeData = closureDataLookup | 352 ClosureScope scopeData = closureDataLookup |
353 .getClosureScope(constructorElement.resolvedAst.node); | 353 .getClosureScope(constructorElement.resolvedAst.node); |
354 if (scopeData.requiresContextBox) { | 354 if (scopeData.requiresContextBox) { |
355 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); | 355 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); |
356 } | 356 } |
357 | 357 |
358 // Pass type arguments. | 358 // Pass type arguments. |
359 ir.Class currentClass = body.enclosingClass; | 359 ir.Class currentClass = body.enclosingClass; |
360 if (backend.rtiNeed.classNeedsRti(_elementMap.getClass(currentClass))) { | 360 if (closedWorld.rtiNeed |
| 361 .classNeedsRti(_elementMap.getClass(currentClass))) { |
361 for (ir.DartType typeParameter in currentClass.thisType.typeArguments) { | 362 for (ir.DartType typeParameter in currentClass.thisType.typeArguments) { |
362 HInstruction argument = localsHandler.readLocal(localsHandler | 363 HInstruction argument = localsHandler.readLocal(localsHandler |
363 .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter) | 364 .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter) |
364 as ResolutionTypeVariableType)); | 365 as ResolutionTypeVariableType)); |
365 bodyCallInputs.add(argument); | 366 bodyCallInputs.add(argument); |
366 } | 367 } |
367 } | 368 } |
368 | 369 |
369 _invokeConstructorBody(body, bodyCallInputs); | 370 _invokeConstructorBody(body, bodyCallInputs); |
370 } | 371 } |
(...skipping 2009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2380 generateUnsupportedError( | 2381 generateUnsupportedError( |
2381 invocation, | 2382 invocation, |
2382 '${function.enclosingClass.name}.${function.name} ' | 2383 '${function.enclosingClass.name}.${function.name} ' |
2383 'can only be used as a const constructor'); | 2384 'can only be used as a const constructor'); |
2384 } | 2385 } |
2385 return; | 2386 return; |
2386 } | 2387 } |
2387 | 2388 |
2388 // Factory constructors take type parameters; other static methods ignore | 2389 // Factory constructors take type parameters; other static methods ignore |
2389 // them. | 2390 // them. |
2390 if (backend.rtiNeed.classNeedsRti(function.enclosingClass)) { | 2391 if (closedWorld.rtiNeed.classNeedsRti(function.enclosingClass)) { |
2391 _addTypeArguments(arguments, invocation.arguments); | 2392 _addTypeArguments(arguments, invocation.arguments); |
2392 } | 2393 } |
2393 } | 2394 } |
2394 | 2395 |
2395 _pushStaticInvocation(function, arguments, typeMask); | 2396 _pushStaticInvocation(function, arguments, typeMask); |
2396 } | 2397 } |
2397 | 2398 |
2398 void handleInvokeStaticForeign( | 2399 void handleInvokeStaticForeign( |
2399 ir.StaticInvocation invocation, ir.Procedure target) { | 2400 ir.StaticInvocation invocation, ir.Procedure target) { |
2400 String name = target.name.name; | 2401 String name = target.name.name; |
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3058 ConstantValue constant = _elementMap.getConstantValue(invocation); | 3059 ConstantValue constant = _elementMap.getConstantValue(invocation); |
3059 stack.add(graph.addConstant(constant, closedWorld)); | 3060 stack.add(graph.addConstant(constant, closedWorld)); |
3060 return; | 3061 return; |
3061 } | 3062 } |
3062 | 3063 |
3063 // TODO(sra): For JS-interop targets, process arguments differently. | 3064 // TODO(sra): For JS-interop targets, process arguments differently. |
3064 List<HInstruction> arguments = | 3065 List<HInstruction> arguments = |
3065 _visitArgumentsForStaticTarget(target.function, invocation.arguments); | 3066 _visitArgumentsForStaticTarget(target.function, invocation.arguments); |
3066 ConstructorEntity constructor = _elementMap.getConstructor(target); | 3067 ConstructorEntity constructor = _elementMap.getConstructor(target); |
3067 ClassEntity cls = constructor.enclosingClass; | 3068 ClassEntity cls = constructor.enclosingClass; |
3068 if (backend.rtiNeed.classNeedsRti(cls)) { | 3069 if (closedWorld.rtiNeed.classNeedsRti(cls)) { |
3069 _addTypeArguments(arguments, invocation.arguments); | 3070 _addTypeArguments(arguments, invocation.arguments); |
3070 } | 3071 } |
3071 TypeMask typeMask = new TypeMask.nonNullExact(cls, closedWorld); | 3072 TypeMask typeMask = new TypeMask.nonNullExact(cls, closedWorld); |
3072 InterfaceType type = _elementMap.createInterfaceType( | 3073 InterfaceType type = _elementMap.createInterfaceType( |
3073 target.enclosingClass, invocation.arguments.types); | 3074 target.enclosingClass, invocation.arguments.types); |
3074 addImplicitInstantiation(type); | 3075 addImplicitInstantiation(type); |
3075 _pushStaticInvocation(constructor, arguments, typeMask); | 3076 _pushStaticInvocation(constructor, arguments, typeMask); |
3076 removeImplicitInstantiation(type); | 3077 removeImplicitInstantiation(type); |
3077 } | 3078 } |
3078 | 3079 |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3506 enterBlock.setBlockFlow( | 3507 enterBlock.setBlockFlow( |
3507 new HTryBlockInformation( | 3508 new HTryBlockInformation( |
3508 kernelBuilder.wrapStatementGraph(bodyGraph), | 3509 kernelBuilder.wrapStatementGraph(bodyGraph), |
3509 exception, | 3510 exception, |
3510 kernelBuilder.wrapStatementGraph(catchGraph), | 3511 kernelBuilder.wrapStatementGraph(catchGraph), |
3511 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3512 kernelBuilder.wrapStatementGraph(finallyGraph)), |
3512 exitBlock); | 3513 exitBlock); |
3513 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3514 kernelBuilder.inTryStatement = previouslyInTryStatement; |
3514 } | 3515 } |
3515 } | 3516 } |
OLD | NEW |