agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java
Print this page
rev 146 : [mq]: mixa.layout.patch
@@ -27,10 +27,11 @@
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,17 +39,28 @@
}
});
}
// 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_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_ARRAY_TAG_SHIFT;
- public static int LH_ARRAY_TAG_TYPE_VALUE;
- public static int LH_ARRAY_TAG_OBJ_VALUE;
+ 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,17 +69,27 @@
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();
+ 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,10 +122,42 @@
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.
}