agent/src/share/classes/sun/jvm/hotspot/memory/SystemDictionary.java

Print this page
rev 2 : [mq]: wkk.patch

*** 27,51 **** import java.util.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.oops.*; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.types.*; public class SystemDictionary { private static AddressField dictionaryField; private static AddressField sharedDictionaryField; private static AddressField placeholdersField; private static AddressField loaderConstraintTableField; ! private static sun.jvm.hotspot.types.OopField javaSystemLoaderField; private static int nofBuckets; ! private static sun.jvm.hotspot.types.OopField objectKlassField; ! private static sun.jvm.hotspot.types.OopField classLoaderKlassField; ! private static sun.jvm.hotspot.types.OopField stringKlassField; ! private static sun.jvm.hotspot.types.OopField systemKlassField; ! private static sun.jvm.hotspot.types.OopField threadKlassField; ! private static sun.jvm.hotspot.types.OopField threadGroupKlassField; static { VM.registerVMInitializedObserver(new Observer() { public void update(Observable o, Object data) { initialize(VM.getVM().getTypeDataBase()); --- 27,57 ---- import java.util.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.oops.*; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.types.*; + import sun.jvm.hotspot.types.OopField; // resolve ambiguity with oops.OopField + // following needed for on-the-fly field construction: + import sun.jvm.hotspot.types.basic.BasicOopField; + import sun.jvm.hotspot.types.basic.BasicTypeDataBase; + public class SystemDictionary { private static AddressField dictionaryField; private static AddressField sharedDictionaryField; private static AddressField placeholdersField; private static AddressField loaderConstraintTableField; ! private static OopField javaSystemLoaderField; private static int nofBuckets; ! private static OopField wellKnownKlasses; ! private static OopField objectKlassField; ! private static OopField classLoaderKlassField; ! private static OopField stringKlassField; ! private static OopField systemKlassField; ! private static OopField threadKlassField; ! private static OopField threadGroupKlassField; static { VM.registerVMInitializedObserver(new Observer() { public void update(Observable o, Object data) { initialize(VM.getVM().getTypeDataBase());
*** 61,78 **** placeholdersField = type.getAddressField("_placeholders"); loaderConstraintTableField = type.getAddressField("_loader_constraints"); javaSystemLoaderField = type.getOopField("_java_system_loader"); nofBuckets = db.lookupIntConstant("SystemDictionary::_nof_buckets").intValue(); ! objectKlassField = type.getOopField("_object_klass"); ! classLoaderKlassField = type.getOopField("_classloader_klass"); ! stringKlassField = type.getOopField("_string_klass"); ! systemKlassField = type.getOopField("_system_klass"); ! threadKlassField = type.getOopField("_thread_klass"); ! threadGroupKlassField = type.getOopField("_threadGroup_klass"); } public Dictionary dictionary() { Address tmp = dictionaryField.getValue(); return (Dictionary) VMObjectFactory.newObject(Dictionary.class, tmp); } --- 67,92 ---- placeholdersField = type.getAddressField("_placeholders"); loaderConstraintTableField = type.getAddressField("_loader_constraints"); javaSystemLoaderField = type.getOopField("_java_system_loader"); nofBuckets = db.lookupIntConstant("SystemDictionary::_nof_buckets").intValue(); ! wellKnownKlasses = type.getOopField("_well_known_klasses[0]"); ! objectKlassField = findWellKnownKlass("object_klass", type, db); ! classLoaderKlassField = findWellKnownKlass("classloader_klass", type, db); ! stringKlassField = findWellKnownKlass("string_klass", type, db); ! systemKlassField = findWellKnownKlass("system_klass", type, db); ! threadKlassField = findWellKnownKlass("thread_klass", type, db); ! threadGroupKlassField = findWellKnownKlass("threadGroup_klass", type, db); } + private static OopField findWellKnownKlass(String indexName, Type type, TypeDataBase db) { + Address wkk = wellKnownKlasses.getStaticFieldAddress(); + int index = db.lookupIntConstant("SystemDictionary::#"+indexName).intValue(); + return new BasicOopField((BasicTypeDataBase)db, type, indexName, type, + true, index * db.getAddressSize(), wkk); + } + public Dictionary dictionary() { Address tmp = dictionaryField.getValue(); return (Dictionary) VMObjectFactory.newObject(Dictionary.class, tmp); }