< prev index next >

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

Print this page




  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 package sun.jvm.hotspot.oops;
  26 
  27 import java.io.*;
  28 import java.util.*;
  29 import sun.jvm.hotspot.debugger.*;

  30 import sun.jvm.hotspot.runtime.*;
  31 import sun.jvm.hotspot.types.*;
  32 
  33 public class Klass extends Metadata implements ClassConstants {
  34   static {
  35     VM.registerVMInitializedObserver(new Observer() {
  36         public void update(Observable o, Object data) {
  37           initialize(VM.getVM().getTypeDataBase());
  38         }
  39       });
  40   }
  41 
  42   // anon-enum constants for _layout_helper.
  43   public static int LH_INSTANCE_SLOW_PATH_BIT;
  44   public static int LH_LOG2_ELEMENT_SIZE_SHIFT;
  45   public static int LH_ELEMENT_TYPE_SHIFT;
  46   public static int LH_HEADER_SIZE_SHIFT;
  47   public static int LH_ARRAY_TAG_SHIFT;
  48   public static int LH_ARRAY_TAG_TYPE_VALUE;
  49   public static int LH_ARRAY_TAG_OBJ_VALUE;
  50 
  51   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
  52     Type type    = db.lookupType("Klass");
  53     javaMirror   = new OopField(type.getOopField("_java_mirror"), 0);
  54     superField   = new MetadataField(type.getAddressField("_super"), 0);
  55     layoutHelper = new IntField(type.getJIntField("_layout_helper"), 0);
  56     name         = type.getAddressField("_name");
  57     accessFlags  = new CIntField(type.getCIntegerField("_access_flags"), 0);
  58     try {
  59       traceIDField  = type.getField("_trace_id");
  60     } catch(Exception e) {
  61     }
  62     subklass     = new MetadataField(type.getAddressField("_subklass"), 0);
  63     nextSibling  = new MetadataField(type.getAddressField("_next_sibling"), 0);
  64     nextLink     = new MetadataField(type.getAddressField("_next_link"), 0);
  65     vtableLen    = new CIntField(type.getCIntegerField("_vtable_len"), 0);

  66 
  67     LH_INSTANCE_SLOW_PATH_BIT  = db.lookupIntConstant("Klass::_lh_instance_slow_path_bit").intValue();
  68     LH_LOG2_ELEMENT_SIZE_SHIFT = db.lookupIntConstant("Klass::_lh_log2_element_size_shift").intValue();
  69     LH_ELEMENT_TYPE_SHIFT      = db.lookupIntConstant("Klass::_lh_element_type_shift").intValue();
  70     LH_HEADER_SIZE_SHIFT       = db.lookupIntConstant("Klass::_lh_header_size_shift").intValue();
  71     LH_ARRAY_TAG_SHIFT         = db.lookupIntConstant("Klass::_lh_array_tag_shift").intValue();
  72     LH_ARRAY_TAG_TYPE_VALUE    = db.lookupIntConstant("Klass::_lh_array_tag_type_value").intValue();
  73     LH_ARRAY_TAG_OBJ_VALUE     = db.lookupIntConstant("Klass::_lh_array_tag_obj_value").intValue();
  74   }
  75 
  76 
  77   public Klass(Address addr) {
  78     super(addr);
  79   }
  80 
  81   // jvmdi support - see also class_status in VM code
  82   public int getClassStatus() {
  83     return 0; // overridden in derived classes
  84   }
  85 
  86   public boolean isKlass()             { return true; }
  87 
  88   // Fields
  89   private static OopField  javaMirror;
  90   private static MetadataField  superField;
  91   private static IntField layoutHelper;
  92   private static AddressField  name;
  93   private static CIntField accessFlags;
  94   private static MetadataField  subklass;
  95   private static MetadataField  nextSibling;
  96   private static MetadataField  nextLink;
  97   private static sun.jvm.hotspot.types.Field traceIDField;
  98   private static CIntField vtableLen;

  99 
 100   private Address getValue(AddressField field) {
 101     return addr.getAddressAt(field.getOffset());
 102   }
 103 
 104   protected Symbol getSymbol(AddressField field) {
 105     return Symbol.create(addr.getAddressAt(field.getOffset()));
 106   }
 107 
 108   // Accessors for declared fields
 109   public Instance getJavaMirror()       { return (Instance) javaMirror.getValue(this);   }
 110   public Klass    getSuper()            { return (Klass)    superField.getValue(this);   }
 111   public Klass    getJavaSuper()        { return null;  }
 112   public int      getLayoutHelper()     { return (int)           layoutHelper.getValue(this); }
 113   public Symbol   getName()             { return getSymbol(name); }
 114   public long     getAccessFlags()      { return            accessFlags.getValue(this);  }
 115   // Convenience routine
 116   public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags());      }
 117   public Klass    getSubklassKlass()    { return (Klass)    subklass.getValue(this);     }
 118   public Klass    getNextSiblingKlass() { return (Klass)    nextSibling.getValue(this);  }
 119   public Klass    getNextLinkKlass()    { return (Klass)    nextLink.getValue(this);  }
 120   public long     getVtableLen()        { return            vtableLen.getValue(this); }



 121 
 122   public long traceID() {
 123     if (traceIDField == null) return 0;
 124     return traceIDField.getJLong(addr);
 125   }
 126 
 127   // computed access flags - takes care of inner classes etc.
 128   // This is closer to actual source level than getAccessFlags() etc.
 129   public long computeModifierFlags() {
 130     return 0L; // Unless overridden, modifier_flags is 0.
 131   }
 132 
 133   // same as JVM_GetClassModifiers
 134   public final long getClassModifiers() {
 135     // unlike the VM counterpart we never have to deal with primitive type,
 136     // because we operator on Klass and not an instance of java.lang.Class.
 137     long flags = computeModifierFlags();
 138     if (isSuper()) {
 139        flags |= JVM_ACC_SUPER;
 140     }




  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 package sun.jvm.hotspot.oops;
  26 
  27 import java.io.*;
  28 import java.util.*;
  29 import sun.jvm.hotspot.debugger.*;
  30 import sun.jvm.hotspot.classfile.*;
  31 import sun.jvm.hotspot.runtime.*;
  32 import sun.jvm.hotspot.types.*;
  33 
  34 public class Klass extends Metadata implements ClassConstants {
  35   static {
  36     VM.registerVMInitializedObserver(new Observer() {
  37         public void update(Observable o, Object data) {
  38           initialize(VM.getVM().getTypeDataBase());
  39         }
  40       });
  41   }
  42 
  43   // anon-enum constants for _layout_helper.
  44   public static int LH_INSTANCE_SLOW_PATH_BIT;
  45   public static int LH_LOG2_ELEMENT_SIZE_SHIFT;
  46   public static int LH_ELEMENT_TYPE_SHIFT;
  47   public static int LH_HEADER_SIZE_SHIFT;
  48   public static int LH_ARRAY_TAG_SHIFT;
  49   public static int LH_ARRAY_TAG_TYPE_VALUE;
  50   public static int LH_ARRAY_TAG_OBJ_VALUE;
  51 
  52   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
  53     Type type    = db.lookupType("Klass");
  54     javaMirror   = new OopField(type.getOopField("_java_mirror"), 0);
  55     superField   = new MetadataField(type.getAddressField("_super"), 0);
  56     layoutHelper = new IntField(type.getJIntField("_layout_helper"), 0);
  57     name         = type.getAddressField("_name");
  58     accessFlags  = new CIntField(type.getCIntegerField("_access_flags"), 0);
  59     try {
  60       traceIDField  = type.getField("_trace_id");
  61     } catch(Exception e) {
  62     }
  63     subklass     = new MetadataField(type.getAddressField("_subklass"), 0);
  64     nextSibling  = new MetadataField(type.getAddressField("_next_sibling"), 0);
  65     nextLink     = new MetadataField(type.getAddressField("_next_link"), 0);
  66     vtableLen    = new CIntField(type.getCIntegerField("_vtable_len"), 0);
  67     classLoaderData = type.getAddressField("_class_loader_data");
  68 
  69     LH_INSTANCE_SLOW_PATH_BIT  = db.lookupIntConstant("Klass::_lh_instance_slow_path_bit").intValue();
  70     LH_LOG2_ELEMENT_SIZE_SHIFT = db.lookupIntConstant("Klass::_lh_log2_element_size_shift").intValue();
  71     LH_ELEMENT_TYPE_SHIFT      = db.lookupIntConstant("Klass::_lh_element_type_shift").intValue();
  72     LH_HEADER_SIZE_SHIFT       = db.lookupIntConstant("Klass::_lh_header_size_shift").intValue();
  73     LH_ARRAY_TAG_SHIFT         = db.lookupIntConstant("Klass::_lh_array_tag_shift").intValue();
  74     LH_ARRAY_TAG_TYPE_VALUE    = db.lookupIntConstant("Klass::_lh_array_tag_type_value").intValue();
  75     LH_ARRAY_TAG_OBJ_VALUE     = db.lookupIntConstant("Klass::_lh_array_tag_obj_value").intValue();
  76   }
  77 
  78 
  79   public Klass(Address addr) {
  80     super(addr);
  81   }
  82 
  83   // jvmdi support - see also class_status in VM code
  84   public int getClassStatus() {
  85     return 0; // overridden in derived classes
  86   }
  87 
  88   public boolean isKlass()             { return true; }
  89 
  90   // Fields
  91   private static OopField  javaMirror;
  92   private static MetadataField  superField;
  93   private static IntField layoutHelper;
  94   private static AddressField  name;
  95   private static CIntField accessFlags;
  96   private static MetadataField  subklass;
  97   private static MetadataField  nextSibling;
  98   private static MetadataField  nextLink;
  99   private static sun.jvm.hotspot.types.Field traceIDField;
 100   private static CIntField vtableLen;
 101   private static AddressField classLoaderData;
 102 
 103   private Address getValue(AddressField field) {
 104     return addr.getAddressAt(field.getOffset());
 105   }
 106 
 107   protected Symbol getSymbol(AddressField field) {
 108     return Symbol.create(addr.getAddressAt(field.getOffset()));
 109   }
 110 
 111   // Accessors for declared fields
 112   public Instance getJavaMirror()       { return (Instance) javaMirror.getValue(this);   }
 113   public Klass    getSuper()            { return (Klass)    superField.getValue(this);   }
 114   public Klass    getJavaSuper()        { return null;  }
 115   public int      getLayoutHelper()     { return (int)           layoutHelper.getValue(this); }
 116   public Symbol   getName()             { return            getSymbol(name); }
 117   public long     getAccessFlags()      { return            accessFlags.getValue(this);  }
 118   // Convenience routine
 119   public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags());      }
 120   public Klass    getSubklassKlass()    { return (Klass)    subklass.getValue(this);     }
 121   public Klass    getNextSiblingKlass() { return (Klass)    nextSibling.getValue(this);  }
 122   public Klass    getNextLinkKlass()    { return (Klass)    nextLink.getValue(this);  }
 123   public long     getVtableLen()        { return            vtableLen.getValue(this); }
 124 
 125   public ClassLoaderData getClassLoaderData() { return ClassLoaderData.instantiateWrapperFor(classLoaderData.getValue(getAddress())); }
 126   public Oop             getClassLoader()     { return   getClassLoaderData().getClassLoader(); }
 127 
 128   public long traceID() {
 129     if (traceIDField == null) return 0;
 130     return traceIDField.getJLong(addr);
 131   }
 132 
 133   // computed access flags - takes care of inner classes etc.
 134   // This is closer to actual source level than getAccessFlags() etc.
 135   public long computeModifierFlags() {
 136     return 0L; // Unless overridden, modifier_flags is 0.
 137   }
 138 
 139   // same as JVM_GetClassModifiers
 140   public final long getClassModifiers() {
 141     // unlike the VM counterpart we never have to deal with primitive type,
 142     // because we operator on Klass and not an instance of java.lang.Class.
 143     long flags = computeModifierFlags();
 144     if (isSuper()) {
 145        flags |= JVM_ACC_SUPER;
 146     }


< prev index next >