Implement JDWP StackFrame.ThisObject.
I found a way to test this too.
Change-Id: Ia9451c97d5b4269f63c6b8d75f145583db7dfff5
diff --git a/src/debugger.cc b/src/debugger.cc
index 98d501c..3a6c154 100644
--- a/src/debugger.cc
+++ b/src/debugger.cc
@@ -152,6 +152,7 @@
}
static JDWP::JdwpTag TagFromClass(Class* c) {
+ CHECK(c != NULL);
if (c->IsArrayClass()) {
return JDWP::JT_ARRAY;
}
@@ -574,11 +575,6 @@
return true;
}
-const char* Dbg::GetObjectTypeName(JDWP::ObjectId objectId) {
- UNIMPLEMENTED(FATAL);
- return NULL;
-}
-
uint8_t Dbg::GetObjectTag(JDWP::ObjectId objectId) {
Object* o = gRegistry->Get<Object*>(objectId);
return TagFromObject(o);
@@ -1290,8 +1286,18 @@
}
bool Dbg::GetThisObject(JDWP::ObjectId threadId, JDWP::FrameId frameId, JDWP::ObjectId* pThisId) {
- UNIMPLEMENTED(FATAL);
- return false;
+ Method** sp = reinterpret_cast<Method**>(frameId);
+ Frame f;
+ f.SetSP(sp);
+ uint16_t reg = DemangleSlot(0, f);
+ Method* m = f.GetMethod();
+
+ Object* o = NULL;
+ if (!m->IsNative() && !m->IsStatic()) {
+ o = reinterpret_cast<Object*>(f.GetVReg(m, reg));
+ }
+ *pThisId = gRegistry->Add(o);
+ return true;
}
void Dbg::GetLocalValue(JDWP::ObjectId threadId, JDWP::FrameId frameId, int slot, JDWP::JdwpTag tag, uint8_t* buf, size_t width) {
diff --git a/src/debugger.h b/src/debugger.h
index 826c787..2faca36 100644
--- a/src/debugger.h
+++ b/src/debugger.h
@@ -139,7 +139,6 @@
static uint8_t GetClassObjectType(JDWP::RefTypeId refTypeId);
static std::string GetSignature(JDWP::RefTypeId refTypeId);
static bool GetSourceFile(JDWP::RefTypeId refTypeId, std::string& source_file);
- static const char* GetObjectTypeName(JDWP::ObjectId objectId);
static uint8_t GetObjectTag(JDWP::ObjectId objectId);
static size_t GetTagWidth(JDWP::JdwpTag tag);
diff --git a/src/jdwp/jdwp_handler.cc b/src/jdwp/jdwp_handler.cc
index ad02f64..9b5c080 100644
--- a/src/jdwp/jdwp_handler.cc
+++ b/src/jdwp/jdwp_handler.cc
@@ -1476,7 +1476,7 @@
}
uint8_t objectTag = Dbg::GetObjectTag(objectId);
- LOG(VERBOSE) << StringPrintf(" Req for 'this' in thread=%llx frame=%llx --> %llx %s '%c'", threadId, frameId, objectId, Dbg::GetObjectTypeName(objectId), (char)objectTag);
+ LOG(VERBOSE) << StringPrintf(" Req for 'this' in thread=%llx frame=%llx --> %llx '%c'", threadId, frameId, objectId, (char)objectTag);
expandBufAdd1(pReply, objectTag);
expandBufAddObjectId(pReply, objectId);