src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/BasicTypeSize.java
changeset 48175 babef393c286
parent 47216 71c04702a3d5
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/BasicTypeSize.java	Thu Nov 30 16:28:47 2017 -0800
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/BasicTypeSize.java	Fri Dec 01 10:04:31 2017 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,22 +24,48 @@
 
 package sun.jvm.hotspot.runtime;
 
+import java.util.Observer;
+import sun.jvm.hotspot.types.TypeDataBase;
+
+
 /** Encapsulates the BasicTypeSize enum in globalDefinitions.hpp in
     the VM. */
 
 public class BasicTypeSize {
-  private static boolean initialized = false;
-  private static int tBooleanSize = 1;
-  private static int tCharSize    = 1;
-  private static int tFloatSize   = 1;
-  private static int tDoubleSize  = 2;
-  private static int tByteSize    = 1;
-  private static int tShortSize   = 1;
-  private static int tIntSize     = 1;
-  private static int tLongSize    = 2;
-  private static int tObjectSize  = 1;
-  private static int tArraySize   = 1;
-  private static int tVoidSize    = 0;
+  private static int tBooleanSize;
+  private static int tCharSize;
+  private static int tFloatSize;
+  private static int tDoubleSize;
+  private static int tByteSize;
+  private static int tShortSize;
+  private static int tIntSize;
+  private static int tLongSize;
+  private static int tObjectSize;
+  private static int tArraySize;
+  private static int tNarrowOopSize;
+  private static int tNarrowKlassSize;
+  private static int tVoidSize;
+
+  static {
+    VM.registerVMInitializedObserver(
+        (o, d) -> initialize(VM.getVM().getTypeDataBase()));
+  }
+
+  private static synchronized void initialize(TypeDataBase db) {
+    tBooleanSize     = db.lookupIntConstant("T_BOOLEAN_size").intValue();
+    tCharSize        = db.lookupIntConstant("T_INT_size").intValue();
+    tFloatSize       = db.lookupIntConstant("T_FLOAT_size").intValue();
+    tDoubleSize      = db.lookupIntConstant("T_DOUBLE_size").intValue();
+    tByteSize        = db.lookupIntConstant("T_BYTE_size").intValue();
+    tShortSize       = db.lookupIntConstant("T_SHORT_size").intValue();
+    tIntSize         = db.lookupIntConstant("T_INT_size").intValue();
+    tLongSize        = db.lookupIntConstant("T_LONG_size").intValue();
+    tObjectSize      = db.lookupIntConstant("T_OBJECT_size").intValue();
+    tArraySize       = db.lookupIntConstant("T_ARRAY_size").intValue();
+    tNarrowOopSize   = db.lookupIntConstant("T_NARROWOOP_size").intValue();
+    tNarrowKlassSize = db.lookupIntConstant("T_NARROWKLASS_size").intValue();
+    tVoidSize        = db.lookupIntConstant("T_VOID_size").intValue();
+  }
 
   public static int getTBooleanSize() {
     return tBooleanSize;
@@ -81,6 +107,14 @@
     return tArraySize;
   }
 
+  public static int getTNarrowOopSize() {
+    return tNarrowOopSize;
+  }
+
+  public static int getTNarrowKlassSize() {
+    return tNarrowKlassSize;
+  }
+
   public static int getTVoidSize() {
     return tVoidSize;
   }