From e0dcd46314d07eeb332edea292f5110178e4e3d2 Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Sat, 8 Mar 2014 15:21:04 -0800 Subject: JNI down call fixes. Ensure SIRT isn't accessed via quick callee save frame. Some tidying of code. Change-Id: I8fec3e89aa6d2e86789c60a07550db2e92478ca7 --- runtime/stack.cc | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'runtime/stack.cc') 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( - reinterpret_cast(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( + reinterpret_cast(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(GetVReg(m, reg, kReferenceVReg)); -- cgit v1.1