Index: runtime/lib/object_patch.dart |
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart |
index 2d42da7df44ebf90db1c20f3e6b0045f3bf5533a..df8073ee4742b872b6bdc15a3385641e740051af 100644 |
--- a/runtime/lib/object_patch.dart |
+++ b/runtime/lib/object_patch.dart |
@@ -12,15 +12,27 @@ patch class Object { |
static _getHash(obj) native "Object_getHash"; |
static _setHash(obj, hash) native "Object_setHash"; |
- /* patch */ int get hashCode { |
- var result = _getHash(this); |
+ /* patch */ int get hashCode => _hashCodeOf(this); |
+ |
+ /* patch */ static int hashCodeOf(Object object) { |
+ // Num doesn't use identity hash for hashCode, and this method must be |
+ // consistent with `identical`. |
+ // Bool and Null overrides hashCode only in a patch. |
+ if (object is num || object is bool || object == null) { |
+ return object.hashCode; |
+ } |
+ return _hashCodeOf(object); |
+ } |
+ |
+ static int _hashCodeOf(Object object) { |
+ var result = _getHash(object); |
if (result == 0) { |
// We want the hash to be a Smi value greater than 0. |
result = _hashCodeRnd.nextInt(0x40000000); |
while (result == 0) { |
result = _hashCodeRnd.nextInt(0x40000000); |
} |
- _setHash(this, result); |
+ _setHash(object, result); |
} |
return result; |
} |