public void processReference(int objref) {
if (objref == MJIEnv.NULL) {
buf.add(MJIEnv.NULL);
-
} else {
ElementInfo ei = heap.get(objref);
int sid = ei.getSid();
buf.add(sid);
}
}
-
+
+
+ boolean istop;
@Override
protected void serializeStackFrames() {
ThreadList tl = ks.getThreadList();
-
+ istop = true;
for (Iterator<ThreadInfo> it = tl.canonicalLiveIterator(); it.hasNext(); ) {
serializeStackFrames(it.next());
+ istop = false;
}
}
@Override
protected void serializeFrame(StackFrame frame){
- buf.add(frame.getMethodInfo().getGlobalId());
-
+ FramePolicy fp = getFramePolicy(frame.getMethodInfo());
Instruction pc = frame.getPC();
- buf.add( pc != null ? pc.getInstructionIndex() : -1);
-
int len = frame.getTopPos()+1;
- buf.add(len);
-
- // unfortunately we can't do this as a block operation because that
- // would use concrete reference values as hash data, i.e. break heap symmetry
- int[] slots = frame.getSlots();
- for (int i = 0; i < len; i++) {
- if (frame.isReferenceSlot(i)) {
- processReference(slots[i]);
- } else {
- buf.add(slots[i]);
+
+ if (fp == null || fp.includePC || istop) {
+ buf.add(frame.getMethodInfo().getGlobalId());
+ buf.add( pc != null ? pc.getInstructionIndex() : -1);
+ }
+
+ if (fp == null || fp.includeLocals || istop) {
+ buf.add(len);
+
+ // unfortunately we can't do this as a block operation because that
+ // would use concrete reference values as hash data, i.e. break heap symmetry
+ int[] slots = frame.getSlots();
+ for (int i = 0; i < len; i++) {
+ if (frame.isReferenceSlot(i)) {
+ processReference(slots[i]);
+ } else {
+ buf.add(slots[i]);
+ }
}
}
}