| 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 import 'package:kernel/text/ast_to_text.dart' show debugNodeToString; | |
| 7 | 6 |
| 8 import '../closure.dart'; | 7 import '../closure.dart'; |
| 9 import '../common.dart'; | 8 import '../common.dart'; |
| 10 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | 9 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; |
| 11 import '../common/names.dart'; | 10 import '../common/names.dart'; |
| 12 import '../common/tasks.dart' show CompilerTask; | 11 import '../common/tasks.dart' show CompilerTask; |
| 13 import '../compiler.dart'; | 12 import '../compiler.dart'; |
| 14 import '../constants/values.dart' | 13 import '../constants/values.dart' |
| 15 show | 14 show |
| 16 ConstantValue, | 15 ConstantValue, |
| 17 InterceptorConstantValue, | 16 InterceptorConstantValue, |
| 18 StringConstantValue, | 17 StringConstantValue, |
| 19 TypeConstantValue; | 18 TypeConstantValue; |
| 20 import '../dart_types.dart'; | 19 import '../dart_types.dart'; |
| 21 import '../elements/elements.dart'; | 20 import '../elements/elements.dart'; |
| 22 import '../io/source_information.dart'; | 21 import '../io/source_information.dart'; |
| 23 import '../js/js.dart' as js; | 22 import '../js/js.dart' as js; |
| 24 import '../js_backend/backend.dart' show JavaScriptBackend; | 23 import '../js_backend/backend.dart' show JavaScriptBackend; |
| 25 import '../kernel/kernel.dart'; | 24 import '../kernel/kernel.dart'; |
| 26 import '../native/native.dart' as native; | 25 import '../native/native.dart' as native; |
| 27 import '../resolution/tree_elements.dart'; | 26 import '../resolution/tree_elements.dart'; |
| 28 import '../tree/dartstring.dart'; | 27 import '../tree/dartstring.dart'; |
| 29 import '../tree/nodes.dart' show FunctionExpression, Node; | 28 import '../tree/nodes.dart' show Node, BreakStatement; |
| 30 import '../types/masks.dart'; | 29 import '../types/masks.dart'; |
| 31 import '../universe/call_structure.dart' show CallStructure; | 30 import '../universe/call_structure.dart' show CallStructure; |
| 32 import '../universe/selector.dart'; | 31 import '../universe/selector.dart'; |
| 33 import '../universe/use.dart' show StaticUse, TypeUse; | |
| 34 import '../universe/side_effects.dart' show SideEffects; | 32 import '../universe/side_effects.dart' show SideEffects; |
| 35 import '../world.dart' show ClosedWorld; | 33 import '../universe/use.dart' show StaticUse; |
| 34 import '../world.dart'; |
| 36 import 'graph_builder.dart'; | 35 import 'graph_builder.dart'; |
| 36 import 'jump_handler.dart'; |
| 37 import 'kernel_ast_adapter.dart'; | 37 import 'kernel_ast_adapter.dart'; |
| 38 import 'kernel_string_builder.dart'; | 38 import 'kernel_string_builder.dart'; |
| 39 import 'locals_handler.dart'; | 39 import 'locals_handler.dart'; |
| 40 import 'loop_handler.dart'; | 40 import 'loop_handler.dart'; |
| 41 import 'nodes.dart'; | 41 import 'nodes.dart'; |
| 42 import 'ssa_branch_builder.dart'; | 42 import 'ssa_branch_builder.dart'; |
| 43 import 'type_builder.dart'; | 43 import 'type_builder.dart'; |
| 44 import 'types.dart' show TypeMaskFactory; | 44 import 'types.dart' show TypeMaskFactory; |
| 45 | 45 |
| 46 class SsaKernelBuilderTask extends CompilerTask { | 46 class SsaKernelBuilderTask extends CompilerTask { |
| (...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 assertStatement.message.accept(this); | 821 assertStatement.message.accept(this); |
| 822 _pushStaticInvocation(astAdapter.assertThrow, <HInstruction>[pop()], | 822 _pushStaticInvocation(astAdapter.assertThrow, <HInstruction>[pop()], |
| 823 astAdapter.assertThrowReturnType); | 823 astAdapter.assertThrowReturnType); |
| 824 pop(); | 824 pop(); |
| 825 } | 825 } |
| 826 | 826 |
| 827 handleIf(visitCondition: buildCondition, visitThen: fail); | 827 handleIf(visitCondition: buildCondition, visitThen: fail); |
| 828 } | 828 } |
| 829 | 829 |
| 830 @override | 830 @override |
| 831 void visitBreakStatement(ir.BreakStatement breakStatement) { |
| 832 assert(!isAborted()); |
| 833 JumpTarget target = astAdapter.getJumpTarget(breakStatement.target); |
| 834 assert(target != null); |
| 835 JumpHandler handler = jumpTargets[target]; |
| 836 assert(handler != null); |
| 837 handler.generateBreak(handler.labels.first); |
| 838 } |
| 839 |
| 840 @override |
| 841 void visitLabeledStatement(ir.LabeledStatement labeledStatement) { |
| 842 JumpTarget target = astAdapter.getJumpTarget(labeledStatement); |
| 843 JumpHandler handler = new JumpHandler(this, target); |
| 844 |
| 845 ir.Statement body = labeledStatement.body; |
| 846 if (body is ir.WhileStatement || |
| 847 body is ir.DoStatement || |
| 848 body is ir.ForStatement || |
| 849 body is ir.ForInStatement) { |
| 850 // loops handle breaks on their own |
| 851 body.accept(this); |
| 852 return; |
| 853 } |
| 854 LocalsHandler beforeLocals = new LocalsHandler.from(localsHandler); |
| 855 |
| 856 HBasicBlock newBlock = openNewBlock(); |
| 857 body.accept(this); |
| 858 SubGraph bodyGraph = new SubGraph(newBlock, lastOpenedBlock); |
| 859 |
| 860 HBasicBlock joinBlock = graph.addNewBlock(); |
| 861 List<LocalsHandler> breakHandlers = <LocalsHandler>[]; |
| 862 handler.forEachBreak((HBreak breakInstruction, LocalsHandler locals) { |
| 863 breakInstruction.block.addSuccessor(joinBlock); |
| 864 breakHandlers.add(locals); |
| 865 }); |
| 866 |
| 867 if (!isAborted()) { |
| 868 goto(current, joinBlock); |
| 869 breakHandlers.add(localsHandler); |
| 870 } |
| 871 |
| 872 open(joinBlock); |
| 873 localsHandler = beforeLocals.mergeMultiple(breakHandlers, joinBlock); |
| 874 |
| 875 // There was at least one reachable break, so the label is needed. |
| 876 newBlock.setBlockFlow( |
| 877 new HLabeledBlockInformation( |
| 878 new HSubGraphBlockInformation(bodyGraph), handler.labels), |
| 879 joinBlock); |
| 880 handler.close(); |
| 881 } |
| 882 |
| 883 @override |
| 831 void visitConditionalExpression(ir.ConditionalExpression conditional) { | 884 void visitConditionalExpression(ir.ConditionalExpression conditional) { |
| 832 SsaBranchBuilder brancher = new SsaBranchBuilder(this, compiler); | 885 SsaBranchBuilder brancher = new SsaBranchBuilder(this, compiler); |
| 833 brancher.handleConditional( | 886 brancher.handleConditional( |
| 834 () => conditional.condition.accept(this), | 887 () => conditional.condition.accept(this), |
| 835 () => conditional.then.accept(this), | 888 () => conditional.then.accept(this), |
| 836 () => conditional.otherwise.accept(this)); | 889 () => conditional.otherwise.accept(this)); |
| 837 } | 890 } |
| 838 | 891 |
| 839 @override | 892 @override |
| 840 void visitLogicalExpression(ir.LogicalExpression logicalExpression) { | 893 void visitLogicalExpression(ir.LogicalExpression logicalExpression) { |
| (...skipping 1370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2211 kernelBuilder.open(exitBlock); | 2264 kernelBuilder.open(exitBlock); |
| 2212 enterBlock.setBlockFlow( | 2265 enterBlock.setBlockFlow( |
| 2213 new HTryBlockInformation( | 2266 new HTryBlockInformation( |
| 2214 kernelBuilder.wrapStatementGraph(bodyGraph), | 2267 kernelBuilder.wrapStatementGraph(bodyGraph), |
| 2215 exception, | 2268 exception, |
| 2216 kernelBuilder.wrapStatementGraph(catchGraph), | 2269 kernelBuilder.wrapStatementGraph(catchGraph), |
| 2217 kernelBuilder.wrapStatementGraph(finallyGraph)), | 2270 kernelBuilder.wrapStatementGraph(finallyGraph)), |
| 2218 exitBlock); | 2271 exitBlock); |
| 2219 } | 2272 } |
| 2220 } | 2273 } |
| OLD | NEW |