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);