diff agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.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 8150fa46d2ed
children b2dbd323c668
line wrap: on
line diff
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java	Fri Aug 31 16:39:35 2012 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java	Sat Sep 01 13:25:18 2012 -0400
@@ -34,7 +34,7 @@
 import sun.jvm.hotspot.types.*;
 import sun.jvm.hotspot.utilities.*;
 
-public class ConstMethod extends Oop {
+public class ConstMethod extends VMObject {
   static {
     VM.registerVMInitializedObserver(new Observer() {
         public void update(Observable o, Object data) {
@@ -50,18 +50,18 @@
   private static int HAS_EXCEPTION_TABLE;
 
   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
-    Type type                  = db.lookupType("constMethodOopDesc");
-    constants                  = new OopField(type.getOopField("_constants"), 0);
+    Type type                  = db.lookupType("ConstMethod");
+    constants                  = new MetadataField(type.getAddressField("_constants"), 0);
     constMethodSize            = new CIntField(type.getCIntegerField("_constMethod_size"), 0);
     flags                      = new ByteField(type.getJByteField("_flags"), 0);
 
     // enum constants for flags
-    HAS_LINENUMBER_TABLE      = db.lookupIntConstant("constMethodOopDesc::_has_linenumber_table").intValue();
-    HAS_CHECKED_EXCEPTIONS     = db.lookupIntConstant("constMethodOopDesc::_has_checked_exceptions").intValue();
-    HAS_LOCALVARIABLE_TABLE   = db.lookupIntConstant("constMethodOopDesc::_has_localvariable_table").intValue();
-    HAS_EXCEPTION_TABLE       = db.lookupIntConstant("constMethodOopDesc::_has_exception_table").intValue();
+    HAS_LINENUMBER_TABLE      = db.lookupIntConstant("ConstMethod::_has_linenumber_table").intValue();
+    HAS_CHECKED_EXCEPTIONS     = db.lookupIntConstant("ConstMethod::_has_checked_exceptions").intValue();
+    HAS_LOCALVARIABLE_TABLE   = db.lookupIntConstant("ConstMethod::_has_localvariable_table").intValue();
+    HAS_EXCEPTION_TABLE       = db.lookupIntConstant("ConstMethod::_has_exception_table").intValue();
 
-    // Size of Java bytecodes allocated immediately after constMethodOop.
+    // Size of Java bytecodes allocated immediately after ConstMethod*.
     codeSize                   = new CIntField(type.getCIntegerField("_code_size"), 0);
     nameIndex                  = new CIntField(type.getCIntegerField("_name_index"), 0);
     signatureIndex             = new CIntField(type.getCIntegerField("_signature_index"), 0);
@@ -81,12 +81,12 @@
     exceptionTableElementSize = type.getSize();
   }
 
-  ConstMethod(OopHandle handle, ObjectHeap heap) {
-    super(handle, heap);
+  public ConstMethod(Address addr) {
+    super(addr);
   }
 
   // Fields
-  private static OopField  constants;
+  private static MetadataField constants;
   private static CIntField constMethodSize;
   private static ByteField flags;
   private static CIntField codeSize;
@@ -104,8 +104,8 @@
 
   public Method getMethod() {
     InstanceKlass ik = (InstanceKlass)getConstants().getPoolHolder();
-    ObjArray methods = ik.getMethods();
-    return (Method)methods.getObjAt(getIdNum());
+    MethodArray methods = ik.getMethods();
+    return methods.at((int)getIdNum());
   }
 
   // Accessors for declared fields
@@ -157,7 +157,7 @@
 
   /** Get a bytecode or breakpoint at the given bci */
   public int getBytecodeOrBPAt(int bci) {
-    return getHandle().getJByteAt(bytecodeOffset + bci) & 0xFF;
+    return getAddress().getJByteAt(bytecodeOffset + bci) & 0xFF;
   }
 
   public byte getBytecodeByteArg(int bci) {
@@ -215,23 +215,21 @@
      for( int i=0; i < bc.length; i++ )
      {
         long offs = bytecodeOffset + i;
-        bc[i] = getHandle().getJByteAt( offs );
+        bc[i] = getAddress().getJByteAt( offs );
      }
      return bc;
   }
 
-  public long getObjectSize() {
-    return getConstMethodSize() * getHeap().getOopSize();
+  public long getSize() {
+    return getConstMethodSize();
   }
 
   public void printValueOn(PrintStream tty) {
-    tty.print("ConstMethod " + getName().asString() + getSignature().asString() + "@" + getHandle());
+    tty.print("ConstMethod " + getName().asString() + getSignature().asString() + "@" + getAddress());
   }
 
-  public void iterateFields(OopVisitor visitor, boolean doVMFields) {
-    super.iterateFields(visitor, doVMFields);
-    if (doVMFields) {
-      visitor.doOop(constants, true);
+  public void iterateFields(MetadataVisitor visitor) {
+    visitor.doMetadata(constants, true);
       visitor.doCInt(constMethodSize, true);
       visitor.doByte(flags, true);
       visitor.doCInt(codeSize, true);
@@ -240,7 +238,6 @@
       visitor.doCInt(genericSignatureIndex, true);
       visitor.doCInt(codeSize, true);
     }
-  }
 
   // Accessors
 
@@ -266,7 +263,7 @@
       // The line numbers are a short array of 2-tuples [start_pc, line_number].
       // Not necessarily sorted and not necessarily one-to-one.
       CompressedLineNumberReadStream stream =
-        new CompressedLineNumberReadStream(getHandle(), (int) offsetOfCompressedLineNumberTable());
+        new CompressedLineNumberReadStream(getAddress(), (int) offsetOfCompressedLineNumberTable());
       while (stream.readPair()) {
         if (stream.bci() == bci) {
           // perfect match
@@ -290,7 +287,7 @@
     }
     int len = getLineNumberTableLength();
     CompressedLineNumberReadStream stream =
-      new CompressedLineNumberReadStream(getHandle(), (int) offsetOfCompressedLineNumberTable());
+      new CompressedLineNumberReadStream(getAddress(), (int) offsetOfCompressedLineNumberTable());
     LineNumberTableElement[] ret = new LineNumberTableElement[len];
 
     for (int idx = 0; idx < len; idx++) {
@@ -316,7 +313,7 @@
     LocalVariableTableElement[] ret = new LocalVariableTableElement[getLocalVariableTableLength()];
     long offset = offsetOfLocalVariableTable();
     for (int i = 0; i < ret.length; i++) {
-      ret[i] = new LocalVariableTableElement(getHandle(), offset);
+      ret[i] = new LocalVariableTableElement(getAddress(), offset);
       offset += localVariableTableElementSize;
     }
     return ret;
@@ -333,7 +330,7 @@
     ExceptionTableElement[] ret = new ExceptionTableElement[getExceptionTableLength()];
     long offset = offsetOfExceptionTable();
     for (int i = 0; i < ret.length; i++) {
-      ret[i] = new ExceptionTableElement(getHandle(), offset);
+      ret[i] = new ExceptionTableElement(getAddress(), offset);
       offset += exceptionTableElementSize;
     }
     return ret;
@@ -350,7 +347,7 @@
     CheckedExceptionElement[] ret = new CheckedExceptionElement[getCheckedExceptionsLength()];
     long offset = offsetOfCheckedExceptions();
     for (int i = 0; i < ret.length; i++) {
-      ret[i] = new CheckedExceptionElement(getHandle(), offset);
+      ret[i] = new CheckedExceptionElement(getAddress(), offset);
       offset += checkedExceptionElementSize;
     }
     return ret;
@@ -370,14 +367,14 @@
     return bytecodeOffset + getCodeSize();
   }
 
-  // Offset of start of compressed line number table (see methodOop.hpp)
+  // Offset of start of compressed line number table (see method.hpp)
   private long offsetOfCompressedLineNumberTable() {
     return offsetOfCodeEnd() + (isNative() ? 2 * VM.getVM().getAddressSize() : 0);
   }
 
-  // Offset of last short in methodOop
+  // Offset of last short in Method*
   private long offsetOfLastU2Element() {
-    return getObjectSize() - 2;
+    return getSize() * VM.getVM().getObjectHeap().getOopSize() - 2;
   }
 
   private long offsetOfCheckedExceptionsLength() {
@@ -386,7 +383,7 @@
 
   private int getCheckedExceptionsLength() {
     if (hasCheckedExceptions()) {
-      return (int) getHandle().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true);
+      return (int) getAddress().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true);
     } else {
       return 0;
     }
@@ -407,7 +404,7 @@
     int len = 0;
     if (hasLineNumberTable()) {
       CompressedLineNumberReadStream stream =
-        new CompressedLineNumberReadStream(getHandle(), (int) offsetOfCompressedLineNumberTable());
+        new CompressedLineNumberReadStream(getAddress(), (int) offsetOfCompressedLineNumberTable());
       while (stream.readPair()) {
         len += 1;
       }
@@ -417,7 +414,7 @@
 
   private int getLocalVariableTableLength() {
     if (hasLocalVariableTable()) {
-      return (int) getHandle().getCIntegerAt(offsetOfLocalVariableTableLength(), 2, true);
+      return (int) getAddress().getCIntegerAt(offsetOfLocalVariableTableLength(), 2, true);
     } else {
       return 0;
     }
@@ -450,7 +447,7 @@
 
   private int getExceptionTableLength() {
     if (hasExceptionTable()) {
-      return (int) getHandle().getCIntegerAt(offsetOfExceptionTableLength(), 2, true);
+      return (int) getAddress().getCIntegerAt(offsetOfExceptionTableLength(), 2, true);
     } else {
       return 0;
     }