diff agent/src/share/classes/sun/jvm/hotspot/oops/java_lang_Class.java @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents e6b1331a51d2
children 8e47bac5643a
line wrap: on
line diff
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/java_lang_Class.java	Fri Aug 31 16:39:35 2012 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/java_lang_Class.java	Sat Sep 01 13:25:18 2012 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,7 @@
 import sun.jvm.hotspot.debugger.*;
 import sun.jvm.hotspot.memory.*;
 import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.types.AddressField;
 import sun.jvm.hotspot.types.Type;
 import sun.jvm.hotspot.types.TypeDataBase;
 import sun.jvm.hotspot.utilities.*;
@@ -40,7 +41,7 @@
 public class java_lang_Class {
 
   // java.lang.Class fields
-  static OopField klassField;
+  static int klassOffset;
   static IntField oopSizeField;
 
   static {
@@ -55,19 +56,18 @@
     // klass and oop_size are HotSpot magic fields and hence we can't
     // find them from InstanceKlass for java.lang.Class.
     Type jlc = db.lookupType("java_lang_Class");
-    int klassOffset = (int) jlc.getCIntegerField("_klass_offset").getValue();
-    if (VM.getVM().isCompressedOopsEnabled()) {
-      klassField = new NarrowOopField(new NamedFieldIdentifier("klass"), klassOffset, true);
-    } else {
-      klassField = new OopField(new NamedFieldIdentifier("klass"), klassOffset, true);
-    }
+    klassOffset = (int) jlc.getCIntegerField("_klass_offset").getValue();
     int oopSizeOffset = (int) jlc.getCIntegerField("_oop_size_offset").getValue();
     oopSizeField = new IntField(new NamedFieldIdentifier("oop_size"), oopSizeOffset, true);
   }
 
-  /** get klassOop field at offset hc_klass_offset from a java.lang.Class object */
+  /** get Klass* field at offset hc_klass_offset from a java.lang.Class object */
   public static Klass asKlass(Oop aClass) {
-    return (Klass) java_lang_Class.klassField.getValue(aClass);
+    if (VM.getVM().isCompressedHeadersEnabled()) {
+      throw new InternalError("unimplemented");
+    } else {
+      return (Klass)Metadata.instantiateWrapperFor(aClass.getHandle().getAddressAt(klassOffset));
+    }
   }
 
   /** get oop_size field at offset oop_size_offset from a java.lang.Class object */