aboutsummaryrefslogtreecommitdiff
path: root/agent
diff options
context:
space:
mode:
authorcoleenp <none@none>2011-01-27 16:11:27 -0800
committercoleenp <none@none>2011-01-27 16:11:27 -0800
commit04747e65790fe8c03e109926f18741246ad7d96c (patch)
treeabc49697932ba548735618f46389cd632fb1cb77 /agent
parent73fad8016ba7b4bc3f2aacc6ddf6df2334c3bbaf (diff)
6990754: Use native memory and reference counting to implement SymbolTable
Summary: move symbols from permgen into C heap and reference count them Reviewed-by: never, acorn, jmasa, stefank --HG-- rename : src/share/vm/oops/symbolOop.cpp => src/share/vm/oops/symbol.cpp rename : src/share/vm/oops/symbolOop.hpp => src/share/vm/oops/symbol.hpp
Diffstat (limited to 'agent')
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java44
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java61
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java38
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeWithKlass.java8
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/memory/DictionaryEntry.java2
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/memory/LoaderConstraintEntry.java6
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/memory/PlaceholderEntry.java2
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/memory/StringTable.java4
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java4
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java47
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java4
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java55
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java16
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/Method.java6
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java8
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/Symbol.java51
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/oops/SymbolKlass.java60
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java4
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/types/Field.java2
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java22
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java2
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java10
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java10
23 files changed, 262 insertions, 204 deletions
diff --git a/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java b/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java
index 3bbe31378..e4a6b6b98 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java
@@ -428,6 +428,36 @@ public class CommandProcessor {
}
}
},
+ new Command("symbol", "symbol address", false) {
+ public void doit(Tokens t) {
+ if (t.countTokens() != 1) {
+ usage();
+ } else {
+ Address a = VM.getVM().getDebugger().parseAddress(t.nextToken());
+ Symbol.create(a).printValueOn(out);
+ out.println();
+ }
+ }
+ },
+ new Command("symboltable", "symboltable name", false) {
+ public void doit(Tokens t) {
+ if (t.countTokens() != 1) {
+ usage();
+ } else {
+ out.println(SymbolTable.getTheTable().probe(t.nextToken()));
+ }
+ }
+ },
+ new Command("symboldump", "symboldump", false) {
+ public void doit(Tokens t) {
+ SymbolTable.getTheTable().symbolsDo(new SymbolTable.SymbolVisitor() {
+ public void visit(Symbol sym) {
+ sym.printValueOn(out);
+ out.println();
+ }
+ });
+ }
+ },
new Command("flags", "flags [ flag ]", false) {
public void doit(Tokens t) {
int tokens = t.countTokens();
@@ -629,17 +659,6 @@ public class CommandProcessor {
}
}
},
- new Command("symbol", "symbol name", false) {
- public void doit(Tokens t) {
- if (t.countTokens() != 1) {
- usage();
- } else {
- String symbol = t.nextToken();
- Address a = lookup(symbol);
- out.println(symbol + " = " + a);
- }
- }
- },
new Command("printstatics", "printstatics [ type ]", false) {
public void doit(Tokens t) {
if (t.countTokens() > 1) {
@@ -1262,6 +1281,9 @@ public class CommandProcessor {
this.err = err;
for (int i = 0; i < commandList.length; i++) {
Command c = commandList[i];
+ if (commands.get(c.name) != null) {
+ throw new InternalError(c.name + " has multiple definitions");
+ }
commands.put(c.name, c);
}
if (debugger.isAttached()) {
diff --git a/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java b/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java
index 9cf6122c7..fcaf47668 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java
@@ -89,6 +89,37 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase {
readVMLongConstants();
}
+ public Type lookupType(String cTypeName, boolean throwException) {
+ Type fieldType = super.lookupType(cTypeName, false);
+ if (fieldType == null && cTypeName.startsWith("const ")) {
+ fieldType = (BasicType)lookupType(cTypeName.substring(6), false);
+ }
+ if (fieldType == null && cTypeName.endsWith(" const")) {
+ fieldType = (BasicType)lookupType(cTypeName.substring(0, cTypeName.length() - 6), false);
+ }
+ if (fieldType == null) {
+ if (cTypeName.startsWith("GrowableArray<") && cTypeName.endsWith(">*")) {
+ String ttype = cTypeName.substring("GrowableArray<".length(),
+ cTypeName.length() - 2);
+ Type templateType = lookupType(ttype, false);
+ if (templateType == null && typeNameIsPointerType(ttype)) {
+ templateType = recursiveCreateBasicPointerType(ttype);
+ }
+ if (templateType == null) {
+ lookupOrFail(ttype);
+ }
+ fieldType = recursiveCreateBasicPointerType(cTypeName);
+ }
+ }
+ if (fieldType == null && typeNameIsPointerType(cTypeName)) {
+ fieldType = recursiveCreateBasicPointerType(cTypeName);
+ }
+ if (fieldType == null && throwException) {
+ super.lookupType(cTypeName, true);
+ }
+ return fieldType;
+ }
+
private void readVMTypes() {
// Get the variables we need in order to traverse the VMTypeEntry[]
long typeEntryTypeNameOffset;
@@ -250,7 +281,7 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase {
BasicType containingType = lookupOrFail(typeName);
// The field's Type must already be in the database -- no exceptions
- BasicType fieldType = lookupOrFail(typeString);
+ BasicType fieldType = (BasicType)lookupType(typeString);
// Create field by type
createField(containingType, fieldName, fieldType,
@@ -442,10 +473,17 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase {
workarounds due to incomplete information in the VMStructs
database. */
private BasicPointerType recursiveCreateBasicPointerType(String typeName) {
+ BasicPointerType result = (BasicPointerType)super.lookupType(typeName, false);
+ if (result != null) {
+ return result;
+ }
String targetTypeName = typeName.substring(0, typeName.lastIndexOf('*')).trim();
Type targetType = null;
if (typeNameIsPointerType(targetTypeName)) {
- targetType = recursiveCreateBasicPointerType(targetTypeName);
+ targetType = lookupType(targetTypeName, false);
+ if (targetType == null) {
+ targetType = recursiveCreateBasicPointerType(targetTypeName);
+ }
} else {
targetType = lookupType(targetTypeName, false);
if (targetType == null) {
@@ -466,6 +504,20 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase {
BasicType basicTargetType = createBasicType(targetTypeName, false, true, true);
basicTargetType.setSize(1);
targetType = basicTargetType;
+ } else if (targetTypeName.startsWith("GrowableArray<")) {
+ BasicType basicTargetType = createBasicType(targetTypeName, false, false, false);
+
+ // transfer fields from GenericGrowableArray to template instance
+ BasicType generic = lookupOrFail("GenericGrowableArray");
+ basicTargetType.setSize(generic.getSize());
+ Iterator fields = generic.getFields();
+ while (fields.hasNext()) {
+ Field f = (Field)fields.next();
+ basicTargetType.addField(internalCreateField(basicTargetType, f.getName(),
+ f.getType(), f.isStatic(),
+ f.getOffset(), null));
+ }
+ targetType = basicTargetType;
} else {
if (DEBUG) {
System.err.println("WARNING: missing target type \"" + targetTypeName + "\" for pointer type \"" + typeName + "\"");
@@ -474,7 +526,10 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase {
}
}
}
- return new BasicPointerType(this, typeName, targetType);
+ result = new BasicPointerType(this, typeName, targetType);
+ result.setSize(UNINITIALIZED_SIZE);
+ addType(result);
+ return result;
}
private boolean typeNameIsPointerType(String typeName) {
diff --git a/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java b/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java
index 163388810..67962adef 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java
@@ -112,7 +112,7 @@ public class BytecodeLoadConstant extends BytecodeWithCPIndex {
}
// return Symbol (if unresolved) or Klass (if resolved)
- public Oop getKlass() {
+ public Object getKlass() {
if (Assert.ASSERTS_ENABLED) {
Assert.that(isKlassConstant(), "not a klass literal");
}
@@ -121,11 +121,11 @@ public class BytecodeLoadConstant extends BytecodeWithCPIndex {
// decide based on the oop type.
ConstantPool cpool = method().getConstants();
int cpIndex = index();
- Oop oop = cpool.getObjAt(cpIndex);
- if (oop.isKlass()) {
- return (Klass) oop;
- } else if (oop.isSymbol()) {
- return (Symbol) oop;
+ ConstantPool.CPSlot oop = cpool.getSlotAt(cpIndex);
+ if (oop.isOop()) {
+ return (Klass) oop.getOop();
+ } else if (oop.isMetaData()) {
+ return oop.getSymbol();
} else {
throw new RuntimeException("should not reach here");
}
@@ -165,12 +165,12 @@ public class BytecodeLoadConstant extends BytecodeWithCPIndex {
// tag change from 'unresolved' to 'string' does not happen atomically.
// We just look at the object at the corresponding index and
// decide based on the oop type.
- Oop obj = cpool.getObjAt(cpIndex);
- if (obj.isSymbol()) {
- Symbol sym = (Symbol) obj;
- return "<String \"" + sym.asString() + "\">";
- } else if (obj.isInstance()) {
- return "<String \"" + OopUtilities.stringOopToString(obj) + "\">";
+ ConstantPool.CPSlot obj = cpool.getSlotAt(cpIndex);
+ if (obj.isMetaData()) {
+ Symbol sym = obj.getSymbol();
+ return "<String \"" + sym.asString() + "\">";
+ } else if (obj.isOop()) {
+ return "<String \"" + OopUtilities.stringOopToString(obj.getOop()) + "\">";
} else {
throw new RuntimeException("should not reach here");
}
@@ -178,13 +178,13 @@ public class BytecodeLoadConstant extends BytecodeWithCPIndex {
// tag change from 'unresolved' to 'klass' does not happen atomically.
// We just look at the object at the corresponding index and
// decide based on the oop type.
- Oop obj = cpool.getObjAt(cpIndex);
- if (obj.isKlass()) {
- Klass k = (Klass) obj;
- return "<Class " + k.getName().asString() + "@" + k.getHandle() + ">";
- } else if (obj.isSymbol()) {
- Symbol sym = (Symbol) obj;
- return "<Class " + sym.asString() + ">";
+ ConstantPool.CPSlot obj = cpool.getSlotAt(cpIndex);
+ if (obj.isOop()) {
+ Klass k = (Klass) obj.getOop();
+ return "<Class " + k.getName().asString() + "@" + k.getHandle() + ">";
+ } else if (obj.isMetaData()) {
+ Symbol sym = obj.getSymbol();
+ return "<Class " + sym.asString() + ">";
} else {
throw new RuntimeException("should not reach here");
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeWithKlass.java b/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeWithKlass.java
index 563535992..3a62c2dad 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeWithKlass.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeWithKlass.java
@@ -37,11 +37,11 @@ public class BytecodeWithKlass extends BytecodeWithCPIndex {
}
public Symbol getClassName() {
- Oop obj = method().getConstants().getObjAt(index());
- if (obj instanceof Symbol) {
- return (Symbol)obj;
+ ConstantPool.CPSlot obj = method().getConstants().getSlotAt(index());
+ if (obj.isMetaData()) {
+ return obj.getSymbol();
} else {
- return ((Klass)obj).getName();
+ return ((Klass)obj.getOop()).getName();
}
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/memory/DictionaryEntry.java b/agent/src/share/classes/sun/jvm/hotspot/memory/DictionaryEntry.java
index cb0c38f5d..a42479d53 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/memory/DictionaryEntry.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/memory/DictionaryEntry.java
@@ -63,7 +63,7 @@ public class DictionaryEntry extends sun.jvm.hotspot.utilities.HashtableEntry {
}
public Klass klass() {
- return (Klass) literal();
+ return (Klass)VM.getVM().getObjectHeap().newOop(literalValue().addOffsetToAsOopHandle(0));
}
public DictionaryEntry(Address addr) {
diff --git a/agent/src/share/classes/sun/jvm/hotspot/memory/LoaderConstraintEntry.java b/agent/src/share/classes/sun/jvm/hotspot/memory/LoaderConstraintEntry.java
index 6f0296372..a6b2a743e 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/memory/LoaderConstraintEntry.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/memory/LoaderConstraintEntry.java
@@ -42,14 +42,14 @@ public class LoaderConstraintEntry extends sun.jvm.hotspot.utilities.HashtableEn
private static synchronized void initialize(TypeDataBase db) {
Type type = db.lookupType("LoaderConstraintEntry");
- nameField = type.getOopField("_name");
+ nameField = type.getAddressField("_name");
numLoadersField = type.getCIntegerField("_num_loaders");
maxLoadersField = type.getCIntegerField("_max_loaders");
loadersField = type.getAddressField("_loaders");
}
// Fields
- private static sun.jvm.hotspot.types.OopField nameField;
+ private static AddressField nameField;
private static CIntegerField numLoadersField;
private static CIntegerField maxLoadersField;
private static AddressField loadersField;
@@ -57,7 +57,7 @@ public class LoaderConstraintEntry extends sun.jvm.hotspot.utilities.HashtableEn
// Accessors
public Symbol name() {
- return (Symbol) VM.getVM().getObjectHeap().newOop(nameField.getValue(addr));
+ return Symbol.create(nameField.getValue(addr));
}
public int numLoaders() {
diff --git a/agent/src/share/classes/sun/jvm/hotspot/memory/PlaceholderEntry.java b/agent/src/share/classes/sun/jvm/hotspot/memory/PlaceholderEntry.java
index f6f1dc7e9..5574910a3 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/memory/PlaceholderEntry.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/memory/PlaceholderEntry.java
@@ -58,7 +58,7 @@ public class PlaceholderEntry extends sun.jvm.hotspot.utilities.HashtableEntry {
}
public Symbol klass() {
- return (Symbol) literal();
+ return Symbol.create(literalValue());
}
/* covariant return type :-(
diff --git a/agent/src/share/classes/sun/jvm/hotspot/memory/StringTable.java b/agent/src/share/classes/sun/jvm/hotspot/memory/StringTable.java
index 0dd66f1fb..c17610cb2 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/memory/StringTable.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/memory/StringTable.java
@@ -70,11 +70,13 @@ public class StringTable extends sun.jvm.hotspot.utilities.Hashtable {
}
public void stringsDo(StringVisitor visitor) {
+ ObjectHeap oh = VM.getVM().getObjectHeap();
int numBuckets = tableSize();
for (int i = 0; i < numBuckets; i++) {
for (HashtableEntry e = (HashtableEntry) bucket(i); e != null;
e = (HashtableEntry) e.next()) {
- visitor.visit((Instance) e.literal());
+ Instance s = (Instance)oh.newOop(e.literalValue().addOffsetToAsOopHandle(0));
+ visitor.visit(s);
}
}
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java b/agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java
index 0ad8aea1d..cfee9fbe0 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java
@@ -85,7 +85,7 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
long hashValue = hashSymbol(name);
for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) {
if (e.hash() == hashValue) {
- Symbol sym = (Symbol) e.literal();
+ Symbol sym = Symbol.create(e.literalValue());
if (sym.equals(name)) {
return sym;
}
@@ -103,7 +103,7 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
for (int i = 0; i < numBuckets; i++) {
for (HashtableEntry e = (HashtableEntry) bucket(i); e != null;
e = (HashtableEntry) e.next()) {
- visitor.visit((Symbol) e.literal());
+ visitor.visit(Symbol.create(e.literalValue()));
}
}
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
index 31cc2a956..f1babff8c 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
@@ -35,6 +35,38 @@ import sun.jvm.hotspot.utilities.*;
// as described in the class file
public class ConstantPool extends Oop implements ClassConstants {
+
+ public class CPSlot {
+ private Address ptr;
+
+ CPSlot(Address ptr) {
+ this.ptr = ptr;
+ }
+ CPSlot(Symbol sym) {
+ this.ptr = sym.getAddress().orWithMask(1);
+ }
+
+ public boolean isOop() {
+ return (ptr.minus(null) & 1) == 0;
+ }
+ public boolean isMetaData() {
+ return (ptr.minus(null) & 1) == 1;
+ }
+
+ public Symbol getSymbol() {
+ if (isMetaData()) {
+ return Symbol.create(ptr.xorWithMask(1));
+ }
+ throw new InternalError("not a symbol");
+ }
+ public Oop getOop() {
+ if (isOop()) {
+ return VM.getVM().getObjectHeap().newOop(ptr.addOffsetToAsOopHandle(0));
+ }
+ throw new InternalError("not an oop");
+ }
+ }
+
// Used for debugging this code
private static final boolean DEBUG = false;
@@ -110,12 +142,17 @@ public class ConstantPool extends Oop implements ClassConstants {
return new ConstantTag(getTags().getByteAt((int) index));
}
- public Oop getObjAt(long index){
+ public CPSlot getSlotAt(long index) {
+ return new CPSlot(getHandle().getAddressAt(indexOffset(index)));
+ }
+
+ public Oop getObjAtRaw(long index){
return getHeap().newOop(getHandle().getOopHandleAt(indexOffset(index)));
}
public Symbol getSymbolAt(long index) {
- return (Symbol) getObjAt(index);
+ CPSlot slot = getSlotAt(index);
+ return slot.getSymbol();
}
public int getIntAt(long index){
@@ -187,7 +224,7 @@ public class ConstantPool extends Oop implements ClassConstants {
// returns null, if not resolved.
public Klass getKlassRefAt(int which) {
if( ! getTagAt(which).isKlass()) return null;
- return (Klass) getObjAt(which);
+ return (Klass) getObjAtRaw(which);
}
// returns null, if not resolved.
@@ -477,7 +514,7 @@ public class ConstantPool extends Oop implements ClassConstants {
case JVM_CONSTANT_Class: {
dos.writeByte(cpConstType);
// Klass already resolved. ConstantPool constains klassOop.
- Klass refKls = (Klass) getObjAt(ci);
+ Klass refKls = (Klass) getObjAtRaw(ci);
String klassName = refKls.getName().asString();
Short s = (Short) utf8ToIndex.get(klassName);
dos.writeShort(s.shortValue());
@@ -498,7 +535,7 @@ public class ConstantPool extends Oop implements ClassConstants {
case JVM_CONSTANT_String: {
dos.writeByte(cpConstType);
- String str = OopUtilities.stringOopToString(getObjAt(ci));
+ String str = OopUtilities.stringOopToString(getObjAtRaw(ci));
Short s = (Short) utf8ToIndex.get(str);
dos.writeShort(s.shortValue());
if (DEBUG) debugMessage("CP[" + ci + "] = string " + s);
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java b/agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java
index 04d640867..35a9d1940 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java
@@ -576,7 +576,7 @@ public class GenerateOopMap {
ConstantPool cp = method().getConstants();
int nameAndTypeIdx = cp.name_and_type_ref_index_at(idx);
int signatureIdx = cp.signature_ref_index_at(nameAndTypeIdx);
- symbolOop signature = cp.symbol_at(signatureIdx);
+ Symbol* signature = cp.symbol_at(signatureIdx);
tty.print("%s", signature.as_C_string());
*/
}
@@ -616,7 +616,7 @@ public class GenerateOopMap {
constantPoolOop cp = method().constants();
int nameAndTypeIdx = cp.name_and_type_ref_index_at(idx);
int signatureIdx = cp.signature_ref_index_at(nameAndTypeIdx);
- symbolOop signature = cp.symbol_at(signatureIdx);
+ Symbol* signature = cp.symbol_at(signatureIdx);
tty.print("%s", signature.as_C_string());
*/
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java b/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
index 6572d7ac0..0b33b94e7 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
@@ -82,8 +82,8 @@ public class InstanceKlass extends Klass {
classLoader = new OopField(type.getOopField("_class_loader"), Oop.getHeaderSize());
protectionDomain = new OopField(type.getOopField("_protection_domain"), Oop.getHeaderSize());
signers = new OopField(type.getOopField("_signers"), Oop.getHeaderSize());
- sourceFileName = new OopField(type.getOopField("_source_file_name"), Oop.getHeaderSize());
- sourceDebugExtension = new OopField(type.getOopField("_source_debug_extension"), Oop.getHeaderSize());
+ sourceFileName = type.getAddressField("_source_file_name");
+ sourceDebugExtension = type.getAddressField("_source_debug_extension");
innerClasses = new OopField(type.getOopField("_inner_classes"), Oop.getHeaderSize());
nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), Oop.getHeaderSize());
staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), Oop.getHeaderSize());
@@ -94,7 +94,7 @@ public class InstanceKlass extends Klass {
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), Oop.getHeaderSize());
itableLen = new CIntField(type.getCIntegerField("_itable_len"), Oop.getHeaderSize());
breakpoints = type.getAddressField("_breakpoints");
- genericSignature = new OopField(type.getOopField("_generic_signature"), Oop.getHeaderSize());
+ genericSignature = type.getAddressField("_generic_signature");
majorVersion = new CIntField(type.getCIntegerField("_major_version"), Oop.getHeaderSize());
minorVersion = new CIntField(type.getCIntegerField("_minor_version"), Oop.getHeaderSize());
headerSize = alignObjectOffset(Oop.getHeaderSize() + type.getSize());
@@ -135,8 +135,8 @@ public class InstanceKlass extends Klass {
private static OopField classLoader;
private static OopField protectionDomain;
private static OopField signers;
- private static OopField sourceFileName;
- private static OopField sourceDebugExtension;
+ private static AddressField sourceFileName;
+ private static AddressField sourceDebugExtension;
private static OopField innerClasses;
private static CIntField nonstaticFieldSize;
private static CIntField staticFieldSize;
@@ -147,7 +147,7 @@ public class InstanceKlass extends Klass {
private static CIntField vtableLen;
private static CIntField itableLen;
private static AddressField breakpoints;
- private static OopField genericSignature;
+ private static AddressField genericSignature;
private static CIntField majorVersion;
private static CIntField minorVersion;
@@ -257,8 +257,8 @@ public class InstanceKlass extends Klass {
public Oop getClassLoader() { return classLoader.getValue(this); }
public Oop getProtectionDomain() { return protectionDomain.getValue(this); }
public ObjArray getSigners() { return (ObjArray) signers.getValue(this); }
- public Symbol getSourceFileName() { return (Symbol) sourceFileName.getValue(this); }
- public Symbol getSourceDebugExtension(){ return (Symbol) sourceDebugExtension.getValue(this); }
+ public Symbol getSourceFileName() { return getSymbol(sourceFileName); }
+ public Symbol getSourceDebugExtension(){ return getSymbol(sourceDebugExtension); }
public TypeArray getInnerClasses() { return (TypeArray) innerClasses.getValue(this); }
public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); }
public long getStaticFieldSize() { return staticFieldSize.getValue(this); }
@@ -267,7 +267,7 @@ public class InstanceKlass extends Klass {
public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; }
public long getVtableLen() { return vtableLen.getValue(this); }
public long getItableLen() { return itableLen.getValue(this); }
- public Symbol getGenericSignature() { return (Symbol) genericSignature.getValue(this); }
+ public Symbol getGenericSignature() { return getSymbol(genericSignature); }
public long majorVersion() { return majorVersion.getValue(this); }
public long minorVersion() { return minorVersion.getValue(this); }
@@ -308,12 +308,12 @@ public class InstanceKlass extends Klass {
if (ioff != 0) {
// only look at classes that are already loaded
// since we are looking for the flags for our self.
- Oop classInfo = getConstants().getObjAt(ioff);
+ ConstantPool.CPSlot classInfo = getConstants().getSlotAt(ioff);
Symbol name = null;
- if (classInfo instanceof Klass) {
- name = ((Klass) classInfo).getName();
- } else if (classInfo instanceof Symbol) {
- name = (Symbol) classInfo;
+ if (classInfo.isOop()) {
+ name = ((Klass) classInfo.getOop()).getName();
+ } else if (classInfo.isMetaData()) {
+ name = classInfo.getSymbol();
} else {
throw new RuntimeException("should not reach here");
}
@@ -358,12 +358,12 @@ public class InstanceKlass extends Klass {
// 'ioff' can be zero.
// refer to JVM spec. section 4.7.5.
if (ioff != 0) {
- Oop iclassInfo = getConstants().getObjAt(ioff);
+ ConstantPool.CPSlot iclassInfo = getConstants().getSlotAt(ioff);
Symbol innerName = null;
- if (iclassInfo instanceof Klass) {
- innerName = ((Klass) iclassInfo).getName();
- } else if (iclassInfo instanceof Symbol) {
- innerName = (Symbol) iclassInfo;
+ if (iclassInfo.isOop()) {
+ innerName = ((Klass) iclassInfo.getOop()).getName();
+ } else if (iclassInfo.isMetaData()) {
+ innerName = iclassInfo.getSymbol();
} else {
throw new RuntimeException("should not reach here");
}
@@ -387,12 +387,12 @@ public class InstanceKlass extends Klass {
}
}
} else {
- Oop oclassInfo = getConstants().getObjAt(ooff);
+ ConstantPool.CPSlot oclassInfo = getConstants().getSlotAt(ooff);
Symbol outerName = null;
- if (oclassInfo instanceof Klass) {
- outerName = ((Klass) oclassInfo).getName();
- } else if (oclassInfo instanceof Symbol) {
- outerName = (Symbol) oclassInfo;
+ if (oclassInfo.isOop()) {
+ outerName = ((Klass) oclassInfo.getOop()).getName();
+ } else if (oclassInfo.isMetaData()) {
+ outerName = oclassInfo.getSymbol();
} else {
throw new RuntimeException("should not reach here");
}
@@ -450,7 +450,6 @@ public class InstanceKlass extends Klass {
visitor.doOop(classLoader, true);
visitor.doOop(protectionDomain, true);
visitor.doOop(signers, true);
- visitor.doOop(sourceFileName, true);
visitor.doOop(innerClasses, true);
visitor.doCInt(nonstaticFieldSize, true);
visitor.doCInt(staticFieldSize, true);
@@ -467,7 +466,7 @@ public class InstanceKlass extends Klass {
for (int index = 0; index < length; index += NEXT_OFFSET) {
short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
- FieldType type = new FieldType((Symbol) getConstants().getObjAt(signatureIndex));
+ FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
AccessFlags access = new AccessFlags(accessFlags);
if (access.isStatic()) {
visitField(visitor, type, index);
@@ -490,7 +489,7 @@ public class InstanceKlass extends Klass {
short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
- FieldType type = new FieldType((Symbol) getConstants().getObjAt(signatureIndex));
+ FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
AccessFlags access = new AccessFlags(accessFlags);
if (!access.isStatic()) {
visitField(visitor, type, index);
@@ -787,7 +786,7 @@ public class InstanceKlass extends Klass {
private Field newField(int index) {
TypeArray fields = getFields();
short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
- FieldType type = new FieldType((Symbol) getConstants().getObjAt(signatureIndex));
+ FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
if (type.isOop()) {
if (VM.getVM().isCompressedOopsEnabled()) {
return new NarrowOopField(this, index);
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java b/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java
index 9444b6cec..ccb5e5b46 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java
@@ -53,7 +53,7 @@ public class Klass extends Oop implements ClassConstants {
javaMirror = new OopField(type.getOopField("_java_mirror"), Oop.getHeaderSize());
superField = new OopField(type.getOopField("_super"), Oop.getHeaderSize());
layoutHelper = new IntField(type.getJIntField("_layout_helper"), Oop.getHeaderSize());
- name = new OopField(type.getOopField("_name"), Oop.getHeaderSize());
+ name = type.getAddressField("_name");
accessFlags = new CIntField(type.getCIntegerField("_access_flags"), Oop.getHeaderSize());
subklass = new OopField(type.getOopField("_subklass"), Oop.getHeaderSize());
nextSibling = new OopField(type.getOopField("_next_sibling"), Oop.getHeaderSize());
@@ -83,18 +83,26 @@ public class Klass extends Oop implements ClassConstants {
private static OopField javaMirror;
private static OopField superField;
private static IntField layoutHelper;
- private static OopField name;
+ private static AddressField name;
private static CIntField accessFlags;
private static OopField subklass;
private static OopField nextSibling;
private static CIntField allocCount;
+ private Address getValue(AddressField field) {
+ return getHandle().getAddressAt(field.getOffset() + Oop.getHeaderSize());
+ }
+
+ protected Symbol getSymbol(AddressField field) {
+ return Symbol.create(getHandle().getAddressAt(field.getOffset() + Oop.getHeaderSize()));
+ }
+
// Accessors for declared fields
public Instance getJavaMirror() { return (Instance) javaMirror.getValue(this); }
public Klass getSuper() { return (Klass) superField.getValue(this); }
public Klass getJavaSuper() { return null; }
public int getLayoutHelper() { return (int) layoutHelper.getValue(this); }
- public Symbol getName() { return (Symbol) name.getValue(this); }
+ public Symbol getName() { return getSymbol(name); }
public long getAccessFlags() { return accessFlags.getValue(this); }
// Convenience routine
public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags()); }
@@ -162,7 +170,7 @@ public class Klass extends Oop implements ClassConstants {
visitor.doOop(javaMirror, true);
visitor.doOop(superField, true);
visitor.doInt(layoutHelper, true);
- visitor.doOop(name, true);
+ // visitor.doOop(name, true);
visitor.doCInt(accessFlags, true);
visitor.doOop(subklass, true);
visitor.doOop(nextSibling, true);
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java b/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java
index 2d6fc5b6e..ed551bc74 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java
@@ -196,11 +196,11 @@ public class Method extends Oop {
public Address getFromCompiledCodeEntryPoint() { return fromCompiledCodeEntryPointField.getValue(this); }
*/
// Accessors
- public Symbol getName() { return (Symbol) getConstants().getObjAt(getNameIndex()); }
- public Symbol getSignature() { return (Symbol) getConstants().getObjAt(getSignatureIndex()); }
+ public Symbol getName() { return getConstants().getSymbolAt(getNameIndex()); }
+ public Symbol getSignature() { return getConstants().getSymbolAt(getSignatureIndex()); }
public Symbol getGenericSignature() {
long index = getGenericSignatureIndex();
- return (index != 0L) ? (Symbol) getConstants().getObjAt(index) : null;
+ return (index != 0L) ? getConstants().getSymbolAt(index) : null;
}
// Method holder (the Klass holding this method)
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java b/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
index 564463d9e..08aa0143c 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java
@@ -47,7 +47,6 @@ public class ObjectHeap {
DEBUG = System.getProperty("sun.jvm.hotspot.oops.ObjectHeap.DEBUG") != null;
}
- private OopHandle symbolKlassHandle;
private OopHandle methodKlassHandle;
private OopHandle constMethodKlassHandle;
private OopHandle methodDataKlassHandle;
@@ -68,7 +67,6 @@ public class ObjectHeap {
private OopHandle arrayKlassKlassHandle;
private OopHandle compiledICHolderKlassHandle;
- private SymbolKlass symbolKlassObj;
private MethodKlass methodKlassObj;
private ConstMethodKlass constMethodKlassObj;
private MethodDataKlass methodDataKlassObj;
@@ -93,9 +91,6 @@ public class ObjectHeap {
// Lookup the roots in the object hierarchy.
Type universeType = db.lookupType("Universe");
- symbolKlassHandle = universeType.getOopField("_symbolKlassObj").getValue();
- symbolKlassObj = new SymbolKlass(symbolKlassHandle, this);
-
methodKlassHandle = universeType.getOopField("_methodKlassObj").getValue();
methodKlassObj = new MethodKlass(methodKlassHandle, this);
@@ -199,7 +194,6 @@ public class ObjectHeap {
public long getDoubleSize() { return doubleSize; }
// Accessors for well-known system classes (from Universe)
- public SymbolKlass getSymbolKlassObj() { return symbolKlassObj; }
public MethodKlass getMethodKlassObj() { return methodKlassObj; }
public ConstMethodKlass getConstMethodKlassObj() { return constMethodKlassObj; }
public MethodDataKlass getMethodDataKlassObj() { return methodDataKlassObj; }
@@ -337,7 +331,6 @@ public class ObjectHeap {
// First check if handle is one of the root objects
if (handle.equals(methodKlassHandle)) return getMethodKlassObj();
if (handle.equals(constMethodKlassHandle)) return getConstMethodKlassObj();
- if (handle.equals(symbolKlassHandle)) return getSymbolKlassObj();
if (handle.equals(constantPoolKlassHandle)) return getConstantPoolKlassObj();
if (handle.equals(constantPoolCacheKlassHandle)) return getConstantPoolCacheKlassObj();
if (handle.equals(instanceKlassKlassHandle)) return getInstanceKlassKlassObj();
@@ -363,7 +356,6 @@ public class ObjectHeap {
if (klass != null) {
if (klass.equals(methodKlassHandle)) return new Method(handle, this);
if (klass.equals(constMethodKlassHandle)) return new ConstMethod(handle, this);
- if (klass.equals(symbolKlassHandle)) return new Symbol(handle, this);
if (klass.equals(constantPoolKlassHandle)) return new ConstantPool(handle, this);
if (klass.equals(constantPoolCacheKlassHandle)) return new ConstantPoolCache(handle, this);
if (!VM.getVM().isCore()) {
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/Symbol.java b/agent/src/share/classes/sun/jvm/hotspot/oops/Symbol.java
index 708c54011..964e3a8de 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/Symbol.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/Symbol.java
@@ -34,7 +34,7 @@ import sun.jvm.hotspot.utilities.*;
// A Symbol is a canonicalized string.
// All Symbols reside in global symbolTable.
-public class Symbol extends Oop {
+public class Symbol extends VMObject {
static {
VM.registerVMInitializedObserver(new Observer() {
public void update(Observable o, Object data) {
@@ -44,9 +44,10 @@ public class Symbol extends Oop {
}
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
- Type type = db.lookupType("symbolOopDesc");
- length = new CIntField(type.getCIntegerField("_length"), 0);
+ Type type = db.lookupType("Symbol");
+ length = type.getCIntegerField("_length");
baseOffset = type.getField("_body").getOffset();
+ idHash = type.getCIntegerField("_identity_hash");
}
// Format:
@@ -55,8 +56,15 @@ public class Symbol extends Oop {
// [length] byte size of uft8 string
// ..body..
- Symbol(OopHandle handle, ObjectHeap heap) {
- super(handle, heap);
+ public static Symbol create(Address addr) {
+ if (addr == null) {
+ return null;
+ }
+ return new Symbol(addr);
+ }
+
+ Symbol(Address addr) {
+ super(addr);
}
public boolean isSymbol() { return true; }
@@ -64,15 +72,19 @@ public class Symbol extends Oop {
private static long baseOffset; // tells where the array part starts
// Fields
- private static CIntField length;
+ private static CIntegerField length;
// Accessors for declared fields
- public long getLength() { return length.getValue(this); }
+ public long getLength() { return length.getValue(this.addr); }
public byte getByteAt(long index) {
- return getHandle().getJByteAt(baseOffset + index);
+ return addr.getJByteAt(baseOffset + index);
}
+ private static CIntegerField idHash;
+
+ public int identityHash() { return (int)idHash.getValue(this.addr); }
+
public boolean equals(byte[] modUTF8Chars) {
int l = (int) getLength();
if (l != modUTF8Chars.length) return false;
@@ -98,7 +110,9 @@ public class Symbol extends Oop {
// Decode the byte array and return the string.
try {
return readModifiedUTF8(asByteArray());
- } catch(IOException e) {
+ } catch(Exception e) {
+ System.err.println(addr);
+ e.printStackTrace();
return null;
}
}
@@ -111,28 +125,13 @@ public class Symbol extends Oop {
tty.print("#" + asString());
}
- public long getObjectSize() {
- return alignObjectSize(baseOffset + getLength());
- }
-
- void iterateFields(OopVisitor visitor, boolean doVMFields) {
- super.iterateFields(visitor, doVMFields);
- if (doVMFields) {
- visitor.doCInt(length, true);
- int length = (int) getLength();
- for (int index = 0; index < length; index++) {
- visitor.doByte(new ByteField(new IndexableFieldIdentifier(index), baseOffset + index, false), true);
- }
- }
- }
-
/** Note: this comparison is used for vtable sorting only; it
doesn't matter what order it defines, as long as it is a total,
- time-invariant order Since symbolOops are in permSpace, their
+ time-invariant order Since Symbol* are in C_HEAP, their
relative order in memory never changes, so use address
comparison for speed. */
public int fastCompare(Symbol other) {
- return (int) getHandle().minus(other.getHandle());
+ return (int) addr.minus(other.addr);
}
private static String readModifiedUTF8(byte[] buf) throws IOException {
diff --git a/agent/src/share/classes/sun/jvm/hotspot/oops/SymbolKlass.java b/agent/src/share/classes/sun/jvm/hotspot/oops/SymbolKlass.java
deleted file mode 100644
index 6fe000d42..000000000
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/SymbolKlass.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2000, 2001, 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
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-package sun.jvm.hotspot.oops;
-
-import java.io.*;
-import java.util.*;
-import sun.jvm.hotspot.debugger.*;
-import sun.jvm.hotspot.runtime.*;
-import sun.jvm.hotspot.types.*;
-
-// A SymbolKlass is the klass for all Symbols
-
-public class SymbolKlass extends Klass {
- static {
- VM.registerVMInitializedObserver(new Observer() {
- public void update(Observable o, Object data) {
- initialize(VM.getVM().getTypeDataBase());
- }
- });
- }
-
- private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
- Type type = db.lookupType("symbolKlass");
- headerSize = type.getSize() + Oop.getHeaderSize();
- }
-
- SymbolKlass(OopHandle handle, ObjectHeap heap) {
- super(handle, heap);
- }
-
- private static long headerSize;
-
- public long getObjectSize() { return alignObjectSize(headerSize); }
-
- public void printValueOn(PrintStream tty) {
- tty.print("SymbolKlass");
- }
-}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java b/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java
index 494f1765f..3896c67d7 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java
@@ -229,7 +229,7 @@ public class ClassWriter implements /* imports */ ClassConstants
case JVM_CONSTANT_Class: {
dos.writeByte(cpConstType);
// Klass already resolved. ConstantPool constains klassOop.
- Klass refKls = (Klass) cpool.getObjAt(ci);
+ Klass refKls = (Klass) cpool.getObjAtRaw(ci);
String klassName = refKls.getName().asString();
Short s = (Short) utf8ToIndex.get(klassName);
@@ -255,7 +255,7 @@ public class ClassWriter implements /* imports */ ClassConstants
case JVM_CONSTANT_String: {
dos.writeByte(cpConstType);
- String str = OopUtilities.stringOopToString(cpool.getObjAt(ci));
+ String str = OopUtilities.stringOopToString(cpool.getObjAtRaw(ci));
Short s = (Short) utf8ToIndex.get(str);
dos.writeShort(s.shortValue());
if (DEBUG) debugMessage("CP[" + ci + "] = string " + s);
diff --git a/agent/src/share/classes/sun/jvm/hotspot/types/Field.java b/agent/src/share/classes/sun/jvm/hotspot/types/Field.java
index 0f22705b6..2ef0e48c9 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/types/Field.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/types/Field.java
@@ -56,7 +56,7 @@ import sun.jvm.hotspot.debugger.*;
</PRE>
FIXME: among other things, this interface is not sufficient to
- describe fields which are themselves arrays (like symbolOop's
+ describe fields which are themselves arrays (like Symbol's
jbyte _body[1]). */
public interface Field {
/** Get the name of this field */
diff --git a/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java b/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java
index 979d80b30..147e3bd55 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java
@@ -530,7 +530,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
case JVM_CONSTANT_Class:
buf.cell("JVM_CONSTANT_Class");
- Klass klass = (Klass) cpool.getObjAt(index);
+ Klass klass = (Klass) cpool.getObjAtRaw(index);
if (klass instanceof InstanceKlass) {
buf.cell(genKlassLink((InstanceKlass) klass));
} else {
@@ -555,7 +555,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
case JVM_CONSTANT_String:
buf.cell("JVM_CONSTANT_String");
buf.cell("\"" +
- escapeHTMLSpecialChars(OopUtilities.stringOopToString(cpool.getObjAt(index))) + "\"");
+ escapeHTMLSpecialChars(OopUtilities.stringOopToString(cpool.getObjAtRaw(index))) + "\"");
break;
case JVM_CONSTANT_Fieldref:
@@ -672,11 +672,11 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
buf.beginTag("ul");
for (int exp = 0; exp < exceptions.length; exp++) {
short cpIndex = (short) exceptions[exp].getClassCPIndex();
- Oop obj = cpool.getObjAt(cpIndex);
- if (obj instanceof Symbol) {
- buf.li(((Symbol)obj).asString().replace('/', '.'));
+ ConstantPool.CPSlot obj = cpool.getSlotAt(cpIndex);
+ if (obj.isMetaData()) {
+ buf.li((obj.getSymbol()).asString().replace('/', '.'));
} else {
- buf.li(genKlassLink((InstanceKlass)obj));
+ buf.li(genKlassLink((InstanceKlass)obj.getOop()));
}
}
buf.endTag("ul");
@@ -756,7 +756,7 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
} else if (instr instanceof BytecodeLoadConstant) {
BytecodeLoadConstant ldc = (BytecodeLoadConstant) instr;
if (ldc.isKlassConstant()) {
- Oop oop = ldc.getKlass();
+ Object oop = ldc.getKlass();
if (oop instanceof Klass) {
buf.append("<a href='");
buf.append(genKlassHref((InstanceKlass) oop));
@@ -803,13 +803,13 @@ public class HTMLGenerator implements /* imports */ ClassConstants {
buf.cell(Integer.toString(exceptionTable.getIntAt(e + 1)));
buf.cell(Integer.toString(exceptionTable.getIntAt(e + 2)));
short cpIndex = (short) exceptionTable.getIntAt(e + 3);
- Oop obj = cpIndex == 0? null : cpool.getObjAt(cpIndex);
+ ConstantPool.CPSlot obj = cpIndex == 0? null : cpool.getSlotAt(cpIndex);
if (obj == null) {
buf.cell("Any");
- } else if (obj instanceof Symbol) {
- buf.cell(((Symbol)obj).asString().replace('/', '.'));
+ } else if (obj.isMetaData()) {
+ buf.cell(obj.getSymbol().asString().replace('/', '.'));
} else {
- buf.cell(genKlassLink((InstanceKlass)obj));
+ buf.cell(genKlassLink((InstanceKlass)obj.getOop()));
}
buf.endTag("tr");
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java b/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java
index 3ac8fc4a9..65437b708 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java
@@ -40,7 +40,7 @@ public class Hashtable extends BasicHashtable {
private static synchronized void initialize(TypeDataBase db) {
// just to confirm that type exists
- Type type = db.lookupType("Hashtable");
+ Type type = db.lookupType("Hashtable<intptr_t>");
}
// derived class may return Class<? extends HashtableEntry>
diff --git a/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java b/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java
index d623be764..1ae9dfaf4 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java
@@ -41,16 +41,16 @@ public class HashtableEntry extends BasicHashtableEntry {
}
private static synchronized void initialize(TypeDataBase db) {
- Type type = db.lookupType("HashtableEntry");
- literalField = type.getOopField("_literal");
+ Type type = db.lookupType("HashtableEntry<intptr_t>");
+ literalField = type.getAddressField("_literal");
}
// Fields
- private static OopField literalField;
+ private static AddressField literalField;
// Accessors
- public Oop literal() {
- return VM.getVM().getObjectHeap().newOop(literalField.getValue(addr));
+ public Address literalValue() {
+ return literalField.getValue(addr);
}
public HashtableEntry(Address addr) {
diff --git a/agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java b/agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
index 8b5e4d777..8da903140 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
@@ -740,7 +740,7 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
for (Iterator itr = fields.iterator(); itr.hasNext();) {
Field field = (Field) itr.next();
Symbol name = symTbl.probe(field.getID().getName());
- writeObjectID(name);
+ writeSymbolID(name);
char typeCode = (char) field.getSignature().getByteAt(0);
int kind = signatureToHprofKind(typeCode);
out.writeByte((byte)kind);
@@ -852,7 +852,7 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
private void writeSymbol(Symbol sym) throws IOException {
byte[] buf = sym.asString().getBytes("UTF-8");
writeHeader(HPROF_UTF8, buf.length + OBJ_ID_SIZE);
- writeObjectID(sym);
+ writeSymbolID(sym);
out.write(buf);
}
@@ -869,7 +869,7 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
out.writeInt(serialNum);
writeObjectID(clazz);
out.writeInt(DUMMY_STACK_TRACE_ID);
- writeObjectID(k.getName());
+ writeSymbolID(k.getName());
serialNum++;
} catch (IOException exp) {
throw new RuntimeException(exp);
@@ -901,6 +901,10 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
writeObjectID(address);
}
+ private void writeSymbolID(Symbol sym) throws IOException {
+ writeObjectID(getAddressValue(sym.getAddress()));
+ }
+
private void writeObjectID(long address) throws IOException {
if (OBJ_ID_SIZE == 4) {
out.writeInt((int) address);