| 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 '../constant_system_dart.dart'; | 5 import '../constant_system_dart.dart'; |
| 6 import '../constants/constant_system.dart'; | 6 import '../constants/constant_system.dart'; |
| 7 import '../constants/values.dart'; | 7 import '../constants/values.dart'; |
| 8 import '../world.dart' show ClosedWorld; | 8 import '../world.dart' show ClosedWorld; |
| 9 import 'nodes.dart'; | 9 import 'nodes.dart'; |
| 10 import 'optimize.dart'; | 10 import 'optimize.dart'; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 } | 125 } |
| 126 | 126 |
| 127 /** | 127 /** |
| 128 * An [IntValue] contains a constant integer value. | 128 * An [IntValue] contains a constant integer value. |
| 129 */ | 129 */ |
| 130 class IntValue extends Value { | 130 class IntValue extends Value { |
| 131 final int value; | 131 final int value; |
| 132 | 132 |
| 133 const IntValue(this.value, info) : super(info); | 133 const IntValue(this.value, info) : super(info); |
| 134 | 134 |
| 135 Value operator +(other) { | 135 Value operator +(dynamic other) { |
| 136 if (other.isZero) return this; | 136 if (other.isZero) return this; |
| 137 if (other is! IntValue) return other + this; | 137 if (other is! IntValue) return other + this; |
| 138 ConstantSystem constantSystem = info.constantSystem; | 138 ConstantSystem constantSystem = info.constantSystem; |
| 139 var constant = constantSystem.add.fold( | 139 dynamic constant = constantSystem.add.fold( |
| 140 constantSystem.createInt(value), constantSystem.createInt(other.value)); | 140 constantSystem.createInt(value), constantSystem.createInt(other.value)); |
| 141 if (!constant.isInt) return const UnknownValue(); | 141 if (!constant.isInt) return const UnknownValue(); |
| 142 return info.newIntValue(constant.primitiveValue); | 142 return info.newIntValue(constant.primitiveValue); |
| 143 } | 143 } |
| 144 | 144 |
| 145 Value operator -(other) { | 145 Value operator -(dynamic other) { |
| 146 if (other.isZero) return this; | 146 if (other.isZero) return this; |
| 147 if (other is! IntValue) return -other + this; | 147 if (other is! IntValue) return -other + this; |
| 148 ConstantSystem constantSystem = info.constantSystem; | 148 ConstantSystem constantSystem = info.constantSystem; |
| 149 var constant = constantSystem.subtract.fold( | 149 dynamic constant = constantSystem.subtract.fold( |
| 150 constantSystem.createInt(value), constantSystem.createInt(other.value)); | 150 constantSystem.createInt(value), constantSystem.createInt(other.value)); |
| 151 if (!constant.isInt) return const UnknownValue(); | 151 if (!constant.isInt) return const UnknownValue(); |
| 152 return info.newIntValue(constant.primitiveValue); | 152 return info.newIntValue(constant.primitiveValue); |
| 153 } | 153 } |
| 154 | 154 |
| 155 Value operator -() { | 155 Value operator -() { |
| 156 if (isZero) return this; | 156 if (isZero) return this; |
| 157 ConstantSystem constantSystem = info.constantSystem; | 157 ConstantSystem constantSystem = info.constantSystem; |
| 158 var constant = constantSystem.negate.fold(constantSystem.createInt(value)); | 158 dynamic constant = |
| 159 constantSystem.negate.fold(constantSystem.createInt(value)); |
| 159 if (!constant.isInt) return const UnknownValue(); | 160 if (!constant.isInt) return const UnknownValue(); |
| 160 return info.newIntValue(constant.primitiveValue); | 161 return info.newIntValue(constant.primitiveValue); |
| 161 } | 162 } |
| 162 | 163 |
| 163 Value operator &(other) { | 164 Value operator &(dynamic other) { |
| 164 if (other is! IntValue) return const UnknownValue(); | 165 if (other is! IntValue) return const UnknownValue(); |
| 165 ConstantSystem constantSystem = info.constantSystem; | 166 ConstantSystem constantSystem = info.constantSystem; |
| 166 var constant = constantSystem.bitAnd.fold( | 167 dynamic constant = constantSystem.bitAnd.fold( |
| 167 constantSystem.createInt(value), constantSystem.createInt(other.value)); | 168 constantSystem.createInt(value), constantSystem.createInt(other.value)); |
| 168 return info.newIntValue(constant.primitiveValue); | 169 return info.newIntValue(constant.primitiveValue); |
| 169 } | 170 } |
| 170 | 171 |
| 171 Value min(other) { | 172 Value min(dynamic other) { |
| 172 if (other is! IntValue) return other.min(this); | 173 if (other is! IntValue) return other.min(this); |
| 173 return this.value < other.value ? this : other; | 174 return this.value < other.value ? this : other; |
| 174 } | 175 } |
| 175 | 176 |
| 176 Value max(other) { | 177 Value max(dynamic other) { |
| 177 if (other is! IntValue) return other.max(this); | 178 if (other is! IntValue) return other.max(this); |
| 178 return this.value < other.value ? other : this; | 179 return this.value < other.value ? other : this; |
| 179 } | 180 } |
| 180 | 181 |
| 181 bool operator ==(other) { | 182 bool operator ==(other) { |
| 182 if (other is! IntValue) return false; | 183 if (other is! IntValue) return false; |
| 183 return this.value == other.value; | 184 return this.value == other.value; |
| 184 } | 185 } |
| 185 | 186 |
| 186 int get hashCode => throw new UnsupportedError('IntValue.hashCode'); | 187 int get hashCode => throw new UnsupportedError('IntValue.hashCode'); |
| (...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 962 rightRange.lower + info.intOne, const MaxIntValue()); | 963 rightRange.lower + info.intOne, const MaxIntValue()); |
| 963 } else if (operation == const GreaterEqualOperation()) { | 964 } else if (operation == const GreaterEqualOperation()) { |
| 964 range = info.newNormalizedRange(rightRange.lower, const MaxIntValue()); | 965 range = info.newNormalizedRange(rightRange.lower, const MaxIntValue()); |
| 965 } else { | 966 } else { |
| 966 range = info.newUnboundRange(); | 967 range = info.newUnboundRange(); |
| 967 } | 968 } |
| 968 return range.intersection(leftRange); | 969 return range.intersection(leftRange); |
| 969 } | 970 } |
| 970 | 971 |
| 971 Range visitConditionalBranch(HConditionalBranch branch) { | 972 Range visitConditionalBranch(HConditionalBranch branch) { |
| 972 var condition = branch.condition; | 973 dynamic condition = branch.condition; |
| 973 // TODO(ngeoffray): Handle complex conditions. | 974 // TODO(ngeoffray): Handle complex conditions. |
| 974 if (condition is! HRelational) return info.newUnboundRange(); | 975 if (condition is! HRelational) return info.newUnboundRange(); |
| 975 if (condition is HIdentity) return info.newUnboundRange(); | 976 if (condition is HIdentity) return info.newUnboundRange(); |
| 976 HInstruction right = condition.right; | 977 HInstruction right = condition.right; |
| 977 HInstruction left = condition.left; | 978 HInstruction left = condition.left; |
| 978 if (!left.isInteger(closedWorld)) return info.newUnboundRange(); | 979 if (!left.isInteger(closedWorld)) return info.newUnboundRange(); |
| 979 if (!right.isInteger(closedWorld)) return info.newUnboundRange(); | 980 if (!right.isInteger(closedWorld)) return info.newUnboundRange(); |
| 980 | 981 |
| 981 Range rightRange = ranges[right]; | 982 Range rightRange = ranges[right]; |
| 982 Range leftRange = ranges[left]; | 983 Range leftRange = ranges[left]; |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1101 } | 1102 } |
| 1102 | 1103 |
| 1103 Range handleBinaryOperation(HBinaryArithmetic instruction) { | 1104 Range handleBinaryOperation(HBinaryArithmetic instruction) { |
| 1104 Range leftRange = visit(instruction.left); | 1105 Range leftRange = visit(instruction.left); |
| 1105 Range rightRange = visit(instruction.right); | 1106 Range rightRange = visit(instruction.right); |
| 1106 if (leftRange == null || rightRange == null) return null; | 1107 if (leftRange == null || rightRange == null) return null; |
| 1107 BinaryOperation operation = instruction.operation(info.constantSystem); | 1108 BinaryOperation operation = instruction.operation(info.constantSystem); |
| 1108 return operation.apply(leftRange, rightRange); | 1109 return operation.apply(leftRange, rightRange); |
| 1109 } | 1110 } |
| 1110 } | 1111 } |
| OLD | NEW |