Chromium Code Reviews| Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
| index 717bc066de9e57009f9b8ca12f1e1c682cae61b2..5fd20b7339aceed812f37551b75a812195266e85 100644 |
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart |
| @@ -2670,9 +2670,9 @@ class JsIrBuilder extends IrBuilder { |
| {bool isTypeTest}) { |
| assert(isOpen); |
| assert(isTypeTest != null); |
| + // For type tests, we must treat specially the rare cases where `null` |
|
karlklose
2015/05/28 07:42:30
Move comment back into the if branch?
Also, the t
asgerf
2015/05/28 08:52:55
It should be clear that this is not an optimizatio
|
| + // satisfies the test (which otherwise never satisfies a type test). |
| if (isTypeTest) { |
| - // The TypeOperator node does not allow the Object, dynamic, and Null types, |
| - // because the null value satisfies them. These must be handled here. |
| if (type.isObject || type.isDynamic) { |
| // `x is Object` and `x is dynamic` are always true, even if x is null. |
| return buildBooleanConstant(true); |
| @@ -2682,10 +2682,11 @@ class JsIrBuilder extends IrBuilder { |
| return addPrimitive(new ir.Identical(value, buildNullConstant())); |
| } |
| } |
| - // Null cannot not satisfy the check. Use a standard subtype check. |
| List<ir.Primitive> typeArguments = const <ir.Primitive>[]; |
| if (type is GenericType && type.typeArguments.isNotEmpty) { |
| typeArguments = type.typeArguments.map(buildTypeExpression).toList(); |
| + } else if (type is TypeVariableType) { |
| + typeArguments = <ir.Primitive>[buildTypeVariableAccess(type)]; |
| } |
| ir.Primitive check = _continueWithExpression( |
| (k) => new ir.TypeOperator(value, |