38 39 // initialize fields for java.lang.Class 40 public class java_lang_Class { 41 42 // java.lang.Class fields 43 static OopField klassField; 44 static IntField oopSizeField; 45 46 static { 47 VM.registerVMInitializedObserver(new Observer() { 48 public void update(Observable o, Object data) { 49 initialize(VM.getVM().getTypeDataBase()); 50 } 51 }); 52 } 53 54 private static synchronized void initialize(TypeDataBase db) { 55 // klass and oop_size are HotSpot magic fields and hence we can't 56 // find them from InstanceKlass for java.lang.Class. 57 Type jlc = db.lookupType("java_lang_Class"); 58 int klassOffset = (int) jlc.getCIntegerField("klass_offset").getValue(); 59 if (VM.getVM().isCompressedOopsEnabled()) { 60 klassField = new NarrowOopField(new NamedFieldIdentifier("klass"), klassOffset, true); 61 } else { 62 klassField = new OopField(new NamedFieldIdentifier("klass"), klassOffset, true); 63 } 64 int oopSizeOffset = (int) jlc.getCIntegerField("oop_size_offset").getValue(); 65 oopSizeField = new IntField(new NamedFieldIdentifier("oop_size"), oopSizeOffset, true); 66 } 67 68 /** get klassOop field at offset hc_klass_offset from a java.lang.Class object */ 69 public static Klass asKlass(Oop aClass) { 70 return (Klass) java_lang_Class.klassField.getValue(aClass); 71 } 72 73 /** get oop_size field at offset oop_size_offset from a java.lang.Class object */ 74 public static long getOopSize(Oop aClass) { 75 return java_lang_Class.oopSizeField.getValue(aClass); 76 } 77 } | 38 39 // initialize fields for java.lang.Class 40 public class java_lang_Class { 41 42 // java.lang.Class fields 43 static OopField klassField; 44 static IntField oopSizeField; 45 46 static { 47 VM.registerVMInitializedObserver(new Observer() { 48 public void update(Observable o, Object data) { 49 initialize(VM.getVM().getTypeDataBase()); 50 } 51 }); 52 } 53 54 private static synchronized void initialize(TypeDataBase db) { 55 // klass and oop_size are HotSpot magic fields and hence we can't 56 // find them from InstanceKlass for java.lang.Class. 57 Type jlc = db.lookupType("java_lang_Class"); 58 int klassOffset = (int) jlc.getCIntegerField("_klass_offset").getValue(); 59 if (VM.getVM().isCompressedOopsEnabled()) { 60 klassField = new NarrowOopField(new NamedFieldIdentifier("klass"), klassOffset, true); 61 } else { 62 klassField = new OopField(new NamedFieldIdentifier("klass"), klassOffset, true); 63 } 64 int oopSizeOffset = (int) jlc.getCIntegerField("_oop_size_offset").getValue(); 65 oopSizeField = new IntField(new NamedFieldIdentifier("oop_size"), oopSizeOffset, true); 66 } 67 68 /** get klassOop field at offset hc_klass_offset from a java.lang.Class object */ 69 public static Klass asKlass(Oop aClass) { 70 return (Klass) java_lang_Class.klassField.getValue(aClass); 71 } 72 73 /** get oop_size field at offset oop_size_offset from a java.lang.Class object */ 74 public static long getOopSize(Oop aClass) { 75 return java_lang_Class.oopSizeField.getValue(aClass); 76 } 77 } |