| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of ssa; | 5 part of ssa; |
| 6 | 6 |
| 7 class SsaFunctionCompiler implements FunctionCompiler { | 7 class SsaFunctionCompiler implements FunctionCompiler { |
| 8 SsaCodeGeneratorTask generator; | 8 SsaCodeGeneratorTask generator; |
| 9 SsaBuilderTask builder; | 9 SsaBuilderTask builder; |
| 10 SsaOptimizerTask optimizer; | 10 SsaOptimizerTask optimizer; |
| (...skipping 2243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2254 if (isNativeUpgradeFactory) { | 2254 if (isNativeUpgradeFactory) { |
| 2255 if (interceptor == null) { | 2255 if (interceptor == null) { |
| 2256 ConstantValue constant = | 2256 ConstantValue constant = |
| 2257 new InterceptorConstantValue(classElement.thisType); | 2257 new InterceptorConstantValue(classElement.thisType); |
| 2258 interceptor = graph.addConstant(constant, compiler); | 2258 interceptor = graph.addConstant(constant, compiler); |
| 2259 } | 2259 } |
| 2260 bodyCallInputs.add(interceptor); | 2260 bodyCallInputs.add(interceptor); |
| 2261 } | 2261 } |
| 2262 bodyCallInputs.add(newObject); | 2262 bodyCallInputs.add(newObject); |
| 2263 ResolvedAst resolvedAst = constructor.resolvedAst; | 2263 ResolvedAst resolvedAst = constructor.resolvedAst; |
| 2264 TreeElements elements = resolvedAst.elements; | |
| 2265 ast.Node node = resolvedAst.node; | 2264 ast.Node node = resolvedAst.node; |
| 2266 ClosureClassMap parameterClosureData = | 2265 ClosureClassMap parameterClosureData = |
| 2267 compiler.closureToClassMapper.getMappingForNestedFunction(node); | 2266 compiler.closureToClassMapper.getMappingForNestedFunction(node); |
| 2268 | 2267 |
| 2269 FunctionSignature functionSignature = body.functionSignature; | 2268 FunctionSignature functionSignature = body.functionSignature; |
| 2270 // Provide the parameters to the generative constructor body. | 2269 // Provide the parameters to the generative constructor body. |
| 2271 functionSignature.orderedForEachParameter((ParameterElement parameter) { | 2270 functionSignature.orderedForEachParameter((ParameterElement parameter) { |
| 2272 // If [parameter] is boxed, it will be a field in the box passed as the | 2271 // If [parameter] is boxed, it will be a field in the box passed as the |
| 2273 // last parameter. So no need to directly pass it. | 2272 // last parameter. So no need to directly pass it. |
| 2274 if (!localsHandler.isBoxed(parameter)) { | 2273 if (!localsHandler.isBoxed(parameter)) { |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2779 | 2778 |
| 2780 if (bodyBlock != null) { | 2779 if (bodyBlock != null) { |
| 2781 continueHandlers.add(localsHandler); | 2780 continueHandlers.add(localsHandler); |
| 2782 bodyBlock.addSuccessor(updateBlock); | 2781 bodyBlock.addSuccessor(updateBlock); |
| 2783 } | 2782 } |
| 2784 | 2783 |
| 2785 open(updateBlock); | 2784 open(updateBlock); |
| 2786 localsHandler = | 2785 localsHandler = |
| 2787 continueHandlers[0].mergeMultiple(continueHandlers, updateBlock); | 2786 continueHandlers[0].mergeMultiple(continueHandlers, updateBlock); |
| 2788 | 2787 |
| 2789 HLabeledBlockInformation labelInfo; | |
| 2790 List<LabelDefinition> labels = jumpHandler.labels(); | 2788 List<LabelDefinition> labels = jumpHandler.labels(); |
| 2791 JumpTarget target = elements.getTargetDefinition(loop); | 2789 JumpTarget target = elements.getTargetDefinition(loop); |
| 2792 if (!labels.isEmpty) { | 2790 if (!labels.isEmpty) { |
| 2793 beginBodyBlock.setBlockFlow( | 2791 beginBodyBlock.setBlockFlow( |
| 2794 new HLabeledBlockInformation( | 2792 new HLabeledBlockInformation( |
| 2795 new HSubGraphBlockInformation(bodyGraph), | 2793 new HSubGraphBlockInformation(bodyGraph), |
| 2796 jumpHandler.labels(), | 2794 jumpHandler.labels(), |
| 2797 isContinue: true), | 2795 isContinue: true), |
| 2798 updateBlock); | 2796 updateBlock); |
| 2799 } else if (target != null && target.isContinueTarget) { | 2797 } else if (target != null && target.isContinueTarget) { |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2915 } | 2913 } |
| 2916 visit(node.condition); | 2914 visit(node.condition); |
| 2917 return popBoolified(); | 2915 return popBoolified(); |
| 2918 } | 2916 } |
| 2919 void buildUpdate() { | 2917 void buildUpdate() { |
| 2920 for (ast.Expression expression in node.update) { | 2918 for (ast.Expression expression in node.update) { |
| 2921 visit(expression); | 2919 visit(expression); |
| 2922 assert(!isAborted()); | 2920 assert(!isAborted()); |
| 2923 // The result of the update instruction isn't used, and can just | 2921 // The result of the update instruction isn't used, and can just |
| 2924 // be dropped. | 2922 // be dropped. |
| 2925 HInstruction updateInstruction = pop(); | 2923 pop(); |
| 2926 } | 2924 } |
| 2927 } | 2925 } |
| 2928 void buildBody() { | 2926 void buildBody() { |
| 2929 visit(node.body); | 2927 visit(node.body); |
| 2930 } | 2928 } |
| 2931 handleLoop(node, buildInitializer, buildCondition, buildUpdate, buildBody); | 2929 handleLoop(node, buildInitializer, buildCondition, buildUpdate, buildBody); |
| 2932 } | 2930 } |
| 2933 | 2931 |
| 2934 visitWhile(ast.While node) { | 2932 visitWhile(ast.While node) { |
| 2935 assert(isReachable); | 2933 assert(isReachable); |
| (...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3624 // (dartbug.com/7182). | 3622 // (dartbug.com/7182). |
| 3625 HInstruction buildTypeArgumentRepresentations(DartType type) { | 3623 HInstruction buildTypeArgumentRepresentations(DartType type) { |
| 3626 // Compute the representation of the type arguments, including access | 3624 // Compute the representation of the type arguments, including access |
| 3627 // to the runtime type information for type variables as instructions. | 3625 // to the runtime type information for type variables as instructions. |
| 3628 if (type.isTypeVariable) { | 3626 if (type.isTypeVariable) { |
| 3629 return buildLiteralList(<HInstruction>[addTypeVariableReference(type)]); | 3627 return buildLiteralList(<HInstruction>[addTypeVariableReference(type)]); |
| 3630 } else { | 3628 } else { |
| 3631 assert(type.element.isClass); | 3629 assert(type.element.isClass); |
| 3632 InterfaceType interface = type; | 3630 InterfaceType interface = type; |
| 3633 List<HInstruction> inputs = <HInstruction>[]; | 3631 List<HInstruction> inputs = <HInstruction>[]; |
| 3634 bool first = true; | |
| 3635 List<js.Expression> templates = <js.Expression>[]; | 3632 List<js.Expression> templates = <js.Expression>[]; |
| 3636 for (DartType argument in interface.typeArguments) { | 3633 for (DartType argument in interface.typeArguments) { |
| 3637 // As we construct the template in stages, we have to make sure that for | 3634 // As we construct the template in stages, we have to make sure that for |
| 3638 // each part the generated sub-template's holes match the index of the | 3635 // each part the generated sub-template's holes match the index of the |
| 3639 // inputs that are later used to instantiate it. We do this by starting | 3636 // inputs that are later used to instantiate it. We do this by starting |
| 3640 // the indexing with the number of inputs from previous sub-templates. | 3637 // the indexing with the number of inputs from previous sub-templates. |
| 3641 templates.add( | 3638 templates.add( |
| 3642 rti.getTypeRepresentationWithPlaceholders(argument, (variable) { | 3639 rti.getTypeRepresentationWithPlaceholders(argument, (variable) { |
| 3643 HInstruction runtimeType = addTypeVariableReference(variable); | 3640 HInstruction runtimeType = addTypeVariableReference(variable); |
| 3644 inputs.add(runtimeType); | 3641 inputs.add(runtimeType); |
| (...skipping 2877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6522 | 6519 |
| 6523 InterfaceType type = elements.getType(node); | 6520 InterfaceType type = elements.getType(node); |
| 6524 InterfaceType expectedType = | 6521 InterfaceType expectedType = |
| 6525 functionElement.computeEffectiveTargetType(type); | 6522 functionElement.computeEffectiveTargetType(type); |
| 6526 expectedType = localsHandler.substInContext(expectedType); | 6523 expectedType = localsHandler.substInContext(expectedType); |
| 6527 | 6524 |
| 6528 ClassElement cls = constructor.enclosingClass; | 6525 ClassElement cls = constructor.enclosingClass; |
| 6529 | 6526 |
| 6530 if (backend.classNeedsRti(cls)) { | 6527 if (backend.classNeedsRti(cls)) { |
| 6531 List<HInstruction> typeInputs = <HInstruction>[]; | 6528 List<HInstruction> typeInputs = <HInstruction>[]; |
| 6532 List<DartType> typeVariable = cls.typeVariables; | |
| 6533 expectedType.typeArguments.forEach((DartType argument) { | 6529 expectedType.typeArguments.forEach((DartType argument) { |
| 6534 typeInputs.add(analyzeTypeArgument(argument)); | 6530 typeInputs.add(analyzeTypeArgument(argument)); |
| 6535 }); | 6531 }); |
| 6536 | 6532 |
| 6537 // We lift this common call pattern into a helper function to save space | 6533 // We lift this common call pattern into a helper function to save space |
| 6538 // in the output. | 6534 // in the output. |
| 6539 if (typeInputs.every((HInstruction input) => input.isNull())) { | 6535 if (typeInputs.every((HInstruction input) => input.isNull())) { |
| 6540 if (listInputs.isEmpty) { | 6536 if (listInputs.isEmpty) { |
| 6541 constructor = backend.mapLiteralUntypedEmptyMaker; | 6537 constructor = backend.mapLiteralUntypedEmptyMaker; |
| 6542 } else { | 6538 } else { |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6820 */ | 6816 */ |
| 6821 void handleSwitch( | 6817 void handleSwitch( |
| 6822 ast.Node errorNode, | 6818 ast.Node errorNode, |
| 6823 JumpHandler jumpHandler, | 6819 JumpHandler jumpHandler, |
| 6824 HInstruction buildExpression(), | 6820 HInstruction buildExpression(), |
| 6825 var switchCases, | 6821 var switchCases, |
| 6826 Iterable<ConstantValue> getConstants(ast.SwitchCase switchCase), | 6822 Iterable<ConstantValue> getConstants(ast.SwitchCase switchCase), |
| 6827 bool isDefaultCase(ast.SwitchCase switchCase), | 6823 bool isDefaultCase(ast.SwitchCase switchCase), |
| 6828 void buildSwitchCase(ast.SwitchCase switchCase)) { | 6824 void buildSwitchCase(ast.SwitchCase switchCase)) { |
| 6829 | 6825 |
| 6830 Map<ast.CaseMatch, ConstantValue> constants = | |
| 6831 new Map<ast.CaseMatch, ConstantValue>(); | |
| 6832 | |
| 6833 HBasicBlock expressionStart = openNewBlock(); | 6826 HBasicBlock expressionStart = openNewBlock(); |
| 6834 HInstruction expression = buildExpression(); | 6827 HInstruction expression = buildExpression(); |
| 6835 if (switchCases.isEmpty) { | 6828 if (switchCases.isEmpty) { |
| 6836 return; | 6829 return; |
| 6837 } | 6830 } |
| 6838 | 6831 |
| 6839 HSwitch switchInstruction = new HSwitch(<HInstruction>[expression]); | 6832 HSwitch switchInstruction = new HSwitch(<HInstruction>[expression]); |
| 6840 HBasicBlock expressionEnd = close(switchInstruction); | 6833 HBasicBlock expressionEnd = close(switchInstruction); |
| 6841 LocalsHandler savedLocals = localsHandler; | 6834 LocalsHandler savedLocals = localsHandler; |
| 6842 | 6835 |
| (...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7879 if (unaliased is TypedefType) throw 'unable to unalias $type'; | 7872 if (unaliased is TypedefType) throw 'unable to unalias $type'; |
| 7880 unaliased.accept(this, builder); | 7873 unaliased.accept(this, builder); |
| 7881 } | 7874 } |
| 7882 | 7875 |
| 7883 void visitDynamicType(DynamicType type, SsaBuilder builder) { | 7876 void visitDynamicType(DynamicType type, SsaBuilder builder) { |
| 7884 JavaScriptBackend backend = builder.compiler.backend; | 7877 JavaScriptBackend backend = builder.compiler.backend; |
| 7885 ClassElement cls = backend.findHelper('DynamicRuntimeType'); | 7878 ClassElement cls = backend.findHelper('DynamicRuntimeType'); |
| 7886 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); | 7879 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); |
| 7887 } | 7880 } |
| 7888 } | 7881 } |
| OLD | NEW |