agent/src/share/classes/sun/jvm/hotspot/memory/SystemDictionary.java
Print this page
rev 2 : [mq]: wkk.patch
@@ -27,25 +27,31 @@
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 sun.jvm.hotspot.types.OopField javaSystemLoaderField;
+ private static 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;
+ 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,18 +67,26 @@
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");
+ 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);
}