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

Unified Diff: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart

Issue 2637483002: Implement switch statement, without the "complex switch statement" (aka switch statement with conti… (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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index a865f1c6bd6394767f5ed38b483119306bc2bc27..b7899b84314259a144bf692aedc48df532eca6a4 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -27,6 +27,7 @@ import '../universe/call_structure.dart';
import '../universe/selector.dart';
import '../universe/side_effects.dart';
import '../world.dart';
+import 'jump_handler.dart' show SwitchCaseJumpHandler;
import 'locals_handler.dart';
import 'types.dart';
@@ -40,8 +41,8 @@ class KernelAstAdapter {
final Map<ir.Node, Element> _nodeToElement;
final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals =
<ir.VariableDeclaration, SyntheticLocal>{};
- final Map<ir.LabeledStatement, KernelJumpTarget> _jumpTargets =
- <ir.LabeledStatement, KernelJumpTarget>{};
+ final Map<ir.TreeNode, KernelJumpTarget> _jumpTargets =
sra1 2017/01/14 03:18:22 Are they still ir.Statements?
Emily Fortuna 2017/01/17 23:33:09 See below.
+ <ir.TreeNode, KernelJumpTarget>{};
DartTypeConverter _typeConverter;
ResolvedAst _resolvedAst;
@@ -366,14 +367,13 @@ class KernelAstAdapter {
LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary;
- JumpTarget getTargetDefinition(ir.Node node) =>
- elements.getTargetDefinition(getNode(node));
-
- JumpTarget getTargetOf(ir.Node node) => elements.getTargetOf(getNode(node));
-
- KernelJumpTarget getJumpTarget(ir.LabeledStatement labeledStatement) =>
- _jumpTargets.putIfAbsent(labeledStatement, () {
- return new KernelJumpTarget();
+ KernelJumpTarget getJumpTarget(ir.TreeNode node) =>
+ _jumpTargets.putIfAbsent(node, () {
+ if (node is ir.LabeledStatement &&
+ _jumpTargets.containsKey((node as ir.LabeledStatement).body)) {
+ return _jumpTargets[(node as ir.LabeledStatement).body];
+ }
+ return new KernelJumpTarget(node);
});
LabelDefinition getTargetLabel(ir.Node node) =>
@@ -405,6 +405,13 @@ class KernelAstAdapter {
TypeMaskFactory.inferredReturnTypeForElement(
_backend.helpers.traceFromException, _globalInferenceResults);
+ ir.Procedure get fallThroughError =>
+ kernel.functions[_backend.helpers.fallThroughError];
+
+ TypeMask get fallThroughErrorType =>
+ TypeMaskFactory.inferredReturnTypeForElement(
+ _backend.helpers.fallThroughError, _globalInferenceResults);
+
ir.Procedure get mapLiteralUntypedMaker =>
kernel.functions[_backend.helpers.mapLiteralUntypedMaker];
@@ -923,24 +930,31 @@ class Constantifier extends ir.ExpressionVisitor<ConstantExpression> {
class KernelJumpTarget extends JumpTarget {
static int index = 0;
- KernelJumpTarget() {
- labels = <LabelDefinition>[
- new LabelDefinitionX(null, 'l${index++}', this)..setBreakTarget()
- ];
- }
+ /// Pointer to the actual executable statements that a jump target refers to.
+ /// If this jump target was not initially constructed with a LabeledStatement,
+ /// this value is identical to originalStatement.
+ ir.Node targetStatement;
sra1 2017/01/14 03:18:22 ir.Statement ?
Emily Fortuna 2017/01/17 23:33:09 Unfortunately no. This can be a SwitchCase, which
sra1 2017/01/18 23:31:28 Ok, perhaps say this in the comment.
Emily Fortuna 2017/01/19 00:21:22 Done.
- @override
- bool get isBreakTarget => true;
+ /// The original statement used to construct this jump target.
+ /// If this jump target was not initially constructed with a LabeledStatement,
+ /// this value is identical to targetStatement.
+ ir.Node originalStatement;
- set isBreakTarget(bool x) {
- // do nothing, these are always break targets
- }
+ @override
+ bool isBreakTarget = false;
@override
- bool get isContinueTarget => false;
+ bool isContinueTarget = false;
- set isContinueTarget(bool x) {
- // do nothing, these are always break targets
+ KernelJumpTarget(this.targetStatement) {
+ labels = <LabelDefinition>[];
+ originalStatement = targetStatement;
+ if (targetStatement is ir.LabeledStatement) {
+ targetStatement = (targetStatement as ir.LabeledStatement).body;
+ labels.add(
+ new LabelDefinitionX(null, 'l${index++}', this)..setBreakTarget());
sra1 2017/01/14 03:18:22 Figure out how to make the label consistent. Maybe
Emily Fortuna 2017/01/17 23:33:09 what do you mean by consistent? I made the capital
sra1 2017/01/18 23:31:28 I mean that every function starts with L0, rather
Emily Fortuna 2017/01/19 00:21:22 Done.
+ isBreakTarget = true;
+ }
}
@override
@@ -954,10 +968,10 @@ class KernelJumpTarget extends JumpTarget {
ExecutableElement get executableContext => null;
@override
- bool get isSwitch => false;
+ bool get isSwitch => targetStatement is ir.SwitchStatement;
@override
- bool get isTarget => true;
+ bool get isTarget => isBreakTarget || isContinueTarget;
@override
List<LabelDefinition> labels;
@@ -970,4 +984,6 @@ class KernelJumpTarget extends JumpTarget {
@override
ast.Node get statement => null;
+
+ String toString() => 'Target:$targetStatement';
}

Powered by Google App Engine
This is Rietveld 408576698