| 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;
|
|
|