| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 import '../closure.dart'; | 5 import '../closure.dart'; |
| 6 import '../common.dart'; | 6 import '../common.dart'; |
| 7 import '../compiler.dart' show Compiler; | 7 import '../compiler.dart' show Compiler; |
| 8 import '../constants/constant_system.dart'; | 8 import '../constants/constant_system.dart'; |
| 9 import '../constants/values.dart'; | 9 import '../constants/values.dart'; |
| 10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
| (...skipping 1486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1497 abstract class HControlFlow extends HInstruction { | 1497 abstract class HControlFlow extends HInstruction { |
| 1498 HControlFlow(inputs) : super(inputs, const TypeMask.nonNullEmpty()); | 1498 HControlFlow(inputs) : super(inputs, const TypeMask.nonNullEmpty()); |
| 1499 bool isControlFlow() => true; | 1499 bool isControlFlow() => true; |
| 1500 bool isJsStatement() => true; | 1500 bool isJsStatement() => true; |
| 1501 } | 1501 } |
| 1502 | 1502 |
| 1503 // Allocates and initializes an instance. | 1503 // Allocates and initializes an instance. |
| 1504 class HCreate extends HInstruction { | 1504 class HCreate extends HInstruction { |
| 1505 final ClassElement element; | 1505 final ClassElement element; |
| 1506 | 1506 |
| 1507 /// Does this instruction have reified type information as the last input? |
| 1508 final bool hasRtiInput; |
| 1509 |
| 1507 /// If this field is not `null`, this call is from an inlined constructor and | 1510 /// If this field is not `null`, this call is from an inlined constructor and |
| 1508 /// we have to register the instantiated type in the code generator. The | 1511 /// we have to register the instantiated type in the code generator. The |
| 1509 /// [instructionType] of this node is not enough, because we also need the | 1512 /// [instructionType] of this node is not enough, because we also need the |
| 1510 /// type arguments. See also [SsaFromAstMixin.currentInlinedInstantiations]. | 1513 /// type arguments. See also [SsaFromAstMixin.currentInlinedInstantiations]. |
| 1511 List<DartType> instantiatedTypes; | 1514 List<DartType> instantiatedTypes; |
| 1512 | 1515 |
| 1513 HCreate(this.element, List<HInstruction> inputs, TypeMask type, | 1516 HCreate(this.element, List<HInstruction> inputs, TypeMask type, |
| 1514 [this.instantiatedTypes]) | 1517 {this.instantiatedTypes, this.hasRtiInput: false}) |
| 1515 : super(inputs, type); | 1518 : super(inputs, type); |
| 1516 | 1519 |
| 1520 bool get isAllocation => true; |
| 1521 |
| 1522 HInstruction get rtiInput { |
| 1523 assert(hasRtiInput); |
| 1524 return inputs.last; |
| 1525 } |
| 1526 |
| 1517 accept(HVisitor visitor) => visitor.visitCreate(this); | 1527 accept(HVisitor visitor) => visitor.visitCreate(this); |
| 1518 | 1528 |
| 1519 bool get isAllocation => true; | 1529 String toString() => 'HCreate($element, ${instantiatedTypes})'; |
| 1520 | |
| 1521 String toString() => 'HCreate($element)'; | |
| 1522 } | 1530 } |
| 1523 | 1531 |
| 1524 abstract class HInvoke extends HInstruction { | 1532 abstract class HInvoke extends HInstruction { |
| 1525 /** | 1533 /** |
| 1526 * The first argument must be the target: either an [HStatic] node, or | 1534 * The first argument must be the target: either an [HStatic] node, or |
| 1527 * the receiver of a method-call. The remaining inputs are the arguments | 1535 * the receiver of a method-call. The remaining inputs are the arguments |
| 1528 * to the invocation. | 1536 * to the invocation. |
| 1529 */ | 1537 */ |
| 1530 HInvoke(List<HInstruction> inputs, type) : super(inputs, type) { | 1538 HInvoke(List<HInstruction> inputs, type) : super(inputs, type) { |
| 1531 sideEffects.setAllSideEffects(); | 1539 sideEffects.setAllSideEffects(); |
| (...skipping 1791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3323 | 3331 |
| 3324 bool canThrow() => false; | 3332 bool canThrow() => false; |
| 3325 | 3333 |
| 3326 int typeCode() => HInstruction.TYPE_INFO_EXPRESSION_TYPECODE; | 3334 int typeCode() => HInstruction.TYPE_INFO_EXPRESSION_TYPECODE; |
| 3327 bool typeEquals(HInstruction other) => other is HTypeInfoExpression; | 3335 bool typeEquals(HInstruction other) => other is HTypeInfoExpression; |
| 3328 | 3336 |
| 3329 bool dataEquals(HTypeInfoExpression other) { | 3337 bool dataEquals(HTypeInfoExpression other) { |
| 3330 return kind == other.kind && dartType == other.dartType; | 3338 return kind == other.kind && dartType == other.dartType; |
| 3331 } | 3339 } |
| 3332 | 3340 |
| 3333 String toString() => 'HTypeInfoExpression $kindAsString $dartType'; | 3341 String toString() => 'HTypeInfoExpression($kindAsString, $dartType)'; |
| 3334 | 3342 |
| 3335 String get kindAsString { | 3343 String get kindAsString { |
| 3336 switch (kind) { | 3344 switch (kind) { |
| 3337 case TypeInfoExpressionKind.COMPLETE: | 3345 case TypeInfoExpressionKind.COMPLETE: |
| 3338 return 'COMPLETE'; | 3346 return 'COMPLETE'; |
| 3339 case TypeInfoExpressionKind.INSTANCE: | 3347 case TypeInfoExpressionKind.INSTANCE: |
| 3340 return 'INSTANCE'; | 3348 return 'INSTANCE'; |
| 3341 } | 3349 } |
| 3342 } | 3350 } |
| 3343 } | 3351 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3437 class HDynamicType extends HRuntimeType { | 3445 class HDynamicType extends HRuntimeType { |
| 3438 HDynamicType(DynamicType dartType, TypeMask instructionType) | 3446 HDynamicType(DynamicType dartType, TypeMask instructionType) |
| 3439 : super(const <HInstruction>[], dartType, instructionType); | 3447 : super(const <HInstruction>[], dartType, instructionType); |
| 3440 | 3448 |
| 3441 accept(HVisitor visitor) => visitor.visitDynamicType(this); | 3449 accept(HVisitor visitor) => visitor.visitDynamicType(this); |
| 3442 | 3450 |
| 3443 int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE; | 3451 int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE; |
| 3444 | 3452 |
| 3445 bool typeEquals(HInstruction other) => other is HDynamicType; | 3453 bool typeEquals(HInstruction other) => other is HDynamicType; |
| 3446 } | 3454 } |
| OLD | NEW |