summaryrefslogtreecommitdiffstats
path: root/libart
diff options
context:
space:
mode:
authorHiroshi Yamauchi <yamauchi@google.com>2015-04-23 20:42:50 -0700
committerHiroshi Yamauchi <yamauchi@google.com>2015-04-23 20:52:03 -0700
commit28da248e817762ef6e2709a8379228867862d97a (patch)
tree87b378408ff6f0680ca08f054e50752b394594b8 /libart
parent726db7aea4817a43a1fd094d18e57de5b244ee39 (diff)
downloadlibcore-28da248e817762ef6e2709a8379228867862d97a.tar.gz
libcore-28da248e817762ef6e2709a8379228867862d97a.tar.bz2
libcore-28da248e817762ef6e2709a8379228867862d97a.zip
Fix hashCode() for the read barrier lock word change.
Mask the low 28 bits of the lock word. Bug: 19355854 Bug: 12687968 Change-Id: Ic6db7e23fa1a98b28564880d78e7c7cc0c8c0bdc
Diffstat (limited to 'libart')
-rw-r--r--libart/src/main/java/java/lang/Object.java7
1 files changed, 4 insertions, 3 deletions
diff --git a/libart/src/main/java/java/lang/Object.java b/libart/src/main/java/java/lang/Object.java
index 20fdbf96a..5b820e325 100644
--- a/libart/src/main/java/java/lang/Object.java
+++ b/libart/src/main/java/java/lang/Object.java
@@ -274,10 +274,11 @@ public class Object {
*/
public int hashCode() {
int lockWord = shadow$_monitor_;
- final int lockWordMask = 0xC0000000; // Top 2 bits.
+ final int lockWordStateMask = 0xC0000000; // Top 2 bits.
final int lockWordStateHash = 0x80000000; // Top 2 bits are value 2 (kStateHash).
- if ((lockWord & lockWordMask) == lockWordStateHash) {
- return lockWord & ~lockWordMask;
+ final int lockWordHashMask = 0x0FFFFFFF; // Low 28 bits.
+ if ((lockWord & lockWordStateMask) == lockWordStateHash) {
+ return lockWord & lockWordHashMask;
}
return System.identityHashCode(this);
}