| Index: lib/compiler/implementation/ssa/nodes.dart
|
| diff --git a/lib/compiler/implementation/ssa/nodes.dart b/lib/compiler/implementation/ssa/nodes.dart
|
| index f657bfcc4bbc28b8987838ea9aa22b6a44f0942a..005083d84bf46472956ab639673b09369597210d 100644
|
| --- a/lib/compiler/implementation/ssa/nodes.dart
|
| +++ b/lib/compiler/implementation/ssa/nodes.dart
|
| @@ -1490,8 +1490,6 @@ class HSubtract extends HBinaryArithmetic {
|
| * An [HSwitch] instruction has one input for the incoming
|
| * value, and one input per constant that it can switch on.
|
| * Its block has one successor per constant, and one for the default.
|
| - * If the switch didn't have a default case, the last successor is
|
| - * the join block.
|
| */
|
| class HSwitch extends HControlFlow {
|
| HSwitch(List<HInstruction> inputs) : super(inputs);
|
| @@ -1499,6 +1497,11 @@ class HSwitch extends HControlFlow {
|
| HConstant constant(int index) => inputs[index + 1];
|
| HInstruction get expression() => inputs[0];
|
|
|
| + /**
|
| + * Provides the target to jump to if none of the constants match
|
| + * the expression. If the switch had no default case, this is the
|
| + * following join-block.
|
| + */
|
| HBasicBlock get defaultTarget() => block.successors.last();
|
|
|
| accept(HVisitor visitor) => visitor.visitSwitch(this);
|
| @@ -1832,7 +1835,7 @@ class HNot extends HInstruction {
|
| * value from the start, whereas [HLocalValue]s need to be initialized first.
|
| */
|
| class HLocalValue extends HInstruction {
|
| - HLocalValue(element) : super(<HInstruction>[]) {
|
| + HLocalValue(Element element) : super(<HInstruction>[]) {
|
| sourceElement = element;
|
| }
|
|
|
| @@ -1845,7 +1848,7 @@ class HLocalValue extends HInstruction {
|
| }
|
|
|
| class HParameterValue extends HLocalValue {
|
| - HParameterValue(element) : super(element);
|
| + HParameterValue(Element element) : super(element);
|
|
|
| toString() => 'parameter ${sourceElement.name}';
|
| accept(HVisitor visitor) => visitor.visitParameterValue(this);
|
| @@ -2254,22 +2257,24 @@ class HTypeConversion extends HCheck {
|
| static final int NO_CHECK = 0;
|
| static final int CHECKED_MODE_CHECK = 1;
|
| static final int ARGUMENT_TYPE_CHECK = 2;
|
| + static final int CAST_TYPE_CHECK = 3;
|
|
|
| - HTypeConversion(HType type, HInstruction input)
|
| - : this.internal(type, input, NO_CHECK);
|
| - HTypeConversion.checkedModeCheck(HType type, HInstruction input)
|
| - : this.internal(type, input, CHECKED_MODE_CHECK);
|
| - HTypeConversion.argumentTypeCheck(HType type, HInstruction input)
|
| - : this.internal(type, input, ARGUMENT_TYPE_CHECK);
|
| -
|
| - HTypeConversion.internal(this.type, HInstruction input, this.kind)
|
| + HTypeConversion(this.type, HInstruction input, [this.kind = NO_CHECK])
|
| : super(<HInstruction>[input]) {
|
| sourceElement = input.sourceElement;
|
| }
|
| + HTypeConversion.checkedModeCheck(HType type, HInstruction input)
|
| + : this(type, input, CHECKED_MODE_CHECK);
|
| + HTypeConversion.argumentTypeCheck(HType type, HInstruction input)
|
| + : this(type, input, ARGUMENT_TYPE_CHECK);
|
| + HTypeConversion.castCheck(HType type, HInstruction input)
|
| + : this(type, intpu, CAST_TYPE_CHECK);
|
| +
|
|
|
| - bool isChecked() => kind != NO_CHECK;
|
| - bool isCheckedModeCheck() => kind == CHECKED_MODE_CHECK;
|
| - bool isArgumentTypeCheck() => kind == ARGUMENT_TYPE_CHECK;
|
| + bool get isChecked() => kind != NO_CHECK;
|
| + bool get isCheckedModeCheck() => kind == CHECKED_MODE_CHECK;
|
| + bool get isArgumentTypeCheck() => kind == ARGUMENT_TYPE_CHECK;
|
| + bool get isCastTypeCheck() => kind == CAST_TYPE_CHECK;
|
|
|
| HType get guaranteedType() => type;
|
|
|
|
|