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

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

Issue 2497313003: Fix HTypeConversion.checkedInput (Closed)
Patch Set: Add some comments Created 4 years, 1 month 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
« no previous file with comments | « pkg/compiler/lib/src/ssa/codegen.dart ('k') | pkg/compiler/lib/src/ssa/optimize.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/nodes.dart
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index f2d1af7022316fca4b1200b6a19a841ebf8575d6..712ff298bf4671b42b0350325a08196fcdd62538 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -2801,23 +2801,29 @@ class HIsViaInterceptor extends HLateInstruction {
}
class HTypeConversion extends HCheck {
- final DartType typeExpression;
- final int kind;
- final Selector receiverTypeCheckSelector;
- final bool contextIsTypeArguments;
- TypeMask checkedType; // Not final because we refine it.
-
+ // Values for [kind].
static const int CHECKED_MODE_CHECK = 0;
static const int ARGUMENT_TYPE_CHECK = 1;
static const int CAST_TYPE_CHECK = 2;
static const int BOOLEAN_CONVERSION_CHECK = 3;
static const int RECEIVER_TYPE_CHECK = 4;
+ final DartType typeExpression;
+ final int kind;
+ // [receiverTypeCheckSelector] is the selector used for a receiver type check
+ // on open-coded operators, e.g. the not-null check on `x` in `x + 1` would be
+ // compiled to the following, for which we need the selector `$add`.
+ //
+ // if (typeof x != "number") x.$add();
+ //
+ final Selector receiverTypeCheckSelector;
+
+ TypeMask checkedType; // Not final because we refine it.
+
HTypeConversion(
this.typeExpression, this.kind, TypeMask type, HInstruction input,
- [this.receiverTypeCheckSelector])
- : contextIsTypeArguments = false,
- checkedType = type,
+ {this.receiverTypeCheckSelector})
+ : checkedType = type,
super(<HInstruction>[input], type) {
assert(!isReceiverTypeCheck || receiverTypeCheckSelector != null);
assert(typeExpression == null || typeExpression.kind != TypeKind.TYPEDEF);
@@ -2826,21 +2832,21 @@ class HTypeConversion extends HCheck {
HTypeConversion.withTypeRepresentation(this.typeExpression, this.kind,
TypeMask type, HInstruction input, HInstruction typeRepresentation)
- : contextIsTypeArguments = false,
- checkedType = type,
+ : checkedType = type,
super(<HInstruction>[input, typeRepresentation], type),
receiverTypeCheckSelector = null {
assert(typeExpression.kind != TypeKind.TYPEDEF);
sourceElement = input.sourceElement;
}
- HTypeConversion.withContext(this.typeExpression, this.kind, TypeMask type,
- HInstruction input, HInstruction context,
- {bool this.contextIsTypeArguments})
- : super(<HInstruction>[input, context], type),
- checkedType = type,
+ HTypeConversion.viaMethodOnType(this.typeExpression, this.kind, TypeMask type,
+ HInstruction reifiedType, HInstruction input)
+ : checkedType = type,
+ super(<HInstruction>[reifiedType, input], type),
receiverTypeCheckSelector = null {
- assert(typeExpression.kind != TypeKind.TYPEDEF);
+ // This form is currently used only for function types.
+ assert(typeExpression.isFunctionType);
+ assert(kind == CHECKED_MODE_CHECK || kind == CAST_TYPE_CHECK);
sourceElement = input.sourceElement;
}
@@ -2850,11 +2856,11 @@ class HTypeConversion extends HCheck {
HInstruction get typeRepresentation => inputs[1];
- bool get hasContext {
- return typeExpression.isFunctionType && inputs.length > 1;
- }
+ bool get usesMethodOnType =>
+ typeExpression != null && typeExpression.isFunctionType;
- HInstruction get context => inputs[1];
+ HInstruction get checkedInput =>
+ usesMethodOnType ? inputs[1] : super.checkedInput;
HInstruction convertType(Compiler compiler, DartType type, int kind) {
if (typeExpression == type) {
« no previous file with comments | « pkg/compiler/lib/src/ssa/codegen.dart ('k') | pkg/compiler/lib/src/ssa/optimize.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698