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