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 part of ssa; | 5 part of ssa; |
6 | 6 |
7 abstract class HVisitor<R> { | 7 abstract class HVisitor<R> { |
8 R visitAdd(HAdd node); | 8 R visitAdd(HAdd node); |
9 R visitBitAnd(HBitAnd node); | 9 R visitBitAnd(HBitAnd node); |
10 R visitBitNot(HBitNot node); | 10 R visitBitNot(HBitNot node); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 } | 155 } |
156 | 156 |
157 HBasicBlock addNewLoopHeaderBlock(TargetElement target, | 157 HBasicBlock addNewLoopHeaderBlock(TargetElement target, |
158 List<LabelElement> labels) { | 158 List<LabelElement> labels) { |
159 HBasicBlock result = addNewBlock(); | 159 HBasicBlock result = addNewBlock(); |
160 result.loopInformation = | 160 result.loopInformation = |
161 new HLoopInformation(result, target, labels); | 161 new HLoopInformation(result, target, labels); |
162 return result; | 162 return result; |
163 } | 163 } |
164 | 164 |
165 static TypeMask mapConstantTypeToSsaType(Constant constant, | |
166 Compiler compiler) { | |
167 JavaScriptBackend backend = compiler.backend; | |
168 if (constant.isNull()) return backend.nullType; | |
169 if (constant.isBool()) return backend.boolType; | |
170 if (constant.isInt()) return backend.intType; | |
171 if (constant.isDouble()) return backend.doubleType; | |
172 if (constant.isString()) return backend.stringType; | |
173 if (constant.isList()) return backend.readableArrayType; | |
174 if (constant.isFunction()) return backend.nonNullType; | |
175 if (constant.isSentinel()) return backend.nonNullType; | |
176 // TODO(sra): What is the type of the prototype of an interceptor? | |
177 if (constant.isInterceptor()) return backend.nonNullType; | |
178 ObjectConstant objectConstant = constant; | |
179 if (backend.isInterceptorClass(objectConstant.type.element)) { | |
180 return backend.nonNullType; | |
181 } | |
182 return new TypeMask.nonNullExact(objectConstant.type.element); | |
183 } | |
184 | |
185 HConstant addConstant(Constant constant, Compiler compiler) { | 165 HConstant addConstant(Constant constant, Compiler compiler) { |
186 HConstant result = constants[constant]; | 166 HConstant result = constants[constant]; |
187 if (result == null) { | 167 if (result == null) { |
188 TypeMask type = mapConstantTypeToSsaType(constant, compiler); | 168 TypeMask type = constant.computeMask(compiler); |
189 result = new HConstant.internal(constant, type); | 169 result = new HConstant.internal(constant, type); |
190 entry.addAtExit(result); | 170 entry.addAtExit(result); |
191 constants[constant] = result; | 171 constants[constant] = result; |
192 } else if (result.block == null) { | 172 } else if (result.block == null) { |
193 // The constant was not used anymore. | 173 // The constant was not used anymore. |
194 entry.addAtExit(result); | 174 entry.addAtExit(result); |
195 } | 175 } |
196 return result; | 176 return result; |
197 } | 177 } |
198 | 178 |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
914 bool canBePrimitiveString(Compiler compiler) { | 894 bool canBePrimitiveString(Compiler compiler) { |
915 JavaScriptBackend backend = compiler.backend; | 895 JavaScriptBackend backend = compiler.backend; |
916 return instructionType.contains(backend.jsStringClass, compiler); | 896 return instructionType.contains(backend.jsStringClass, compiler); |
917 } | 897 } |
918 | 898 |
919 bool isInteger(Compiler compiler) { | 899 bool isInteger(Compiler compiler) { |
920 return instructionType.containsOnlyInt(compiler) | 900 return instructionType.containsOnlyInt(compiler) |
921 && !instructionType.isNullable; | 901 && !instructionType.isNullable; |
922 } | 902 } |
923 | 903 |
| 904 bool isUInt32(Compiler compiler) { |
| 905 JavaScriptBackend backend = compiler.backend; |
| 906 return !instructionType.isNullable |
| 907 && instructionType.satisfies(backend.jsUInt32Class, compiler); |
| 908 } |
| 909 |
| 910 bool isUInt31(Compiler compiler) { |
| 911 JavaScriptBackend backend = compiler.backend; |
| 912 return !instructionType.isNullable |
| 913 && instructionType.satisfies(backend.jsUInt31Class, compiler); |
| 914 } |
| 915 |
924 bool isIntegerOrNull(Compiler compiler) { | 916 bool isIntegerOrNull(Compiler compiler) { |
925 return instructionType.containsOnlyInt(compiler); | 917 return instructionType.containsOnlyInt(compiler); |
926 } | 918 } |
927 | 919 |
928 bool isNumber(Compiler compiler) { | 920 bool isNumber(Compiler compiler) { |
929 return instructionType.containsOnlyNum(compiler) | 921 return instructionType.containsOnlyNum(compiler) |
930 && !instructionType.isNullable; | 922 && !instructionType.isNullable; |
931 } | 923 } |
932 | 924 |
933 bool isNumberOrNull(Compiler compiler) { | 925 bool isNumberOrNull(Compiler compiler) { |
(...skipping 1904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2838 HBasicBlock get start => expression.start; | 2830 HBasicBlock get start => expression.start; |
2839 HBasicBlock get end { | 2831 HBasicBlock get end { |
2840 // We don't create a switch block if there are no cases. | 2832 // We don't create a switch block if there are no cases. |
2841 assert(!statements.isEmpty); | 2833 assert(!statements.isEmpty); |
2842 return statements.last.end; | 2834 return statements.last.end; |
2843 } | 2835 } |
2844 | 2836 |
2845 bool accept(HStatementInformationVisitor visitor) => | 2837 bool accept(HStatementInformationVisitor visitor) => |
2846 visitor.visitSwitchInfo(this); | 2838 visitor.visitSwitchInfo(this); |
2847 } | 2839 } |
OLD | NEW |