--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddress.java 2018-01-13 12:14:29.742600097 +0900 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddress.java 2018-01-13 12:14:29.477599379 +0900 @@ -25,8 +25,27 @@ package sun.jvm.hotspot.gc.z; import sun.jvm.hotspot.debugger.Address; +import sun.jvm.hotspot.debugger.OopHandle; +import sun.jvm.hotspot.runtime.VM; +import sun.jvm.hotspot.types.TypeDataBase; +import sun.jvm.hotspot.types.WrongTypeException; class ZAddress { + + private static long ZAddressWeakBadMask; + private static long ZAddressGoodMask; + private static long ZAddressOffsetMask; + + static { + VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase())); + } + + private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { + ZAddressWeakBadMask = db.lookupLongConstant("ZAddressWeakBadMask").longValue(); + ZAddressGoodMask = db.lookupLongConstant("ZAddressGoodMask").longValue(); + ZAddressOffsetMask = db.lookupLongConstant("ZAddressOffsetMask").longValue(); + } + static long as_long(Address value) { if (value == null) { return 0; @@ -39,7 +58,7 @@ } static boolean is_weak_bad(Address value) { - return (as_long(value) & ZGlobals.ZAddressWeakBadMask()) != 0; + return (as_long(value) & ZAddressWeakBadMask) != 0; } static boolean is_weak_good(Address value) { @@ -50,17 +69,17 @@ return !is_weak_bad(value); } - static long offset(Address address) { - return as_long(address) & ZGlobals.ZAddressOffsetMask; + static Address offset(Address address) { + return address.andWithMask(ZAddressOffsetMask); } - static Address address(long value) { + static Address address(Address addr) { // TODO: Linux-specific - We don't use a heap base on Linux - return ZOop.to_address(value); + return ZOop.to_address(addr); } static Address good(Address value) { - return address(offset(value) | ZGlobals.ZAddressGoodMask()); + return address(offset(value).orWithMask(ZAddressGoodMask)); } static Address good_or_null(Address value) {