--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/BasicTypeSize.java 2017-11-29 17:32:06.912816311 +0900 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/BasicTypeSize.java 2017-11-29 17:32:06.783814075 +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; }