equal
deleted
inserted
replaced
25 package sun.jvm.hotspot.code; |
25 package sun.jvm.hotspot.code; |
26 |
26 |
27 import java.io.*; |
27 import java.io.*; |
28 import java.util.*; |
28 import java.util.*; |
29 |
29 |
|
30 import sun.jvm.hotspot.debugger.*; |
30 import sun.jvm.hotspot.oops.*; |
31 import sun.jvm.hotspot.oops.*; |
31 import sun.jvm.hotspot.runtime.*; |
32 import sun.jvm.hotspot.runtime.*; |
|
33 import sun.jvm.hotspot.utilities.*; |
32 |
34 |
33 /** ScopeDescs contain the information that makes source-level |
35 /** ScopeDescs contain the information that makes source-level |
34 debugging of nmethods possible; each scopeDesc describes a method |
36 debugging of nmethods possible; each scopeDesc describes a method |
35 activation */ |
37 activation */ |
36 |
38 |
43 private int decodeOffset; |
45 private int decodeOffset; |
44 private int senderDecodeOffset; |
46 private int senderDecodeOffset; |
45 private int localsDecodeOffset; |
47 private int localsDecodeOffset; |
46 private int expressionsDecodeOffset; |
48 private int expressionsDecodeOffset; |
47 private int monitorsDecodeOffset; |
49 private int monitorsDecodeOffset; |
|
50 /** Scalar replaced bjects pool */ |
|
51 private List objects; // ArrayList<ScopeValue> |
|
52 |
48 |
53 |
49 public ScopeDesc(NMethod code, int decodeOffset) { |
54 public ScopeDesc(NMethod code, int decodeOffset) { |
50 this.code = code; |
55 this.code = code; |
51 this.decodeOffset = decodeOffset; |
56 this.decodeOffset = decodeOffset; |
|
57 this.objects = decodeObjectValues(DebugInformationRecorder.SERIALIZED_NULL); |
52 |
58 |
53 // Decode header |
59 // Decode header |
54 DebugInfoReadStream stream = streamAt(decodeOffset); |
60 DebugInfoReadStream stream = streamAt(decodeOffset); |
55 |
61 |
56 senderDecodeOffset = stream.readInt(); |
62 senderDecodeOffset = stream.readInt(); |
60 localsDecodeOffset = stream.readInt(); |
66 localsDecodeOffset = stream.readInt(); |
61 expressionsDecodeOffset = stream.readInt(); |
67 expressionsDecodeOffset = stream.readInt(); |
62 monitorsDecodeOffset = stream.readInt(); |
68 monitorsDecodeOffset = stream.readInt(); |
63 } |
69 } |
64 |
70 |
|
71 public ScopeDesc(NMethod code, int decodeOffset, int objectDecodeOffset) { |
|
72 this.code = code; |
|
73 this.decodeOffset = decodeOffset; |
|
74 this.objects = decodeObjectValues(objectDecodeOffset); |
|
75 |
|
76 // Decode header |
|
77 DebugInfoReadStream stream = streamAt(decodeOffset); |
|
78 |
|
79 senderDecodeOffset = stream.readInt(); |
|
80 method = (Method) VM.getVM().getObjectHeap().newOop(stream.readOopHandle()); |
|
81 bci = stream.readBCI(); |
|
82 // Decode offsets for body and sender |
|
83 localsDecodeOffset = stream.readInt(); |
|
84 expressionsDecodeOffset = stream.readInt(); |
|
85 monitorsDecodeOffset = stream.readInt(); |
|
86 } |
|
87 |
65 public NMethod getNMethod() { return code; } |
88 public NMethod getNMethod() { return code; } |
66 public Method getMethod() { return method; } |
89 public Method getMethod() { return method; } |
67 public int getBCI() { return bci; } |
90 public int getBCI() { return bci; } |
68 |
91 |
69 /** Returns a List<ScopeValue> */ |
92 /** Returns a List<ScopeValue> */ |
77 } |
100 } |
78 |
101 |
79 /** Returns a List<MonitorValue> */ |
102 /** Returns a List<MonitorValue> */ |
80 public List getMonitors() { |
103 public List getMonitors() { |
81 return decodeMonitorValues(monitorsDecodeOffset); |
104 return decodeMonitorValues(monitorsDecodeOffset); |
|
105 } |
|
106 |
|
107 /** Returns a List<MonitorValue> */ |
|
108 public List getObjects() { |
|
109 return objects; |
82 } |
110 } |
83 |
111 |
84 /** Stack walking. Returns null if this is the outermost scope. */ |
112 /** Stack walking. Returns null if this is the outermost scope. */ |
85 public ScopeDesc sender() { |
113 public ScopeDesc sender() { |
86 if (isTop()) { |
114 if (isTop()) { |
129 //-------------------------------------------------------------------------------- |
157 //-------------------------------------------------------------------------------- |
130 // Internals only below this point |
158 // Internals only below this point |
131 // |
159 // |
132 |
160 |
133 private DebugInfoReadStream streamAt(int decodeOffset) { |
161 private DebugInfoReadStream streamAt(int decodeOffset) { |
134 return new DebugInfoReadStream(code, decodeOffset); |
162 return new DebugInfoReadStream(code, decodeOffset, objects); |
135 } |
163 } |
136 |
164 |
137 /** Returns a List<ScopeValue> or null if no values were present */ |
165 /** Returns a List<ScopeValue> or null if no values were present */ |
138 private List decodeScopeValues(int decodeOffset) { |
166 private List decodeScopeValues(int decodeOffset) { |
139 if (decodeOffset == DebugInformationRecorder.SERIALIZED_NULL) { |
167 if (decodeOffset == DebugInformationRecorder.SERIALIZED_NULL) { |
159 for (int i = 0; i < length; i++) { |
187 for (int i = 0; i < length; i++) { |
160 res.add(new MonitorValue(stream)); |
188 res.add(new MonitorValue(stream)); |
161 } |
189 } |
162 return res; |
190 return res; |
163 } |
191 } |
|
192 |
|
193 /** Returns a List<ObjectValue> or null if no values were present */ |
|
194 private List decodeObjectValues(int decodeOffset) { |
|
195 if (decodeOffset == DebugInformationRecorder.SERIALIZED_NULL) { |
|
196 return null; |
|
197 } |
|
198 List res = new ArrayList(); |
|
199 DebugInfoReadStream stream = new DebugInfoReadStream(code, decodeOffset, res); |
|
200 int length = stream.readInt(); |
|
201 for (int i = 0; i < length; i++) { |
|
202 // Objects values are pushed to 'res' array during read so that |
|
203 // object's fields could reference it (OBJECT_ID_CODE). |
|
204 ScopeValue.readFrom(stream); |
|
205 // res.add(ScopeValue.readFrom(stream)); |
|
206 } |
|
207 Assert.that(res.size() == length, "inconsistent debug information"); |
|
208 return res; |
|
209 } |
164 } |
210 } |