| Index: lib/compiler/implementation/constants.dart
|
| diff --git a/lib/compiler/implementation/constants.dart b/lib/compiler/implementation/constants.dart
|
| index 5268e8baca0478ddc89fa01acd27ed7c9642f6f5..6c5ee532c6766dbaa64c7267e7896853ec3d45ee 100644
|
| --- a/lib/compiler/implementation/constants.dart
|
| +++ b/lib/compiler/implementation/constants.dart
|
| @@ -54,7 +54,7 @@ class SentinelConstant extends Constant {
|
| List<Constant> getDependencies() => const <Constant>[];
|
|
|
| // Just use a random value.
|
| - int hashCode() => 24297418;
|
| + int get hashCode => 24297418;
|
|
|
| bool isSentinel() => true;
|
|
|
| @@ -85,7 +85,7 @@ class FunctionConstant extends Constant {
|
| return compiler.functionClass.computeType(compiler);
|
| }
|
|
|
| - int hashCode() => (17 * element.hashCode()) & 0x7fffffff;
|
| + int get hashCode => (17 * element.hashCode) & 0x7fffffff;
|
|
|
| accept(ConstantVisitor visitor) => visitor.visitFunction(this);
|
| }
|
| @@ -126,7 +126,7 @@ class NullConstant extends PrimitiveConstant {
|
| }
|
|
|
| // The magic constant has no meaning. It is just a random value.
|
| - int hashCode() => 785965825;
|
| + int get hashCode => 785965825;
|
| DartString toDartString() => const LiteralDartString("null");
|
|
|
| accept(ConstantVisitor visitor) => visitor.visitNull(this);
|
| @@ -175,7 +175,7 @@ class IntConstant extends NumConstant {
|
| return value == otherInt.value;
|
| }
|
|
|
| - int hashCode() => value.hashCode();
|
| + int get hashCode => value.hashCode;
|
| DartString toDartString() => new DartString.literal(value.toString());
|
|
|
| accept(ConstantVisitor visitor) => visitor.visitInt(this);
|
| @@ -221,7 +221,7 @@ class DoubleConstant extends NumConstant {
|
| }
|
| }
|
|
|
| - int hashCode() => value.hashCode();
|
| + int get hashCode => value.hashCode;
|
| DartString toDartString() => new DartString.literal(value.toString());
|
|
|
| accept(ConstantVisitor visitor) => visitor.visitDouble(this);
|
| @@ -253,7 +253,7 @@ class TrueConstant extends BoolConstant {
|
| bool operator ==(var other) => identical(this, other);
|
| // The magic constant is just a random value. It does not have any
|
| // significance.
|
| - int hashCode() => 499;
|
| + int get hashCode => 499;
|
| DartString toDartString() => const LiteralDartString("true");
|
|
|
| accept(ConstantVisitor visitor) => visitor.visitTrue(this);
|
| @@ -271,7 +271,7 @@ class FalseConstant extends BoolConstant {
|
| bool operator ==(var other) => identical(this, other);
|
| // The magic constant is just a random value. It does not have any
|
| // significance.
|
| - int hashCode() => 536555975;
|
| + int get hashCode => 536555975;
|
| DartString toDartString() => const LiteralDartString("false");
|
|
|
| accept(ConstantVisitor visitor) => visitor.visitFalse(this);
|
| @@ -279,15 +279,15 @@ class FalseConstant extends BoolConstant {
|
|
|
| class StringConstant extends PrimitiveConstant {
|
| final DartString value;
|
| - int _hashCode;
|
| + final int hashCode;
|
| final Node node;
|
|
|
| - StringConstant(this.value, this.node) {
|
| - // TODO(floitsch): cache StringConstants.
|
| - // TODO(floitsch): compute hashcode without calling toString() on the
|
| - // DartString.
|
| - _hashCode = value.slowToString().hashCode();
|
| - }
|
| + // TODO(floitsch): cache StringConstants.
|
| + // TODO(floitsch): compute hashcode without calling toString() on the
|
| + // DartString.
|
| + StringConstant(DartString value, this.node)
|
| + : this.value = value,
|
| + this.hashCode = value.slowToString().hashCode;
|
| bool isString() => true;
|
|
|
| DartType computeType(Compiler compiler) {
|
| @@ -297,10 +297,9 @@ class StringConstant extends PrimitiveConstant {
|
| bool operator ==(var other) {
|
| if (other is !StringConstant) return false;
|
| StringConstant otherString = other;
|
| - return (_hashCode == otherString._hashCode) && (value == otherString.value);
|
| + return (hashCode == otherString.hashCode) && (value == otherString.value);
|
| }
|
|
|
| - int hashCode() => _hashCode;
|
| DartString toDartString() => value;
|
| int get length => value.length;
|
|
|
| @@ -317,25 +316,30 @@ abstract class ObjectConstant extends Constant {
|
|
|
| // TODO(1603): The class should be marked as abstract, but the VM doesn't
|
| // currently allow this.
|
| - abstract int hashCode();
|
| + abstract int get hashCode;
|
| }
|
|
|
| class ListConstant extends ObjectConstant {
|
| final List<Constant> entries;
|
| - int _hashCode;
|
| + final int hashCode;
|
| +
|
| + ListConstant(DartType type, List<Constant> entries)
|
| + : this.entries = entries,
|
| + hashCode = _computeHash(entries),
|
| + super(type);
|
| + bool isList() => true;
|
|
|
| - ListConstant(DartType type, this.entries) : super(type) {
|
| + static int _computeHash(List<Constant> entries) {
|
| // TODO(floitsch): create a better hash.
|
| int hash = 0;
|
| - for (Constant input in entries) hash ^= input.hashCode();
|
| - _hashCode = hash;
|
| + for (Constant input in entries) hash ^= input.hashCode;
|
| + return hash;
|
| }
|
| - bool isList() => true;
|
|
|
| bool operator ==(var other) {
|
| if (other is !ListConstant) return false;
|
| ListConstant otherList = other;
|
| - if (hashCode() != otherList.hashCode()) return false;
|
| + if (hashCode != otherList.hashCode) return false;
|
| // TODO(floitsch): verify that the generic types are the same.
|
| if (entries.length != otherList.entries.length) return false;
|
| for (int i = 0; i < entries.length; i++) {
|
| @@ -344,8 +348,6 @@ class ListConstant extends ObjectConstant {
|
| return true;
|
| }
|
|
|
| - int hashCode() => _hashCode;
|
| -
|
| List<Constant> getDependencies() => entries;
|
|
|
| int get length => entries.length;
|
| @@ -373,21 +375,25 @@ class MapConstant extends ObjectConstant {
|
| final ListConstant keys;
|
| final List<Constant> values;
|
| final Constant protoValue;
|
| - int _hashCode;
|
| + final int hashCode;
|
| +
|
| + MapConstant(DartType type, this.keys, List<Constant> values, this.protoValue)
|
| + : this.values = values,
|
| + this.hashCode = computeHash(values),
|
| + super(type);
|
| + bool isMap() => true;
|
|
|
| - MapConstant(DartType type, this.keys, this.values, this.protoValue)
|
| - : super(type) {
|
| + static int computeHash(List<Constant> values) {
|
| // TODO(floitsch): create a better hash.
|
| int hash = 0;
|
| - for (Constant value in values) hash ^= value.hashCode();
|
| - _hashCode = hash;
|
| + for (Constant value in values) hash ^= value.hashCode;
|
| + return hash;
|
| }
|
| - bool isMap() => true;
|
|
|
| bool operator ==(var other) {
|
| if (other is !MapConstant) return false;
|
| MapConstant otherMap = other;
|
| - if (hashCode() != otherMap.hashCode()) return false;
|
| + if (hashCode != otherMap.hashCode) return false;
|
| // TODO(floitsch): verify that the generic types are the same.
|
| if (keys != otherMap.keys) return false;
|
| for (int i = 0; i < values.length; i++) {
|
| @@ -396,8 +402,6 @@ class MapConstant extends ObjectConstant {
|
| return true;
|
| }
|
|
|
| - int hashCode() => _hashCode;
|
| -
|
| List<Constant> getDependencies() {
|
| List<Constant> result = <Constant>[keys];
|
| result.addAll(values);
|
| @@ -411,24 +415,30 @@ class MapConstant extends ObjectConstant {
|
|
|
| class ConstructedConstant extends ObjectConstant {
|
| final List<Constant> fields;
|
| - int _hashCode;
|
| + final int hashCode;
|
|
|
| - ConstructedConstant(DartType type, this.fields) : super(type) {
|
| + ConstructedConstant(DartType type, List<Constant> fields)
|
| + : this.fields = fields,
|
| + hashCode = computeHash(type, fields),
|
| + super(type) {
|
| assert(type != null);
|
| + }
|
| + bool isConstructedObject() => true;
|
| +
|
| + static int computeHash(DartType type, List<Constant> fields) {
|
| // TODO(floitsch): create a better hash.
|
| int hash = 0;
|
| for (Constant field in fields) {
|
| - hash ^= field.hashCode();
|
| + hash ^= field.hashCode;
|
| }
|
| - hash ^= type.element.hashCode();
|
| - _hashCode = hash;
|
| + hash ^= type.element.hashCode;
|
| + return hash;
|
| }
|
| - bool isConstructedObject() => true;
|
|
|
| bool operator ==(var otherVar) {
|
| if (otherVar is !ConstructedConstant) return false;
|
| ConstructedConstant other = otherVar;
|
| - if (hashCode() != other.hashCode()) return false;
|
| + if (hashCode != other.hashCode) return false;
|
| // TODO(floitsch): verify that the (generic) types are the same.
|
| if (type.element != other.type.element) return false;
|
| if (fields.length != other.fields.length) return false;
|
| @@ -438,7 +448,6 @@ class ConstructedConstant extends ObjectConstant {
|
| return true;
|
| }
|
|
|
| - int hashCode() => _hashCode;
|
| List<Constant> getDependencies() => fields;
|
|
|
| accept(ConstantVisitor visitor) => visitor.visitConstructed(this);
|
|
|