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.
}