agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java

Print this page
rev 146 : [mq]: mixa.layout.patch

*** 27,36 **** --- 27,37 ---- import java.io.*; import java.util.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.types.*; + import sun.jvm.hotspot.utilities.*; public class Klass extends Oop implements ClassConstants { static { VM.registerVMInitializedObserver(new Observer() { public void update(Observable o, Object data) {
*** 38,54 **** } }); } // anon-enum constants for _layout_helper. ! public static int LH_INSTANCE_SLOW_PATH_BIT; ! public static int LH_LOG2_ELEMENT_SIZE_SHIFT; ! public static int LH_ELEMENT_TYPE_SHIFT; public static int LH_HEADER_SIZE_SHIFT; ! public static int LH_ARRAY_TAG_SHIFT; ! public static int LH_ARRAY_TAG_TYPE_VALUE; ! public static int LH_ARRAY_TAG_OBJ_VALUE; private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { Type type = db.lookupType("Klass"); javaMirror = new OopField(type.getOopField("_java_mirror"), Oop.getHeaderSize()); superField = new OopField(type.getOopField("_super"), Oop.getHeaderSize()); --- 39,66 ---- } }); } // anon-enum constants for _layout_helper. ! public static int LH_FLAGS_BITS; ! public static int LH_FLAGS_SHIFT; ! public static int LH_FLAGS_LOW_BITS; ! public static int LH_VARIABLE_FLAG; ! public static int LH_ARRAY_FLAG; ! public static int LH_FLAGS_EBT_MASK; ! public static int LH_ELEMENT_SIZE_BITS; ! public static int LH_ELEMENT_SIZE_SHIFT; ! public static int LH_ELEMENT_SCALE_BITS; ! public static int LH_ELEMENT_SIZEM_BITS; ! public static int LH_ELEMENT_SIZEM_MASK_IP; ! public static int LH_SIZE_LOW_BITS; ! public static int LH_SLOW_PATH_LOW_BIT; ! public static int LH_HEADER_SIZE_BITS; public static int LH_HEADER_SIZE_SHIFT; ! public static int LH_FIXED_SIZE_BITS; ! public static int LH_FIXED_SIZE_SHIFT; ! private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { Type type = db.lookupType("Klass"); javaMirror = new OopField(type.getOopField("_java_mirror"), Oop.getHeaderSize()); superField = new OopField(type.getOopField("_super"), Oop.getHeaderSize());
*** 57,73 **** accessFlags = new CIntField(type.getCIntegerField("_access_flags"), Oop.getHeaderSize()); subklass = new OopField(type.getOopField("_subklass"), Oop.getHeaderSize()); nextSibling = new OopField(type.getOopField("_next_sibling"), Oop.getHeaderSize()); allocCount = new CIntField(type.getCIntegerField("_alloc_count"), Oop.getHeaderSize()); ! LH_INSTANCE_SLOW_PATH_BIT = db.lookupIntConstant("Klass::_lh_instance_slow_path_bit").intValue(); ! LH_LOG2_ELEMENT_SIZE_SHIFT = db.lookupIntConstant("Klass::_lh_log2_element_size_shift").intValue(); ! LH_ELEMENT_TYPE_SHIFT = db.lookupIntConstant("Klass::_lh_element_type_shift").intValue(); ! LH_HEADER_SIZE_SHIFT = db.lookupIntConstant("Klass::_lh_header_size_shift").intValue(); ! LH_ARRAY_TAG_SHIFT = db.lookupIntConstant("Klass::_lh_array_tag_shift").intValue(); ! LH_ARRAY_TAG_TYPE_VALUE = db.lookupIntConstant("Klass::_lh_array_tag_type_value").intValue(); ! LH_ARRAY_TAG_OBJ_VALUE = db.lookupIntConstant("Klass::_lh_array_tag_obj_value").intValue(); } Klass(OopHandle handle, ObjectHeap heap) { super(handle, heap); } --- 69,95 ---- accessFlags = new CIntField(type.getCIntegerField("_access_flags"), Oop.getHeaderSize()); subklass = new OopField(type.getOopField("_subklass"), Oop.getHeaderSize()); nextSibling = new OopField(type.getOopField("_next_sibling"), Oop.getHeaderSize()); allocCount = new CIntField(type.getCIntegerField("_alloc_count"), Oop.getHeaderSize()); ! LH_FLAGS_BITS = db.lookupIntConstant("LayoutHelper::_flags_bits").intValue(); ! LH_FLAGS_SHIFT = db.lookupIntConstant("LayoutHelper::_flags_shift").intValue(); ! LH_FLAGS_LOW_BITS = db.lookupIntConstant("LayoutHelper::_flags_low_bits").intValue(); ! LH_VARIABLE_FLAG = db.lookupIntConstant("LayoutHelper::_variable_flag").intValue(); ! LH_ARRAY_FLAG = db.lookupIntConstant("LayoutHelper::_array_flag").intValue(); ! LH_FLAGS_EBT_MASK = db.lookupIntConstant("LayoutHelper::_flags_ebt_mask").intValue(); ! LH_ELEMENT_SIZE_BITS = db.lookupIntConstant("LayoutHelper::_element_size_bits").intValue(); ! LH_ELEMENT_SIZE_SHIFT = db.lookupIntConstant("LayoutHelper::_element_size_shift").intValue(); ! LH_ELEMENT_SCALE_BITS = db.lookupIntConstant("LayoutHelper::_element_scale_bits").intValue(); ! LH_ELEMENT_SIZEM_BITS = db.lookupIntConstant("LayoutHelper::_element_sizem_bits").intValue(); ! LH_ELEMENT_SIZEM_MASK_IP = db.lookupIntConstant("LayoutHelper::_element_sizem_mask_ip").intValue(); ! LH_SIZE_LOW_BITS = db.lookupIntConstant("LayoutHelper::_fixed_size_low_bits").intValue(); ! LH_SLOW_PATH_LOW_BIT = db.lookupIntConstant("LayoutHelper::_slow_path_low_bit").intValue(); ! LH_HEADER_SIZE_BITS = db.lookupIntConstant("LayoutHelper::_header_size_bits").intValue(); ! LH_HEADER_SIZE_SHIFT = db.lookupIntConstant("LayoutHelper::_header_size_shift").intValue(); ! LH_FIXED_SIZE_BITS = db.lookupIntConstant("LayoutHelper::_fixed_size_bits").intValue(); ! LH_FIXED_SIZE_SHIFT = db.lookupIntConstant("LayoutHelper::_fixed_size_shift").intValue(); } Klass(OopHandle handle, ObjectHeap heap) { super(handle, heap); }
*** 100,109 **** --- 122,163 ---- public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags()); } public Klass getSubklassKlass() { return (Klass) subklass.getValue(this); } public Klass getNextSiblingKlass() { return (Klass) nextSibling.getValue(this); } public long getAllocCount() { return allocCount.getValue(this); } + public boolean isVariableObject() { return getLayoutHelper() < 0; } + public boolean isFixedInstance() { return getLayoutHelper() > 0; } + + public long getHeaderSizeInBytes() { + if (Assert.ASSERTS_ENABLED) { + Assert.that(isVariableObject(), "layout helper initialized for variable class"); + } + return Bits.maskBits(getLayoutHelper() >> LH_HEADER_SIZE_SHIFT, + (Bits.rightNBits(LH_HEADER_SIZE_BITS) + - Bits.rightNBits(LH_SIZE_LOW_BITS))); + } + + public int getElementSize() { + if (Assert.ASSERTS_ENABLED) { + Assert.that(isVariableObject(), "layout helper initialized for variable class"); + } + int lh = getLayoutHelper(); + int scale = Bits.maskBits(lh >> LH_ELEMENT_SIZE_SHIFT, + Bits.rightNBits(LH_ELEMENT_SCALE_BITS)); + int sizem = Bits.maskBits(lh >> (LH_ELEMENT_SIZE_SHIFT + LH_ELEMENT_SCALE_BITS), + Bits.rightNBits(LH_ELEMENT_SIZEM_BITS)); + return (sizem + 1) << scale; + } + + public int getElementType() { + if (Assert.ASSERTS_ENABLED) { + Assert.that(isVariableObject(), "layout helper initialized for variable class"); + } + return Bits.maskBits(getLayoutHelper() >> LH_FLAGS_SHIFT, + Bits.rightNBits(LH_FLAGS_EBT_MASK)); + } + // computed access flags - takes care of inner classes etc. // This is closer to actual source level than getAccessFlags() etc. public long computeModifierFlags() { return 0L; // Unless overridden, modifier_flags is 0. }