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);
}