Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library dart2js.ir_builder; | 5 library dart2js.ir_builder; |
| 6 | 6 |
| 7 import '../constants/constant_system.dart'; | 7 import '../constants/constant_system.dart'; |
| 8 import '../constants/expressions.dart'; | 8 import '../constants/expressions.dart'; |
| 9 import '../constants/values.dart' show PrimitiveConstantValue; | 9 import '../constants/values.dart' show PrimitiveConstantValue; |
| 10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
| (...skipping 2652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2663 List<ir.Primitive> arguments) { | 2663 List<ir.Primitive> arguments) { |
| 2664 return addPrimitive(new ir.CreateInvocationMirror(selector, arguments)); | 2664 return addPrimitive(new ir.CreateInvocationMirror(selector, arguments)); |
| 2665 } | 2665 } |
| 2666 | 2666 |
| 2667 @override | 2667 @override |
| 2668 ir.Primitive buildTypeOperator(ir.Primitive value, | 2668 ir.Primitive buildTypeOperator(ir.Primitive value, |
| 2669 DartType type, | 2669 DartType type, |
| 2670 {bool isTypeTest}) { | 2670 {bool isTypeTest}) { |
| 2671 assert(isOpen); | 2671 assert(isOpen); |
| 2672 assert(isTypeTest != null); | 2672 assert(isTypeTest != null); |
| 2673 // 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
| |
| 2674 // satisfies the test (which otherwise never satisfies a type test). | |
| 2673 if (isTypeTest) { | 2675 if (isTypeTest) { |
| 2674 // The TypeOperator node does not allow the Object, dynamic, and Null type s, | |
| 2675 // because the null value satisfies them. These must be handled here. | |
| 2676 if (type.isObject || type.isDynamic) { | 2676 if (type.isObject || type.isDynamic) { |
| 2677 // `x is Object` and `x is dynamic` are always true, even if x is null. | 2677 // `x is Object` and `x is dynamic` are always true, even if x is null. |
| 2678 return buildBooleanConstant(true); | 2678 return buildBooleanConstant(true); |
| 2679 } | 2679 } |
| 2680 if (type is InterfaceType && type.element == program.nullClass) { | 2680 if (type is InterfaceType && type.element == program.nullClass) { |
| 2681 // `x is Null` is true if and only if x is null. | 2681 // `x is Null` is true if and only if x is null. |
| 2682 return addPrimitive(new ir.Identical(value, buildNullConstant())); | 2682 return addPrimitive(new ir.Identical(value, buildNullConstant())); |
| 2683 } | 2683 } |
| 2684 } | 2684 } |
| 2685 // Null cannot not satisfy the check. Use a standard subtype check. | |
| 2686 List<ir.Primitive> typeArguments = const <ir.Primitive>[]; | 2685 List<ir.Primitive> typeArguments = const <ir.Primitive>[]; |
| 2687 if (type is GenericType && type.typeArguments.isNotEmpty) { | 2686 if (type is GenericType && type.typeArguments.isNotEmpty) { |
| 2688 typeArguments = type.typeArguments.map(buildTypeExpression).toList(); | 2687 typeArguments = type.typeArguments.map(buildTypeExpression).toList(); |
| 2688 } else if (type is TypeVariableType) { | |
| 2689 typeArguments = <ir.Primitive>[buildTypeVariableAccess(type)]; | |
| 2689 } | 2690 } |
| 2690 ir.Primitive check = _continueWithExpression( | 2691 ir.Primitive check = _continueWithExpression( |
| 2691 (k) => new ir.TypeOperator(value, | 2692 (k) => new ir.TypeOperator(value, |
| 2692 type, typeArguments, k, isTypeTest: isTypeTest)); | 2693 type, typeArguments, k, isTypeTest: isTypeTest)); |
| 2693 return check; | 2694 return check; |
| 2694 } | 2695 } |
| 2695 } | 2696 } |
| 2696 | 2697 |
| 2697 | 2698 |
| 2698 /// Location of a variable relative to a given closure. | 2699 /// Location of a variable relative to a given closure. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2766 } | 2767 } |
| 2767 | 2768 |
| 2768 /// Synthetic parameter to a JavaScript factory method that takes the type | 2769 /// Synthetic parameter to a JavaScript factory method that takes the type |
| 2769 /// argument given for the type variable [variable]. | 2770 /// argument given for the type variable [variable]. |
| 2770 class TypeInformationParameter implements Local { | 2771 class TypeInformationParameter implements Local { |
| 2771 final TypeVariableElement variable; | 2772 final TypeVariableElement variable; |
| 2772 final ExecutableElement executableContext; | 2773 final ExecutableElement executableContext; |
| 2773 TypeInformationParameter(this.variable, this.executableContext); | 2774 TypeInformationParameter(this.variable, this.executableContext); |
| 2774 String get name => variable.name; | 2775 String get name => variable.name; |
| 2775 } | 2776 } |
| OLD | NEW |