< prev index next >

src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddress.java

Print this page
rev 48259 : SA for GC - patch 2

@@ -23,12 +23,31 @@
  */
 
 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;
         }
         return value.asLongValue();

@@ -37,32 +56,32 @@
     static boolean is_null(Address value) {
         return value == null;
     }
 
     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) {
         return !is_weak_bad(value) && !is_null(value);
     }
 
     static boolean is_weak_good_or_null(Address value) {
         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) {
         return is_null(value) ? value : good(value);
     }
< prev index next >