hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/SystemDictionary.java
changeset 394 c33507c3ac75
parent 379 10767ca40189
child 670 ddf3e9583f2f
equal deleted inserted replaced
393:31d6ce8d9edb 394:c33507c3ac75
    27 import java.util.*;
    27 import java.util.*;
    28 import sun.jvm.hotspot.debugger.*;
    28 import sun.jvm.hotspot.debugger.*;
    29 import sun.jvm.hotspot.oops.*;
    29 import sun.jvm.hotspot.oops.*;
    30 import sun.jvm.hotspot.runtime.*;
    30 import sun.jvm.hotspot.runtime.*;
    31 import sun.jvm.hotspot.types.*;
    31 import sun.jvm.hotspot.types.*;
    32 import sun.jvm.hotspot.types.OopField; // resolve ambiguity with oops.OopField
       
    33 
       
    34 // following needed for on-the-fly field construction:
       
    35 import sun.jvm.hotspot.types.basic.BasicOopField;
       
    36 import sun.jvm.hotspot.types.basic.BasicTypeDataBase;
       
    37 
    32 
    38 public class SystemDictionary {
    33 public class SystemDictionary {
    39   private static AddressField dictionaryField;
    34   private static AddressField dictionaryField;
    40   private static AddressField sharedDictionaryField;
    35   private static AddressField sharedDictionaryField;
    41   private static AddressField placeholdersField;
    36   private static AddressField placeholdersField;
    42   private static AddressField loaderConstraintTableField;
    37   private static AddressField loaderConstraintTableField;
    43   private static OopField javaSystemLoaderField;
    38   private static sun.jvm.hotspot.types.OopField javaSystemLoaderField;
    44   private static int nofBuckets;
    39   private static int nofBuckets;
    45 
    40 
    46   private static OopField wellKnownKlasses;
    41   private static sun.jvm.hotspot.types.OopField objectKlassField;
    47   private static OopField objectKlassField;
    42   private static sun.jvm.hotspot.types.OopField classLoaderKlassField;
    48   private static OopField classLoaderKlassField;
    43   private static sun.jvm.hotspot.types.OopField stringKlassField;
    49   private static OopField stringKlassField;
    44   private static sun.jvm.hotspot.types.OopField systemKlassField;
    50   private static OopField systemKlassField;
    45   private static sun.jvm.hotspot.types.OopField threadKlassField;
    51   private static OopField threadKlassField;
    46   private static sun.jvm.hotspot.types.OopField threadGroupKlassField;
    52   private static OopField threadGroupKlassField;
       
    53 
    47 
    54   static {
    48   static {
    55     VM.registerVMInitializedObserver(new Observer() {
    49     VM.registerVMInitializedObserver(new Observer() {
    56         public void update(Observable o, Object data) {
    50         public void update(Observable o, Object data) {
    57           initialize(VM.getVM().getTypeDataBase());
    51           initialize(VM.getVM().getTypeDataBase());
    67     placeholdersField = type.getAddressField("_placeholders");
    61     placeholdersField = type.getAddressField("_placeholders");
    68     loaderConstraintTableField = type.getAddressField("_loader_constraints");
    62     loaderConstraintTableField = type.getAddressField("_loader_constraints");
    69     javaSystemLoaderField = type.getOopField("_java_system_loader");
    63     javaSystemLoaderField = type.getOopField("_java_system_loader");
    70     nofBuckets = db.lookupIntConstant("SystemDictionary::_nof_buckets").intValue();
    64     nofBuckets = db.lookupIntConstant("SystemDictionary::_nof_buckets").intValue();
    71 
    65 
    72     wellKnownKlasses = type.getOopField("_well_known_klasses[0]");
    66     objectKlassField = type.getOopField(WK_KLASS("object_klass"));
    73     objectKlassField = findWellKnownKlass("object_klass", type, db);
    67     classLoaderKlassField = type.getOopField(WK_KLASS("classloader_klass"));
    74     classLoaderKlassField = findWellKnownKlass("classloader_klass", type, db);
    68     stringKlassField = type.getOopField(WK_KLASS("string_klass"));
    75     stringKlassField = findWellKnownKlass("string_klass", type, db);
    69     systemKlassField = type.getOopField(WK_KLASS("system_klass"));
    76     systemKlassField = findWellKnownKlass("system_klass", type, db);
    70     threadKlassField = type.getOopField(WK_KLASS("thread_klass"));
    77     threadKlassField = findWellKnownKlass("thread_klass", type, db);
    71     threadGroupKlassField = type.getOopField(WK_KLASS("threadGroup_klass"));
    78     threadGroupKlassField = findWellKnownKlass("threadGroup_klass", type, db);
    72   }
    79   }
    73 
    80 
    74   // This WK functions must follow the definitions in systemDictionary.hpp:
    81   private static OopField findWellKnownKlass(String indexName, Type type, TypeDataBase db) {
    75   private static String WK_KLASS(String name) {
    82     Address wkk = wellKnownKlasses.getStaticFieldAddress();
    76       //#define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]
    83     int index = db.lookupIntConstant("SystemDictionary::#"+indexName).intValue();
    77       return ("_well_known_klasses[SystemDictionary::"+WK_KLASS_ENUM_NAME(name)+"]");
    84     return new BasicOopField((BasicTypeDataBase)db, type, indexName, type,
    78   }
    85                              true, index * db.getAddressSize(), wkk);
    79   private static String WK_KLASS_ENUM_NAME(String kname) {
       
    80       //#define WK_KLASS_ENUM_NAME(kname)    kname##_knum
       
    81       return (kname+"_knum");
    86   }
    82   }
    87 
    83 
    88   public Dictionary dictionary() {
    84   public Dictionary dictionary() {
    89     Address tmp = dictionaryField.getValue();
    85     Address tmp = dictionaryField.getValue();
    90     return (Dictionary) VMObjectFactory.newObject(Dictionary.class, tmp);
    86     return (Dictionary) VMObjectFactory.newObject(Dictionary.class, tmp);