summaryrefslogtreecommitdiffstats
path: root/runtime/stack.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/stack.cc')
-rw-r--r--runtime/stack.cc20
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));