| 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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 } | 338 } |
| 339 | 339 |
| 340 // Provide the parameters to the generative constructor body. | 340 // Provide the parameters to the generative constructor body. |
| 341 body.function.positionalParameters.forEach(handleParameter); | 341 body.function.positionalParameters.forEach(handleParameter); |
| 342 body.function.namedParameters.toList() | 342 body.function.namedParameters.toList() |
| 343 ..sort(namedOrdering) | 343 ..sort(namedOrdering) |
| 344 ..forEach(handleParameter); | 344 ..forEach(handleParameter); |
| 345 | 345 |
| 346 // If there are locals that escape (i.e. mutated in closures), we pass the | 346 // If there are locals that escape (i.e. mutated in closures), we pass the |
| 347 // box to the constructor. | 347 // box to the constructor. |
| 348 ClosureScope scopeData = | 348 CapturedScope scopeData = |
| 349 closureDataLookup.getClosureScope(constructorElement); | 349 closureDataLookup.getCapturedScope(constructorElement); |
| 350 if (scopeData.requiresContextBox) { | 350 if (scopeData.requiresContextBox) { |
| 351 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); | 351 bodyCallInputs.add(localsHandler.readLocal(scopeData.context)); |
| 352 } | 352 } |
| 353 | 353 |
| 354 // Pass type arguments. | 354 // Pass type arguments. |
| 355 ir.Class currentClass = body.enclosingClass; | 355 ir.Class currentClass = body.enclosingClass; |
| 356 if (closedWorld.rtiNeed | 356 if (closedWorld.rtiNeed |
| 357 .classNeedsRti(_elementMap.getClass(currentClass))) { | 357 .classNeedsRti(_elementMap.getClass(currentClass))) { |
| 358 for (ir.DartType typeParameter in currentClass.thisType.typeArguments) { | 358 for (ir.DartType typeParameter in currentClass.thisType.typeArguments) { |
| 359 HInstruction argument = localsHandler.readLocal(localsHandler | 359 HInstruction argument = localsHandler.readLocal(localsHandler |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 constructor.function.positionalParameters.forEach(handleParameter); | 601 constructor.function.positionalParameters.forEach(handleParameter); |
| 602 constructor.function.namedParameters.toList() | 602 constructor.function.namedParameters.toList() |
| 603 ..sort(namedOrdering) | 603 ..sort(namedOrdering) |
| 604 ..forEach(handleParameter); | 604 ..forEach(handleParameter); |
| 605 | 605 |
| 606 // Set the locals handler state as if we were inlining the constructor. | 606 // Set the locals handler state as if we were inlining the constructor. |
| 607 ConstructorEntity element = _elementMap.getConstructor(constructor); | 607 ConstructorEntity element = _elementMap.getConstructor(constructor); |
| 608 ScopeInfo oldScopeInfo = localsHandler.scopeInfo; | 608 ScopeInfo oldScopeInfo = localsHandler.scopeInfo; |
| 609 ScopeInfo newScopeInfo = closureDataLookup.getScopeInfo(element); | 609 ScopeInfo newScopeInfo = closureDataLookup.getScopeInfo(element); |
| 610 localsHandler.scopeInfo = newScopeInfo; | 610 localsHandler.scopeInfo = newScopeInfo; |
| 611 localsHandler.enterScope(closureDataLookup.getClosureScope(element)); | 611 localsHandler.enterScope(closureDataLookup.getCapturedScope(element)); |
| 612 inlinedFrom(element, () { | 612 inlinedFrom(element, () { |
| 613 _buildInitializers(constructor, constructorChain, fieldValues); | 613 _buildInitializers(constructor, constructorChain, fieldValues); |
| 614 }); | 614 }); |
| 615 localsHandler.scopeInfo = oldScopeInfo; | 615 localsHandler.scopeInfo = oldScopeInfo; |
| 616 } | 616 } |
| 617 | 617 |
| 618 /// Builds generative constructor body. | 618 /// Builds generative constructor body. |
| 619 void buildConstructorBody(ir.Constructor constructor) { | 619 void buildConstructorBody(ir.Constructor constructor) { |
| 620 openFunction(constructor.function); | 620 openFunction(constructor.function); |
| 621 _addClassTypeVariablesIfNeeded(constructor); | 621 _addClassTypeVariablesIfNeeded(constructor); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 ..sort(namedOrdering) | 689 ..sort(namedOrdering) |
| 690 ..forEach(handleParameter); | 690 ..forEach(handleParameter); |
| 691 } | 691 } |
| 692 | 692 |
| 693 HBasicBlock block = graph.addNewBlock(); | 693 HBasicBlock block = graph.addNewBlock(); |
| 694 open(graph.entry); | 694 open(graph.entry); |
| 695 | 695 |
| 696 localsHandler.startFunction( | 696 localsHandler.startFunction( |
| 697 targetElement, | 697 targetElement, |
| 698 closureDataLookup.getScopeInfo(targetElement), | 698 closureDataLookup.getScopeInfo(targetElement), |
| 699 closureDataLookup.getClosureScope(targetElement), | 699 closureDataLookup.getCapturedScope(targetElement), |
| 700 parameterMap, | 700 parameterMap, |
| 701 isGenerativeConstructorBody: targetElement is ConstructorBodyEntity); | 701 isGenerativeConstructorBody: targetElement is ConstructorBodyEntity); |
| 702 close(new HGoto()).addSuccessor(block); | 702 close(new HGoto()).addSuccessor(block); |
| 703 | 703 |
| 704 open(block); | 704 open(block); |
| 705 } | 705 } |
| 706 | 706 |
| 707 void closeFunction() { | 707 void closeFunction() { |
| 708 if (!isAborted()) closeAndGotoExit(new HGoto()); | 708 if (!isAborted()) closeAndGotoExit(new HGoto()); |
| 709 graph.finalize(); | 709 graph.finalize(); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 } | 886 } |
| 887 } | 887 } |
| 888 | 888 |
| 889 void buildBody() { | 889 void buildBody() { |
| 890 forStatement.body.accept(this); | 890 forStatement.body.accept(this); |
| 891 } | 891 } |
| 892 | 892 |
| 893 JumpTarget jumpTarget = localsMap.getJumpTargetForFor(forStatement); | 893 JumpTarget jumpTarget = localsMap.getJumpTargetForFor(forStatement); |
| 894 loopHandler.handleLoop( | 894 loopHandler.handleLoop( |
| 895 forStatement, | 895 forStatement, |
| 896 localsMap.getLoopClosureScope(closureDataLookup, forStatement), | 896 localsMap.getCapturedLoopScope(closureDataLookup, forStatement), |
| 897 jumpTarget, | 897 jumpTarget, |
| 898 buildInitializer, | 898 buildInitializer, |
| 899 buildCondition, | 899 buildCondition, |
| 900 buildUpdate, | 900 buildUpdate, |
| 901 buildBody); | 901 buildBody); |
| 902 } | 902 } |
| 903 | 903 |
| 904 @override | 904 @override |
| 905 void visitForInStatement(ir.ForInStatement forInStatement) { | 905 void visitForInStatement(ir.ForInStatement forInStatement) { |
| 906 if (forInStatement.isAsync) { | 906 if (forInStatement.isAsync) { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1015 HInstruction index = localsHandler.readLocal(indexVariable); | 1015 HInstruction index = localsHandler.readLocal(indexVariable); |
| 1016 HInstruction one = graph.addConstantInt(1, closedWorld); | 1016 HInstruction one = graph.addConstantInt(1, closedWorld); |
| 1017 HInstruction addInstruction = | 1017 HInstruction addInstruction = |
| 1018 new HAdd(index, one, null, commonMasks.positiveIntType); | 1018 new HAdd(index, one, null, commonMasks.positiveIntType); |
| 1019 add(addInstruction); | 1019 add(addInstruction); |
| 1020 localsHandler.updateLocal(indexVariable, addInstruction); | 1020 localsHandler.updateLocal(indexVariable, addInstruction); |
| 1021 } | 1021 } |
| 1022 | 1022 |
| 1023 loopHandler.handleLoop( | 1023 loopHandler.handleLoop( |
| 1024 forInStatement, | 1024 forInStatement, |
| 1025 localsMap.getLoopClosureScope(closureDataLookup, forInStatement), | 1025 localsMap.getCapturedLoopScope(closureDataLookup, forInStatement), |
| 1026 localsMap.getJumpTargetForForIn(forInStatement), | 1026 localsMap.getJumpTargetForForIn(forInStatement), |
| 1027 buildInitializer, | 1027 buildInitializer, |
| 1028 buildCondition, | 1028 buildCondition, |
| 1029 buildUpdate, | 1029 buildUpdate, |
| 1030 buildBody); | 1030 buildBody); |
| 1031 } | 1031 } |
| 1032 | 1032 |
| 1033 _buildForInIterator(ir.ForInStatement forInStatement) { | 1033 _buildForInIterator(ir.ForInStatement forInStatement) { |
| 1034 // Generate a structure equivalent to: | 1034 // Generate a structure equivalent to: |
| 1035 // Iterator<E> $iter = <iterable>.iterator; | 1035 // Iterator<E> $iter = <iterable>.iterator; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1066 localsHandler.updateLocal(loopVariableLocal, value); | 1066 localsHandler.updateLocal(loopVariableLocal, value); |
| 1067 // Hint to name loop value after name of loop variable. | 1067 // Hint to name loop value after name of loop variable. |
| 1068 if (loopVariableLocal is! SyntheticLocal) { | 1068 if (loopVariableLocal is! SyntheticLocal) { |
| 1069 value.sourceElement ??= loopVariableLocal; | 1069 value.sourceElement ??= loopVariableLocal; |
| 1070 } | 1070 } |
| 1071 forInStatement.body.accept(this); | 1071 forInStatement.body.accept(this); |
| 1072 } | 1072 } |
| 1073 | 1073 |
| 1074 loopHandler.handleLoop( | 1074 loopHandler.handleLoop( |
| 1075 forInStatement, | 1075 forInStatement, |
| 1076 localsMap.getLoopClosureScope(closureDataLookup, forInStatement), | 1076 localsMap.getCapturedLoopScope(closureDataLookup, forInStatement), |
| 1077 localsMap.getJumpTargetForForIn(forInStatement), | 1077 localsMap.getJumpTargetForForIn(forInStatement), |
| 1078 buildInitializer, | 1078 buildInitializer, |
| 1079 buildCondition, | 1079 buildCondition, |
| 1080 () {}, | 1080 () {}, |
| 1081 buildBody); | 1081 buildBody); |
| 1082 } | 1082 } |
| 1083 | 1083 |
| 1084 void _buildAsyncForIn(ir.ForInStatement forInStatement) { | 1084 void _buildAsyncForIn(ir.ForInStatement forInStatement) { |
| 1085 // The async-for is implemented with a StreamIterator. | 1085 // The async-for is implemented with a StreamIterator. |
| 1086 HInstruction streamIterator; | 1086 HInstruction streamIterator; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1113 forInStatement.body.accept(this); | 1113 forInStatement.body.accept(this); |
| 1114 } | 1114 } |
| 1115 | 1115 |
| 1116 void buildUpdate() {} | 1116 void buildUpdate() {} |
| 1117 | 1117 |
| 1118 // Creates a synthetic try/finally block in case anything async goes amiss. | 1118 // Creates a synthetic try/finally block in case anything async goes amiss. |
| 1119 TryCatchFinallyBuilder tryBuilder = new TryCatchFinallyBuilder(this); | 1119 TryCatchFinallyBuilder tryBuilder = new TryCatchFinallyBuilder(this); |
| 1120 // Build fake try body: | 1120 // Build fake try body: |
| 1121 loopHandler.handleLoop( | 1121 loopHandler.handleLoop( |
| 1122 forInStatement, | 1122 forInStatement, |
| 1123 localsMap.getLoopClosureScope(closureDataLookup, forInStatement), | 1123 localsMap.getCapturedLoopScope(closureDataLookup, forInStatement), |
| 1124 localsMap.getJumpTargetForForIn(forInStatement), | 1124 localsMap.getJumpTargetForForIn(forInStatement), |
| 1125 buildInitializer, | 1125 buildInitializer, |
| 1126 buildCondition, | 1126 buildCondition, |
| 1127 buildUpdate, | 1127 buildUpdate, |
| 1128 buildBody); | 1128 buildBody); |
| 1129 | 1129 |
| 1130 void finalizerFunction() { | 1130 void finalizerFunction() { |
| 1131 _pushDynamicInvocation(forInStatement, null, [streamIterator], | 1131 _pushDynamicInvocation(forInStatement, null, [streamIterator], |
| 1132 selector: Selectors.cancel); | 1132 selector: Selectors.cancel); |
| 1133 add(new HAwait(pop(), closedWorld.commonMasks.dynamicType)); | 1133 add(new HAwait(pop(), closedWorld.commonMasks.dynamicType)); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1164 @override | 1164 @override |
| 1165 void visitWhileStatement(ir.WhileStatement whileStatement) { | 1165 void visitWhileStatement(ir.WhileStatement whileStatement) { |
| 1166 assert(isReachable); | 1166 assert(isReachable); |
| 1167 HInstruction buildCondition() { | 1167 HInstruction buildCondition() { |
| 1168 whileStatement.condition.accept(this); | 1168 whileStatement.condition.accept(this); |
| 1169 return popBoolified(); | 1169 return popBoolified(); |
| 1170 } | 1170 } |
| 1171 | 1171 |
| 1172 loopHandler.handleLoop( | 1172 loopHandler.handleLoop( |
| 1173 whileStatement, | 1173 whileStatement, |
| 1174 localsMap.getLoopClosureScope(closureDataLookup, whileStatement), | 1174 localsMap.getCapturedLoopScope(closureDataLookup, whileStatement), |
| 1175 localsMap.getJumpTargetForWhile(whileStatement), | 1175 localsMap.getJumpTargetForWhile(whileStatement), |
| 1176 () {}, | 1176 () {}, |
| 1177 buildCondition, | 1177 buildCondition, |
| 1178 () {}, () { | 1178 () {}, () { |
| 1179 whileStatement.body.accept(this); | 1179 whileStatement.body.accept(this); |
| 1180 }); | 1180 }); |
| 1181 } | 1181 } |
| 1182 | 1182 |
| 1183 @override | 1183 @override |
| 1184 visitDoStatement(ir.DoStatement doStatement) { | 1184 visitDoStatement(ir.DoStatement doStatement) { |
| 1185 // TODO(efortuna): I think this can be rewritten using | 1185 // TODO(efortuna): I think this can be rewritten using |
| 1186 // LoopHandler.handleLoop with some tricks about when the "update" happens. | 1186 // LoopHandler.handleLoop with some tricks about when the "update" happens. |
| 1187 LocalsHandler savedLocals = new LocalsHandler.from(localsHandler); | 1187 LocalsHandler savedLocals = new LocalsHandler.from(localsHandler); |
| 1188 LoopClosureScope loopClosureInfo = | 1188 CapturedLoopScope loopClosureInfo = |
| 1189 localsMap.getLoopClosureScope(closureDataLookup, doStatement); | 1189 localsMap.getCapturedLoopScope(closureDataLookup, doStatement); |
| 1190 localsHandler.startLoop(loopClosureInfo); | 1190 localsHandler.startLoop(loopClosureInfo); |
| 1191 JumpTarget target = localsMap.getJumpTargetForDo(doStatement); | 1191 JumpTarget target = localsMap.getJumpTargetForDo(doStatement); |
| 1192 JumpHandler jumpHandler = loopHandler.beginLoopHeader(doStatement, target); | 1192 JumpHandler jumpHandler = loopHandler.beginLoopHeader(doStatement, target); |
| 1193 HLoopInformation loopInfo = current.loopInformation; | 1193 HLoopInformation loopInfo = current.loopInformation; |
| 1194 HBasicBlock loopEntryBlock = current; | 1194 HBasicBlock loopEntryBlock = current; |
| 1195 HBasicBlock bodyEntryBlock = current; | 1195 HBasicBlock bodyEntryBlock = current; |
| 1196 bool hasContinues = target != null && target.isContinueTarget; | 1196 bool hasContinues = target != null && target.isContinueTarget; |
| 1197 if (hasContinues) { | 1197 if (hasContinues) { |
| 1198 // Add extra block to hang labels on. | 1198 // Add extra block to hang labels on. |
| 1199 // It doesn't currently work if they are on the same block as the | 1199 // It doesn't currently work if they are on the same block as the |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1717 buildExpression, | 1717 buildExpression, |
| 1718 switchStatement.cases, | 1718 switchStatement.cases, |
| 1719 getConstants, | 1719 getConstants, |
| 1720 (_) => false, // No case is default. | 1720 (_) => false, // No case is default. |
| 1721 buildSwitchCase); | 1721 buildSwitchCase); |
| 1722 } | 1722 } |
| 1723 | 1723 |
| 1724 void buildLoop() { | 1724 void buildLoop() { |
| 1725 loopHandler.handleLoop( | 1725 loopHandler.handleLoop( |
| 1726 switchStatement, | 1726 switchStatement, |
| 1727 localsMap.getLoopClosureScope(closureDataLookup, switchStatement), | 1727 localsMap.getCapturedLoopScope(closureDataLookup, switchStatement), |
| 1728 switchTarget, | 1728 switchTarget, |
| 1729 () {}, | 1729 () {}, |
| 1730 buildCondition, | 1730 buildCondition, |
| 1731 () {}, | 1731 () {}, |
| 1732 buildSwitch); | 1732 buildSwitch); |
| 1733 } | 1733 } |
| 1734 | 1734 |
| 1735 if (hasDefault) { | 1735 if (hasDefault) { |
| 1736 buildLoop(); | 1736 buildLoop(); |
| 1737 } else { | 1737 } else { |
| (...skipping 1778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3516 enterBlock.setBlockFlow( | 3516 enterBlock.setBlockFlow( |
| 3517 new HTryBlockInformation( | 3517 new HTryBlockInformation( |
| 3518 kernelBuilder.wrapStatementGraph(bodyGraph), | 3518 kernelBuilder.wrapStatementGraph(bodyGraph), |
| 3519 exception, | 3519 exception, |
| 3520 kernelBuilder.wrapStatementGraph(catchGraph), | 3520 kernelBuilder.wrapStatementGraph(catchGraph), |
| 3521 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3521 kernelBuilder.wrapStatementGraph(finallyGraph)), |
| 3522 exitBlock); | 3522 exitBlock); |
| 3523 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3523 kernelBuilder.inTryStatement = previouslyInTryStatement; |
| 3524 } | 3524 } |
| 3525 } | 3525 } |
| OLD | NEW |