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