OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library kernel.type_propagation.selfcheck; | 4 library kernel.type_propagation.selfcheck; |
5 | 5 |
6 import 'dart:io'; | 6 import 'dart:io'; |
7 import 'package:kernel/core_types.dart'; | 7 import 'package:kernel/core_types.dart'; |
8 import 'package:kernel/kernel.dart'; | 8 import 'package:kernel/kernel.dart'; |
9 import 'package:kernel/type_propagation/type_propagation.dart'; | 9 import 'package:kernel/type_propagation/type_propagation.dart'; |
10 | 10 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 | 148 |
149 // List of conditions that all must hold. For each zero bit we know that | 149 // List of conditions that all must hold. For each zero bit we know that |
150 // type of value is not allowed to occur. | 150 // type of value is not allowed to occur. |
151 List<Expression> allChecks = <Expression>[]; | 151 List<Expression> allChecks = <Expression>[]; |
152 | 152 |
153 // List of condition of which one must hold. This is used for checking the | 153 // List of condition of which one must hold. This is used for checking the |
154 // [ValueBit.other] bit. For each one bit, we know that type of value | 154 // [ValueBit.other] bit. For each one bit, we know that type of value |
155 // is allowed to occur. We use this because it is hard to check directly | 155 // is allowed to occur. We use this because it is hard to check directly |
156 // that a value is of the 'other' type. | 156 // that a value is of the 'other' type. |
157 bool disallowOtherValues = expected.valueBits & ValueBit.other == 0; | 157 bool disallowOtherValues = expected.valueBits & ValueBit.other == 0; |
158 List<Expression> anyChecks = disallowOtherValues | 158 List<Expression> anyChecks = disallowOtherValues ? <Expression>[] : null; |
159 ? <Expression>[] | |
160 : null; | |
161 | 159 |
162 void checkType(int bit, DartType type) { | 160 void checkType(int bit, DartType type) { |
163 if (expected.valueBits & bit == 0) { | 161 if (expected.valueBits & bit == 0) { |
164 allChecks | 162 allChecks |
165 .add(new Not(new IsExpression(new VariableGet(variable), type))); | 163 .add(new Not(new IsExpression(new VariableGet(variable), type))); |
166 } else if (disallowOtherValues) { | 164 } else if (disallowOtherValues) { |
167 anyChecks.add(new IsExpression(new VariableGet(variable), type)); | 165 anyChecks.add(new IsExpression(new VariableGet(variable), type)); |
168 } | 166 } |
169 } | 167 } |
170 | 168 |
171 checkType(ValueBit.integer, coreTypes.intClass.rawType); | 169 checkType(ValueBit.integer, coreTypes.intClass.rawType); |
172 checkType(ValueBit.double_, coreTypes.doubleClass.rawType); | 170 checkType(ValueBit.double_, coreTypes.doubleClass.rawType); |
173 checkType(ValueBit.string, coreTypes.stringClass.rawType); | 171 checkType(ValueBit.string, coreTypes.stringClass.rawType); |
174 checkType(ValueBit.null_, coreTypes.nullClass.rawType); | 172 checkType(ValueBit.null_, coreTypes.nullClass.rawType); |
175 | 173 |
176 if (disallowOtherValues) { | 174 if (disallowOtherValues) { |
177 Expression any = | 175 Expression any = |
178 anyChecks.reduce((e1, e2) => new LogicalExpression(e1, '||', e2)); | 176 anyChecks.reduce((e1, e2) => new LogicalExpression(e1, '||', e2)); |
179 allChecks.add(any); | 177 allChecks.add(any); |
180 } | 178 } |
181 return allChecks.isEmpty | 179 return allChecks.isEmpty |
182 ? new BoolLiteral(true) | 180 ? new BoolLiteral(true) |
183 : allChecks.reduce((e1, e2) => new LogicalExpression(e1, '&&', e2)); | 181 : allChecks.reduce((e1, e2) => new LogicalExpression(e1, '&&', e2)); |
184 } | 182 } |
185 } | 183 } |
OLD | NEW |