| 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 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 parameters[parameter] = argument; | 587 parameters[parameter] = argument; |
| 588 localsHandler.updateLocal(parameter, argument); | 588 localsHandler.updateLocal(parameter, argument); |
| 589 } | 589 } |
| 590 | 590 |
| 591 constructor.function.positionalParameters.forEach(handleParameter); | 591 constructor.function.positionalParameters.forEach(handleParameter); |
| 592 constructor.function.namedParameters.toList() | 592 constructor.function.namedParameters.toList() |
| 593 ..sort(namedOrdering) | 593 ..sort(namedOrdering) |
| 594 ..forEach(handleParameter); | 594 ..forEach(handleParameter); |
| 595 | 595 |
| 596 // Set the locals handler state as if we were inlining the constructor. | 596 // Set the locals handler state as if we were inlining the constructor. |
| 597 ConstructorElement astElement = _elementMap.getConstructor(constructor); | 597 ConstructorEntity astElement = _elementMap.getConstructor(constructor); |
| 598 ResolvedAst resolvedAst = astElement.resolvedAst; | |
| 599 ClosureClassMap oldClosureData = localsHandler.closureData; | 598 ClosureClassMap oldClosureData = localsHandler.closureData; |
| 600 ClosureClassMap newClosureData = | 599 ClosureClassMap newClosureData = |
| 601 closureToClassMapper.getMemberMap(astElement); | 600 closureToClassMapper.getMemberMap(astElement); |
| 602 localsHandler.closureData = newClosureData; | 601 if (astElement is ConstructorElement) { |
| 603 if (resolvedAst.kind == ResolvedAstKind.PARSED) { | 602 // TODO(johnniwinther): Support constructor (body) entities. |
| 604 localsHandler.enterScope(newClosureData.capturingScopes[resolvedAst.node], | 603 ResolvedAst resolvedAst = astElement.resolvedAst; |
| 605 forGenerativeConstructorBody: astElement.isGenerativeConstructorBody); | 604 localsHandler.closureData = newClosureData; |
| 605 if (resolvedAst.kind == ResolvedAstKind.PARSED) { |
| 606 localsHandler.enterScope( |
| 607 newClosureData.capturingScopes[resolvedAst.node], |
| 608 forGenerativeConstructorBody: |
| 609 astElement.isGenerativeConstructorBody); |
| 610 } |
| 606 } | 611 } |
| 607 inlinedFrom(astElement, () { | 612 inlinedFrom(astElement, () { |
| 608 _buildInitializers(constructor, constructorChain, fieldValues); | 613 _buildInitializers(constructor, constructorChain, fieldValues); |
| 609 }); | 614 }); |
| 610 localsHandler.closureData = oldClosureData; | 615 localsHandler.closureData = oldClosureData; |
| 611 } | 616 } |
| 612 | 617 |
| 613 /// Builds generative constructor body. | 618 /// Builds generative constructor body. |
| 614 void buildConstructorBody(ir.Constructor constructor) { | 619 void buildConstructorBody(ir.Constructor constructor) { |
| 615 openFunction(constructor.function); | 620 openFunction(constructor.function); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 626 if (parent is ir.Procedure && parent.kind == ir.ProcedureKind.Factory) { | 631 if (parent is ir.Procedure && parent.kind == ir.ProcedureKind.Factory) { |
| 627 _addClassTypeVariablesIfNeeded(functionNode.parent); | 632 _addClassTypeVariablesIfNeeded(functionNode.parent); |
| 628 } | 633 } |
| 629 | 634 |
| 630 // If [functionNode] is `operator==` we explicitly add a null check at the | 635 // If [functionNode] is `operator==` we explicitly add a null check at the |
| 631 // beginning of the method. This is to avoid having call sites do the null | 636 // beginning of the method. This is to avoid having call sites do the null |
| 632 // check. | 637 // check. |
| 633 if (parent is ir.Procedure && | 638 if (parent is ir.Procedure && |
| 634 parent.kind == ir.ProcedureKind.Operator && | 639 parent.kind == ir.ProcedureKind.Operator && |
| 635 parent.name.name == '==') { | 640 parent.name.name == '==') { |
| 636 MethodElement method = _elementMap.getMethod(parent); | 641 FunctionEntity method = _elementMap.getMethod(parent); |
| 637 if (!backend.operatorEqHandlesNullArgument(method)) { | 642 if (!backend.operatorEqHandlesNullArgument(method)) { |
| 638 handleIf( | 643 handleIf( |
| 639 visitCondition: () { | 644 visitCondition: () { |
| 640 HParameterValue parameter = parameters.values.first; | 645 HParameterValue parameter = parameters.values.first; |
| 641 push(new HIdentity(parameter, graph.addConstantNull(closedWorld), | 646 push(new HIdentity(parameter, graph.addConstantNull(closedWorld), |
| 642 null, commonMasks.boolType)); | 647 null, commonMasks.boolType)); |
| 643 }, | 648 }, |
| 644 visitThen: () { | 649 visitThen: () { |
| 645 closeAndGotoExit(new HReturn( | 650 closeAndGotoExit(new HReturn( |
| 646 graph.addConstantBool(false, closedWorld), | 651 graph.addConstantBool(false, closedWorld), |
| 647 sourceInformationBuilder.buildImplicitReturn(method))); | 652 // TODO(johnniwinther): Provider source information like |
| 653 // `sourceInformationBuilder.buildImplicitReturn(method)`. |
| 654 null)); |
| 648 }, | 655 }, |
| 649 visitElse: null, | 656 visitElse: null, |
| 650 // TODO(27394): Add sourceInformation via | 657 // TODO(27394): Add sourceInformation via |
| 651 // `sourceInformationBuilder.buildIf(?)`. | 658 // `sourceInformationBuilder.buildIf(?)`. |
| 652 ); | 659 ); |
| 653 } | 660 } |
| 654 } | 661 } |
| 655 functionNode.body.accept(this); | 662 functionNode.body.accept(this); |
| 656 closeFunction(); | 663 closeFunction(); |
| 657 } | 664 } |
| (...skipping 2371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3029 pop(); | 3036 pop(); |
| 3030 stack.add(graph.addConstantBool(true, closedWorld)); | 3037 stack.add(graph.addConstantBool(true, closedWorld)); |
| 3031 return; | 3038 return; |
| 3032 } | 3039 } |
| 3033 | 3040 |
| 3034 if (type is ir.DynamicType) { | 3041 if (type is ir.DynamicType) { |
| 3035 stack.add(graph.addConstantBool(true, closedWorld)); | 3042 stack.add(graph.addConstantBool(true, closedWorld)); |
| 3036 return; | 3043 return; |
| 3037 } | 3044 } |
| 3038 | 3045 |
| 3039 ResolutionDartType typeValue = | 3046 DartType typeValue = |
| 3040 localsHandler.substInContext(_elementMap.getDartType(type)); | 3047 localsHandler.substInContext(_elementMap.getDartType(type)); |
| 3041 | 3048 |
| 3042 if (type is ir.FunctionType) { | 3049 if (type is ir.FunctionType) { |
| 3043 HInstruction representation = | 3050 HInstruction representation = |
| 3044 typeBuilder.analyzeTypeArgument(typeValue, sourceElement); | 3051 typeBuilder.analyzeTypeArgument(typeValue, sourceElement); |
| 3045 List<HInstruction> inputs = <HInstruction>[ | 3052 List<HInstruction> inputs = <HInstruction>[ |
| 3046 expression, | 3053 expression, |
| 3047 representation, | 3054 representation, |
| 3048 ]; | 3055 ]; |
| 3049 _pushStaticInvocation( | 3056 _pushStaticInvocation( |
| 3050 _commonElements.functionTypeTest, inputs, commonMasks.boolType); | 3057 _commonElements.functionTypeTest, inputs, commonMasks.boolType); |
| 3051 HInstruction call = pop(); | 3058 HInstruction call = pop(); |
| 3052 push(new HIs.compound(typeValue, expression, call, commonMasks.boolType)); | 3059 push(new HIs.compound(typeValue, expression, call, commonMasks.boolType)); |
| 3053 return; | 3060 return; |
| 3054 } | 3061 } |
| 3055 | 3062 |
| 3056 if (type is ir.TypeParameterType) { | 3063 if (type is ir.TypeParameterType) { |
| 3057 HInstruction runtimeType = | 3064 HInstruction runtimeType = |
| 3058 typeBuilder.addTypeVariableReference(typeValue, sourceElement); | 3065 typeBuilder.addTypeVariableReference(typeValue, sourceElement); |
| 3059 _pushStaticInvocation(_commonElements.checkSubtypeOfRuntimeType, | 3066 _pushStaticInvocation(_commonElements.checkSubtypeOfRuntimeType, |
| 3060 <HInstruction>[expression, runtimeType], commonMasks.boolType); | 3067 <HInstruction>[expression, runtimeType], commonMasks.boolType); |
| 3061 push( | 3068 push( |
| 3062 new HIs.variable(typeValue, expression, pop(), commonMasks.boolType)); | 3069 new HIs.variable(typeValue, expression, pop(), commonMasks.boolType)); |
| 3063 return; | 3070 return; |
| 3064 } | 3071 } |
| 3065 | 3072 |
| 3066 if (_isInterfaceWithNoDynamicTypes(type)) { | 3073 if (_isInterfaceWithNoDynamicTypes(type)) { |
| 3074 InterfaceType interfaceType = typeValue; |
| 3067 HInstruction representations = typeBuilder | 3075 HInstruction representations = typeBuilder |
| 3068 .buildTypeArgumentRepresentations(typeValue, sourceElement); | 3076 .buildTypeArgumentRepresentations(typeValue, sourceElement); |
| 3069 add(representations); | 3077 add(representations); |
| 3070 ClassElement element = typeValue.element; | 3078 ClassEntity element = interfaceType.element; |
| 3071 js.Name operator = namer.operatorIs(element); | 3079 js.Name operator = namer.operatorIs(element); |
| 3072 HInstruction isFieldName = | 3080 HInstruction isFieldName = |
| 3073 graph.addConstantStringFromName(operator, closedWorld); | 3081 graph.addConstantStringFromName(operator, closedWorld); |
| 3074 HInstruction asFieldName = closedWorld.hasAnyStrictSubtype(element) | 3082 HInstruction asFieldName = closedWorld.hasAnyStrictSubtype(element) |
| 3075 ? graph.addConstantStringFromName( | 3083 ? graph.addConstantStringFromName( |
| 3076 namer.substitutionName(element), closedWorld) | 3084 namer.substitutionName(element), closedWorld) |
| 3077 : graph.addConstantNull(closedWorld); | 3085 : graph.addConstantNull(closedWorld); |
| 3078 List<HInstruction> inputs = <HInstruction>[ | 3086 List<HInstruction> inputs = <HInstruction>[ |
| 3079 expression, | 3087 expression, |
| 3080 isFieldName, | 3088 isFieldName, |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3440 enterBlock.setBlockFlow( | 3448 enterBlock.setBlockFlow( |
| 3441 new HTryBlockInformation( | 3449 new HTryBlockInformation( |
| 3442 kernelBuilder.wrapStatementGraph(bodyGraph), | 3450 kernelBuilder.wrapStatementGraph(bodyGraph), |
| 3443 exception, | 3451 exception, |
| 3444 kernelBuilder.wrapStatementGraph(catchGraph), | 3452 kernelBuilder.wrapStatementGraph(catchGraph), |
| 3445 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3453 kernelBuilder.wrapStatementGraph(finallyGraph)), |
| 3446 exitBlock); | 3454 exitBlock); |
| 3447 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3455 kernelBuilder.inTryStatement = previouslyInTryStatement; |
| 3448 } | 3456 } |
| 3449 } | 3457 } |
| OLD | NEW |