JNI down call fixes.

Ensure SIRT isn't accessed via quick callee save frame.
Some tidying of code.

Change-Id: I8fec3e89aa6d2e86789c60a07550db2e92478ca7
diff --git a/runtime/stack.cc b/runtime/stack.cc
index a6a0b29..abaea6f 100644
--- a/runtime/stack.cc
+++ b/runtime/stack.cc
@@ -108,20 +108,26 @@
     return NULL;
   } else if (m->IsNative()) {
     if (cur_quick_frame_ != NULL) {
-      StackIndirectReferenceTable* sirt =
-          reinterpret_cast<StackIndirectReferenceTable*>(
-              reinterpret_cast<char*>(cur_quick_frame_) +
-              m->GetSirtOffsetInBytes());
-      return sirt->GetReference(0);
+      if (m->GetEntryPointFromQuickCompiledCode() == GetQuickGenericJniTrampoline()) {
+        UNIMPLEMENTED(ERROR) << "Failed to determine this object of native method: "
+            << PrettyMethod(m);
+        return nullptr;
+      } else {
+        StackIndirectReferenceTable* sirt =
+            reinterpret_cast<StackIndirectReferenceTable*>(
+                reinterpret_cast<char*>(cur_quick_frame_) +
+                m->GetSirtOffsetInBytes());
+        return sirt->GetReference(0);
+      }
     } else {
       return cur_shadow_frame_->GetVRegReference(0);
     }
   } else {
     const DexFile::CodeItem* code_item = MethodHelper(m).GetCodeItem();
     if (code_item == NULL) {
-      UNIMPLEMENTED(ERROR) << "Failed to determine this object of abstract or proxy method"
+      UNIMPLEMENTED(ERROR) << "Failed to determine this object of abstract or proxy method: "
           << PrettyMethod(m);
-      return NULL;
+      return nullptr;
     } else {
       uint16_t reg = code_item->registers_size_ - code_item->ins_size_;
       return reinterpret_cast<mirror::Object*>(GetVReg(m, reg, kReferenceVReg));