--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/code/RicochetBlob.java Sat Sep 03 14:03:54 2011 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/code/RicochetBlob.java Mon Sep 05 17:09:05 2011 -0700
@@ -41,11 +41,15 @@
}
private static void initialize(TypeDataBase db) {
- // Type type = db.lookupType("RicochetBlob");
+ Type type = db.lookupType("RicochetBlob");
- // FIXME: add any needed fields
+ bounceOffsetField = type.getCIntegerField("_bounce_offset");
+ exceptionOffsetField = type.getCIntegerField("_exception_offset");
}
+ private static CIntegerField bounceOffsetField;
+ private static CIntegerField exceptionOffsetField;
+
public RicochetBlob(Address addr) {
super(addr);
}
@@ -53,4 +57,14 @@
public boolean isRicochetBlob() {
return true;
}
+
+ public Address bounceAddr() {
+ return codeBegin().addOffsetTo(bounceOffsetField.getValue(addr));
+ }
+
+ public boolean returnsToBounceAddr(Address pc) {
+ Address bouncePc = bounceAddr();
+ return (pc.equals(bouncePc) || pc.addOffsetTo(Frame.pcReturnOffset()).equals(bouncePc));
+ }
+
}