Index: runtime/lib/object_patch.dart |
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart |
index 35ccc5884901d9a82d2475a3e20fc9644993ae27..a74d92a08f0723496fe5d520808946b63b8b6f4e 100644 |
--- a/runtime/lib/object_patch.dart |
+++ b/runtime/lib/object_patch.dart |
@@ -2,6 +2,9 @@ |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
+int _getHash(obj) native "Object_getHash"; |
+int _setHash(obj, hash) native "Object_setHash"; |
+ |
@patch |
class Object { |
// The VM has its own implementation of equals. |
@@ -9,22 +12,18 @@ class Object { |
bool operator ==(other) native "Object_equals"; |
// Helpers used to implement hashCode. If a hashCode is used, we remember it |
- // in a weak table in the VM. A new hashCode value is calculated using a |
- // number generator. |
+ // in a weak table in the VM (32 bit) or in the header of the object (64 |
+ // bit). A new hashCode value is calculated using a random number generator. |
static final _hashCodeRnd = new Random(); |
- // Shared static implementation for hashCode and _identityHashCode. |
- static _getHash(obj) native "Object_getHash"; |
- static _setHash(obj, hash) native "Object_setHash"; |
- |
static int _objectHashCode(obj) { |
var result = _getHash(obj); |
if (result == 0) { |
// We want the hash to be a Smi value greater than 0. |
result = _hashCodeRnd.nextInt(0x40000000); |
- while (result == 0) { |
+ do { |
result = _hashCodeRnd.nextInt(0x40000000); |
- } |
+ } while (result == 0); |
_setHash(obj, result); |
} |
return result; |