Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/ssa/nodes.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart |
| index 3f47849b369b465680dc3bcf56aa2d340402e932..5dccf1b53e04a9bd7ff6ca4770b8d3bd44f403e6 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart |
| @@ -1110,6 +1110,7 @@ abstract class HInstruction implements Spannable { |
| HInstruction convertType(Compiler compiler, DartType type, int kind) { |
| if (type == null) return this; |
| + type = type.unalias(compiler); |
| // Only the builder knows how to create [HTypeConversion] |
| // instructions with generics. It has the generic type context |
| // available. |
| @@ -1117,7 +1118,6 @@ abstract class HInstruction implements Spannable { |
| // TODO(5022): Generic typedefs should not be handled here. |
|
karlklose
2013/06/20 07:32:55
This TODO is obsolete now.
Johnni Winther
2013/06/21 12:19:15
Removed.
|
| assert(type.isRaw |
| || type.isMalformed |
| - || type.kind == TypeKind.TYPEDEF |
| || type.kind == TypeKind.FUNCTION); |
| if (identical(type.element, compiler.dynamicClass)) return this; |
| if (identical(type.element, compiler.objectClass)) return this; |
| @@ -2251,6 +2251,7 @@ class HTypeConversion extends HCheck { |
| final DartType typeExpression; |
| final int kind; |
| final Selector receiverTypeCheckSelector; |
| + final bool contextIsTypeArguments; |
| static const int NO_CHECK = 0; |
| static const int CHECKED_MODE_CHECK = 1; |
| @@ -2262,8 +2263,11 @@ class HTypeConversion extends HCheck { |
| HTypeConversion(this.typeExpression, this.kind, |
| HType type, HInstruction input, |
| [this.receiverTypeCheckSelector]) |
| - : super(<HInstruction>[input]) { |
| + : contextIsTypeArguments = false, |
| + super(<HInstruction>[input]) { |
| assert(!isReceiverTypeCheck || receiverTypeCheckSelector != null); |
| + assert(typeExpression == null || |
| + typeExpression.kind != TypeKind.TYPEDEF); |
| sourceElement = input.sourceElement; |
| instructionType = type; |
| } |
| @@ -2271,8 +2275,21 @@ class HTypeConversion extends HCheck { |
| HTypeConversion.withTypeRepresentation(this.typeExpression, this.kind, |
| HType type, HInstruction input, |
| HInstruction typeRepresentation) |
| - : super(<HInstruction>[input, typeRepresentation]), |
| + : contextIsTypeArguments = false, |
| + super(<HInstruction>[input, typeRepresentation]), |
| receiverTypeCheckSelector = null { |
| + assert(typeExpression.kind != TypeKind.TYPEDEF); |
| + sourceElement = input.sourceElement; |
| + instructionType = type; |
| + } |
| + |
| + HTypeConversion.withContext(this.typeExpression, this.kind, |
| + HType type, HInstruction input, |
| + HInstruction context, |
| + {bool this.contextIsTypeArguments}) |
| + : super(<HInstruction>[input, context]), |
| + receiverTypeCheckSelector = null { |
| + assert(typeExpression.kind != TypeKind.TYPEDEF); |
| sourceElement = input.sourceElement; |
| instructionType = type; |
| } |
| @@ -2280,6 +2297,9 @@ class HTypeConversion extends HCheck { |
| bool get hasTypeRepresentation => inputs.length > 1; |
| HInstruction get typeRepresentation => inputs[1]; |
| + bool get hasContext => inputs.length > 1; |
|
karlklose
2013/06/20 07:32:55
So we distinguish an HIs withTypeRepresentation fr
Johnni Winther
2013/06/21 12:19:15
Done.
|
| + HInstruction get context => inputs[1]; |
| + |
| HInstruction convertType(Compiler compiler, DartType type, int kind) { |
| if (typeExpression == type) return this; |
| return super.convertType(compiler, type, kind); |