diff options
Diffstat (limited to 'runtime/stack.cc')
-rw-r--r-- | runtime/stack.cc | 20 |
1 files changed, 13 insertions, 7 deletions
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 @@ mirror::Object* StackVisitor::GetThisObject() const { 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)); |