Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: pkg/compiler/lib/src/ssa/builder_kernel.dart

Issue 2581143003: implement LabeledStatement and Break in kernel (Closed)
Patch Set: fix some tests Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698