--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/code/ScopeDesc.java Fri Jun 05 10:25:39 2009 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/code/ScopeDesc.java Tue Jun 09 16:19:10 2009 -0700
@@ -27,8 +27,10 @@
import java.io.*;
import java.util.*;
+import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.utilities.*;
/** ScopeDescs contain the information that makes source-level
debugging of nmethods possible; each scopeDesc describes a method
@@ -45,10 +47,31 @@
private int localsDecodeOffset;
private int expressionsDecodeOffset;
private int monitorsDecodeOffset;
+ /** Scalar replaced bjects pool */
+ private List objects; // ArrayList<ScopeValue>
+
public ScopeDesc(NMethod code, int decodeOffset) {
this.code = code;
this.decodeOffset = decodeOffset;
+ this.objects = decodeObjectValues(DebugInformationRecorder.SERIALIZED_NULL);
+
+ // Decode header
+ DebugInfoReadStream stream = streamAt(decodeOffset);
+
+ senderDecodeOffset = stream.readInt();
+ method = (Method) VM.getVM().getObjectHeap().newOop(stream.readOopHandle());
+ bci = stream.readBCI();
+ // Decode offsets for body and sender
+ localsDecodeOffset = stream.readInt();
+ expressionsDecodeOffset = stream.readInt();
+ monitorsDecodeOffset = stream.readInt();
+ }
+
+ public ScopeDesc(NMethod code, int decodeOffset, int objectDecodeOffset) {
+ this.code = code;
+ this.decodeOffset = decodeOffset;
+ this.objects = decodeObjectValues(objectDecodeOffset);
// Decode header
DebugInfoReadStream stream = streamAt(decodeOffset);
@@ -81,6 +104,11 @@
return decodeMonitorValues(monitorsDecodeOffset);
}
+ /** Returns a List<MonitorValue> */
+ public List getObjects() {
+ return objects;
+ }
+
/** Stack walking. Returns null if this is the outermost scope. */
public ScopeDesc sender() {
if (isTop()) {
@@ -131,7 +159,7 @@
//
private DebugInfoReadStream streamAt(int decodeOffset) {
- return new DebugInfoReadStream(code, decodeOffset);
+ return new DebugInfoReadStream(code, decodeOffset, objects);
}
/** Returns a List<ScopeValue> or null if no values were present */
@@ -161,4 +189,22 @@
}
return res;
}
+
+ /** Returns a List<ObjectValue> or null if no values were present */
+ private List decodeObjectValues(int decodeOffset) {
+ if (decodeOffset == DebugInformationRecorder.SERIALIZED_NULL) {
+ return null;
+ }
+ List res = new ArrayList();
+ DebugInfoReadStream stream = new DebugInfoReadStream(code, decodeOffset, res);
+ int length = stream.readInt();
+ for (int i = 0; i < length; i++) {
+ // Objects values are pushed to 'res' array during read so that
+ // object's fields could reference it (OBJECT_ID_CODE).
+ ScopeValue.readFrom(stream);
+ // res.add(ScopeValue.readFrom(stream));
+ }
+ Assert.that(res.size() == length, "inconsistent debug information");
+ return res;
+ }
}