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

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

Issue 2644293004: Fix labeled break statements. (Closed)
Patch Set: . Created 3 years, 11 months 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:js_runtime/shared/embedded_names.dart'; 5 import 'package:js_runtime/shared/embedded_names.dart';
6 import 'package:kernel/ast.dart' as ir; 6 import 'package:kernel/ast.dart' as ir;
7 7
8 import '../common.dart'; 8 import '../common.dart';
9 import '../common/names.dart'; 9 import '../common/names.dart';
10 import '../compiler.dart'; 10 import '../compiler.dart';
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 if (member is ir.Field) { 370 if (member is ir.Field) {
371 FieldElement field = _nodeToElement[member]; 371 FieldElement field = _nodeToElement[member];
372 return field.constant == null; 372 return field.constant == null;
373 } 373 }
374 return false; 374 return false;
375 } 375 }
376 376
377 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary; 377 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary;
378 378
379 KernelJumpTarget getJumpTarget(ir.TreeNode node, 379 KernelJumpTarget getJumpTarget(ir.TreeNode node,
380 {bool isContinueTarget: false}) => 380 {bool isContinueTarget: false}) {
381 _jumpTargets.putIfAbsent(node, () { 381 return _jumpTargets.putIfAbsent(node, () {
382 if (node is ir.LabeledStatement && 382 if (node is ir.LabeledStatement &&
383 _jumpTargets.containsKey((node as ir.LabeledStatement).body)) { 383 _jumpTargets.containsKey((node as ir.LabeledStatement).body)) {
384 return _jumpTargets[(node as ir.LabeledStatement).body]; 384 return _jumpTargets[(node as ir.LabeledStatement).body];
385 } 385 }
386 return new KernelJumpTarget(node, makeContinueLabel: isContinueTarget); 386 return new KernelJumpTarget(node, this,
387 }); 387 makeContinueLabel: isContinueTarget);
388 388 });
389 LabelDefinition getTargetLabel(ir.Node node) => 389 }
390 elements.getTargetLabel(getNode(node));
391 390
392 ir.Class get mapLiteralClass => 391 ir.Class get mapLiteralClass =>
393 kernel.classes[_backend.helpers.mapLiteralClass]; 392 kernel.classes[_backend.helpers.mapLiteralClass];
394 393
395 ir.Procedure get mapLiteralConstructor => 394 ir.Procedure get mapLiteralConstructor =>
396 kernel.functions[_backend.helpers.mapLiteralConstructor]; 395 kernel.functions[_backend.helpers.mapLiteralConstructor];
397 396
398 ir.Procedure get mapLiteralConstructorEmpty => 397 ir.Procedure get mapLiteralConstructorEmpty =>
399 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty]; 398 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty];
400 399
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 /// If this jump target was not initially constructed with a LabeledStatement, 998 /// If this jump target was not initially constructed with a LabeledStatement,
1000 /// this value is identical to targetStatement. 999 /// this value is identical to targetStatement.
1001 ir.Node originalStatement; 1000 ir.Node originalStatement;
1002 1001
1003 @override 1002 @override
1004 bool isBreakTarget = false; 1003 bool isBreakTarget = false;
1005 1004
1006 @override 1005 @override
1007 bool isContinueTarget = false; 1006 bool isContinueTarget = false;
1008 1007
1009 KernelJumpTarget(this.targetStatement, {bool makeContinueLabel = false}) { 1008 KernelJumpTarget(this.targetStatement, KernelAstAdapter adapter,
1010 labels = <LabelDefinition>[]; 1009 {bool makeContinueLabel = false}) {
1011 originalStatement = targetStatement; 1010 originalStatement = targetStatement;
1012 if (targetStatement is ir.LabeledStatement) { 1011 this.labels = <LabelDefinition>[];
1012 if (targetStatement is ir.WhileStatement ||
1013 targetStatement is ir.DoStatement ||
1014 targetStatement is ir.ForStatement ||
1015 targetStatement is ir.ForInStatement) {
1016 // Currently these labels are set at resolution on the element itself.
1017 // Once that gets updated, this logic can change downstream.
1018 JumpTarget target = adapter.elements
1019 .getTargetDefinition(adapter.getNode(targetStatement));
1020 if (target != null) {
1021 labels.addAll(target.labels);
1022 isBreakTarget = target.isBreakTarget;
1023 isContinueTarget = target.isContinueTarget;
1024 }
1025 } else if (targetStatement is ir.LabeledStatement) {
1013 targetStatement = (targetStatement as ir.LabeledStatement).body; 1026 targetStatement = (targetStatement as ir.LabeledStatement).body;
1014 labels.add( 1027 labels.add(
1015 new LabelDefinitionX(null, 'L${index++}', this)..setBreakTarget()); 1028 new LabelDefinitionX(null, 'L${index++}', this)..setBreakTarget());
1016 isBreakTarget = true; 1029 isBreakTarget = true;
1017 } else if (makeContinueLabel) { 1030 }
1031
1032 if (makeContinueLabel) {
1018 labels.add( 1033 labels.add(
1019 new LabelDefinitionX(null, 'L${index++}', this)..setContinueTarget()); 1034 new LabelDefinitionX(null, 'L${index++}', this)..setContinueTarget());
1020 isContinueTarget = true; 1035 isContinueTarget = true;
1021 } 1036 }
1022 } 1037 }
1023 1038
1024 @override 1039 @override
1025 LabelDefinition addLabel(ast.Label label, String labelName) { 1040 LabelDefinition addLabel(ast.Label label, String labelName) {
1026 LabelDefinition result = new LabelDefinitionX(label, labelName, this); 1041 LabelDefinition result = new LabelDefinitionX(label, labelName, this);
1027 labels.add(result); 1042 labels.add(result);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 JumpTarget continueTarget = 1088 JumpTarget continueTarget =
1074 astAdapter.getJumpTarget(switchCase, isContinueTarget: true); 1089 astAdapter.getJumpTarget(switchCase, isContinueTarget: true);
1075 assert(continueTarget is KernelJumpTarget); 1090 assert(continueTarget is KernelJumpTarget);
1076 targetIndexMap[continueTarget] = switchIndex; 1091 targetIndexMap[continueTarget] = switchIndex;
1077 assert(builder.jumpTargets[continueTarget] == null); 1092 assert(builder.jumpTargets[continueTarget] == null);
1078 builder.jumpTargets[continueTarget] = this; 1093 builder.jumpTargets[continueTarget] = this;
1079 switchIndex++; 1094 switchIndex++;
1080 } 1095 }
1081 } 1096 }
1082 } 1097 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/kernel/kernel_visitor.dart ('k') | tests/compiler/dart2js/kernel/loops_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698