27 import sun.jvm.hotspot.debugger.*;
28 import sun.jvm.hotspot.memory.*;
29 import sun.jvm.hotspot.runtime.*;
30 import sun.jvm.hotspot.oops.*;
31 import sun.jvm.hotspot.types.*;
32
33 public class ClassLoaderData extends VMObject {
34 static {
35 VM.registerVMInitializedObserver(new java.util.Observer() {
36 public void update(java.util.Observable o, Object data) {
37 initialize(VM.getVM().getTypeDataBase());
38 }
39 });
40 }
41
42 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
43 Type type = db.lookupType("ClassLoaderData");
44 classLoaderFieldOffset = type.getAddressField("_class_loader").getOffset();
45 nextField = type.getAddressField("_next");
46 klassesField = new MetadataField(type.getAddressField("_klasses"), 0);
47 dictionaryField = type.getAddressField("_dictionary");
48 }
49
50 private static long classLoaderFieldOffset;
51 private static AddressField nextField;
52 private static MetadataField klassesField;
53 private static AddressField dictionaryField;
54
55 public ClassLoaderData(Address addr) {
56 super(addr);
57 }
58
59 public Dictionary dictionary() {
60 Address tmp = dictionaryField.getValue();
61 return (Dictionary) VMObjectFactory.newObject(Dictionary.class, tmp);
62 }
63
64 public static ClassLoaderData instantiateWrapperFor(Address addr) {
65 if (addr == null) {
66 return null;
67 }
68 return new ClassLoaderData(addr);
69 }
70
71 public Oop getClassLoader() {
72 Address addr = getAddress().addOffsetTo(classLoaderFieldOffset);
73 VMOopHandle vmOopHandle = VMObjectFactory.newObject(VMOopHandle.class, addr);
74 return vmOopHandle.resolve();
75 }
76
77 public ClassLoaderData next() {
78 return instantiateWrapperFor(nextField.getValue(getAddress()));
79 }
80
81 public Klass getKlasses() { return (Klass)klassesField.getValue(this); }
82
83 /** Lookup an already loaded class. If not found null is returned. */
84 public Klass find(String className) {
85 for (Klass l = getKlasses(); l != null; l = l.getNextLinkKlass()) {
86 if (l.getName().equals(className)) {
87 return l;
88 }
89 }
90 return null;
91 }
92
93 /** Iterate over all klasses - including object, primitive
94 array klasses */
95 public void classesDo(ClassLoaderDataGraph.ClassVisitor v) {
96 for (Klass l = getKlasses(); l != null; l = l.getNextLinkKlass()) {
|
27 import sun.jvm.hotspot.debugger.*;
28 import sun.jvm.hotspot.memory.*;
29 import sun.jvm.hotspot.runtime.*;
30 import sun.jvm.hotspot.oops.*;
31 import sun.jvm.hotspot.types.*;
32
33 public class ClassLoaderData extends VMObject {
34 static {
35 VM.registerVMInitializedObserver(new java.util.Observer() {
36 public void update(java.util.Observable o, Object data) {
37 initialize(VM.getVM().getTypeDataBase());
38 }
39 });
40 }
41
42 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
43 Type type = db.lookupType("ClassLoaderData");
44 classLoaderFieldOffset = type.getAddressField("_class_loader").getOffset();
45 nextField = type.getAddressField("_next");
46 klassesField = new MetadataField(type.getAddressField("_klasses"), 0);
47 hasClassMirrorHolderField = new CIntField(type.getCIntegerField("_has_class_mirror_holder"), 0);
48 dictionaryField = type.getAddressField("_dictionary");
49 }
50
51 private static long classLoaderFieldOffset;
52 private static AddressField nextField;
53 private static MetadataField klassesField;
54 private static CIntField hasClassMirrorHolderField;
55 private static AddressField dictionaryField;
56
57 public ClassLoaderData(Address addr) {
58 super(addr);
59 }
60
61 public Dictionary dictionary() {
62 Address tmp = dictionaryField.getValue();
63 return (Dictionary) VMObjectFactory.newObject(Dictionary.class, tmp);
64 }
65
66 public static ClassLoaderData instantiateWrapperFor(Address addr) {
67 if (addr == null) {
68 return null;
69 }
70 return new ClassLoaderData(addr);
71 }
72
73 public Oop getClassLoader() {
74 Address addr = getAddress().addOffsetTo(classLoaderFieldOffset);
75 VMOopHandle vmOopHandle = VMObjectFactory.newObject(VMOopHandle.class, addr);
76 return vmOopHandle.resolve();
77 }
78
79 public boolean gethasClassMirrorHolder() {
80 return hasClassMirrorHolderField.getValue(this) != 0;
81 }
82
83 public ClassLoaderData next() {
84 return instantiateWrapperFor(nextField.getValue(getAddress()));
85 }
86
87 public Klass getKlasses() { return (Klass)klassesField.getValue(this); }
88
89 /** Lookup an already loaded class. If not found null is returned. */
90 public Klass find(String className) {
91 for (Klass l = getKlasses(); l != null; l = l.getNextLinkKlass()) {
92 if (l.getName().equals(className)) {
93 return l;
94 }
95 }
96 return null;
97 }
98
99 /** Iterate over all klasses - including object, primitive
100 array klasses */
101 public void classesDo(ClassLoaderDataGraph.ClassVisitor v) {
102 for (Klass l = getKlasses(); l != null; l = l.getNextLinkKlass()) {
|