Index: sdk/lib/_internal/compiler/implementation/constants.dart |
=================================================================== |
--- sdk/lib/_internal/compiler/implementation/constants.dart (revision 30666) |
+++ sdk/lib/_internal/compiler/implementation/constants.dart (working copy) |
@@ -48,6 +48,8 @@ |
// TODO(johnniwinther): Replace with a 'type' getter. |
DartType computeType(Compiler compiler); |
+ ti.TypeMask computeMask(Compiler compiler); |
+ |
List<Constant> getDependencies(); |
accept(ConstantVisitor visitor); |
@@ -75,6 +77,10 @@ |
return compiler.functionClass.computeType(compiler); |
} |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.functionType; |
+ } |
+ |
int get hashCode => (17 * element.hashCode) & 0x7fffffff; |
accept(ConstantVisitor visitor) => visitor.visitFunction(this); |
@@ -113,6 +119,10 @@ |
return compiler.nullClass.computeType(compiler); |
} |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.nullType; |
+ } |
+ |
void _writeJsCode(CodeBuffer buffer, ConstantHandler handler) { |
buffer.write(JsNull); |
} |
@@ -152,11 +162,19 @@ |
} |
const IntConstant._internal(this.value); |
bool isInt() => true; |
+ bool isUInt31() => value >= 0 && value < (1 << 31); |
+ bool isUInt32() => value >= 0 && value < (1 << 32); |
DartType computeType(Compiler compiler) { |
return compiler.intClass.computeType(compiler); |
} |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ if (isUInt31()) return compiler.typesTask.uint31Type; |
+ if (isUInt32()) return compiler.typesTask.uint32Type; |
+ return compiler.typesTask.intType; |
+ } |
+ |
// We have to override the equality operator so that ints and doubles are |
// treated as separate constants. |
// The is [:!IntConstant:] check at the beginning of the function makes sure |
@@ -200,6 +218,10 @@ |
return compiler.doubleClass.computeType(compiler); |
} |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.doubleType; |
+ } |
+ |
bool operator ==(var other) { |
if (other is !DoubleConstant) return false; |
DoubleConstant otherDouble = other; |
@@ -230,6 +252,10 @@ |
return compiler.boolClass.computeType(compiler); |
} |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.boolType; |
+ } |
+ |
BoolConstant negate(); |
} |
@@ -286,6 +312,10 @@ |
return compiler.stringClass.computeType(compiler); |
} |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.stringType; |
+ } |
+ |
bool operator ==(var other) { |
if (other is !StringConstant) return false; |
StringConstant otherString = other; |
@@ -323,6 +353,10 @@ |
return other is TypeConstant && representedType == other.representedType; |
} |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.typeType; |
+ } |
+ |
int get hashCode => representedType.hashCode * 13; |
List<Constant> getDependencies() => const <Constant>[]; |
@@ -368,6 +402,10 @@ |
int get length => entries.length; |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.constListType; |
+ } |
+ |
accept(ConstantVisitor visitor) => visitor.visitList(this); |
String toString() { |
@@ -424,6 +462,10 @@ |
return hash; |
} |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.constMapType; |
+ } |
+ |
bool operator ==(var other) { |
if (other is !MapConstant) return false; |
MapConstant otherMap = other; |
@@ -489,6 +531,10 @@ |
DartType computeType(Compiler compiler) => compiler.types.dynamicType; |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ return compiler.typesTask.nonNullType; |
+ } |
+ |
String toString() { |
return 'InterceptorConstant(${Error.safeToString(dispatchedType)})'; |
} |
@@ -530,6 +576,13 @@ |
List<Constant> getDependencies() => fields; |
+ ti.TypeMask computeMask(Compiler compiler) { |
+ if (compiler.backend.isInterceptorClass(type.element)) { |
+ return compiler.typesTask.nonNullType; |
+ } |
+ return new ti.TypeMask.nonNullExact(type.element); |
+ } |
+ |
accept(ConstantVisitor visitor) => visitor.visitConstructed(this); |
Map<Element, Constant> get fieldElements { |