Chromium Code Reviews| 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'; |
| } |