22 * |
22 * |
23 */ |
23 */ |
24 |
24 |
25 package sun.jvm.hotspot.code; |
25 package sun.jvm.hotspot.code; |
26 |
26 |
|
27 import java.util.*; |
|
28 |
27 import sun.jvm.hotspot.debugger.*; |
29 import sun.jvm.hotspot.debugger.*; |
28 import sun.jvm.hotspot.runtime.VM; |
30 import sun.jvm.hotspot.runtime.VM; |
|
31 import sun.jvm.hotspot.utilities.*; |
29 |
32 |
30 public class DebugInfoReadStream extends CompressedReadStream { |
33 public class DebugInfoReadStream extends CompressedReadStream { |
31 private NMethod code; |
34 private NMethod code; |
32 private int InvocationEntryBCI; |
35 private int InvocationEntryBCI; |
|
36 private List objectPool; // ArrayList<ObjectValue> |
33 |
37 |
34 public DebugInfoReadStream(NMethod code, int offset) { |
38 public DebugInfoReadStream(NMethod code, int offset) { |
35 super(code.scopesDataBegin(), offset); |
39 super(code.scopesDataBegin(), offset); |
36 InvocationEntryBCI = VM.getVM().getInvocationEntryBCI(); |
40 InvocationEntryBCI = VM.getVM().getInvocationEntryBCI(); |
37 this.code = code; |
41 this.code = code; |
|
42 this.objectPool = null; |
|
43 } |
|
44 |
|
45 public DebugInfoReadStream(NMethod code, int offset, List objectPool) { |
|
46 super(code.scopesDataBegin(), offset); |
|
47 InvocationEntryBCI = VM.getVM().getInvocationEntryBCI(); |
|
48 this.code = code; |
|
49 this.objectPool = objectPool; |
38 } |
50 } |
39 |
51 |
40 public OopHandle readOopHandle() { |
52 public OopHandle readOopHandle() { |
41 return code.getOopAt(readInt()); |
53 return code.getOopAt(readInt()); |
42 } |
54 } |
43 |
55 |
|
56 ScopeValue readObjectValue() { |
|
57 int id = readInt(); |
|
58 if (Assert.ASSERTS_ENABLED) { |
|
59 Assert.that(objectPool != null, "object pool does not exist"); |
|
60 for (Iterator itr = objectPool.iterator(); itr.hasNext();) { |
|
61 ObjectValue ov = (ObjectValue) itr.next(); |
|
62 Assert.that(ov.id() != id, "should not be read twice"); |
|
63 } |
|
64 } |
|
65 ObjectValue result = new ObjectValue(id); |
|
66 // Cache the object since an object field could reference it. |
|
67 objectPool.add(result); |
|
68 result.readObject(this); |
|
69 return result; |
|
70 } |
|
71 |
|
72 ScopeValue getCachedObject() { |
|
73 int id = readInt(); |
|
74 Assert.that(objectPool != null, "object pool does not exist"); |
|
75 for (Iterator itr = objectPool.iterator(); itr.hasNext();) { |
|
76 ObjectValue ov = (ObjectValue) itr.next(); |
|
77 if (ov.id() == id) { |
|
78 return ov; |
|
79 } |
|
80 } |
|
81 Assert.that(false, "should not reach here"); |
|
82 return null; |
|
83 } |
|
84 |
44 public int readBCI() { |
85 public int readBCI() { |
45 return readInt() + InvocationEntryBCI; |
86 return readInt() + InvocationEntryBCI; |
46 } |
87 } |
47 } |
88 } |