summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/verifier/method_verifier.cc38
-rw-r--r--runtime/verifier/method_verifier.h2
2 files changed, 24 insertions, 16 deletions
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index 21a4ecca47..2a2afc4a27 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -105,25 +105,27 @@ void PcToRegisterLineTable::Init(RegisterTrackingMode mode, InstructionFlags* fl
PcToRegisterLineTable::~PcToRegisterLineTable() {}
// Note: returns true on failure.
-ALWAYS_INLINE static inline bool FailOrAbort(MethodVerifier* verifier, bool condition,
- const char* error_msg, uint32_t work_insn_idx) {
+inline bool MethodVerifier::FailOrAbort(bool condition,
+ const char* error_msg,
+ uint32_t work_insn_idx) {
if (kIsDebugBuild) {
// In a debug build, abort if the error condition is wrong. Only warn if
// we are already aborting (as this verification is likely run to print
// lock information).
if (LIKELY(gAborting == 0)) {
- DCHECK(condition) << error_msg << work_insn_idx;
+ DCHECK(condition) << error_msg << work_insn_idx << " "
+ << dex_file_->PrettyMethod(dex_method_idx_);
} else {
if (!condition) {
LOG(ERROR) << error_msg << work_insn_idx;
- verifier->Fail(VERIFY_ERROR_BAD_CLASS_HARD) << error_msg << work_insn_idx;
+ Fail(VERIFY_ERROR_BAD_CLASS_HARD) << error_msg << work_insn_idx;
return true;
}
}
} else {
// In a non-debug build, just fail the class.
if (!condition) {
- verifier->Fail(VERIFY_ERROR_BAD_CLASS_HARD) << error_msg << work_insn_idx;
+ Fail(VERIFY_ERROR_BAD_CLASS_HARD) << error_msg << work_insn_idx;
return true;
}
}
@@ -2683,7 +2685,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) {
while (0 != instance_of_idx && !GetInstructionFlags(instance_of_idx).IsOpcode()) {
instance_of_idx--;
}
- if (FailOrAbort(this, GetInstructionFlags(instance_of_idx).IsOpcode(),
+ if (FailOrAbort(GetInstructionFlags(instance_of_idx).IsOpcode(),
"Unable to get previous instruction of if-eqz/if-nez for work index ",
work_insn_idx_)) {
break;
@@ -2750,7 +2752,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) {
while (0 != move_idx && !GetInstructionFlags(move_idx).IsOpcode()) {
move_idx--;
}
- if (FailOrAbort(this, GetInstructionFlags(move_idx).IsOpcode(),
+ if (FailOrAbort(GetInstructionFlags(move_idx).IsOpcode(),
"Unable to get previous instruction of if-eqz/if-nez for work index ",
work_insn_idx_)) {
break;
@@ -3863,8 +3865,7 @@ const RegType& MethodVerifier::GetCaughtExceptionType() {
// odd case, but nothing to do
} else {
common_super = &common_super->Merge(exception, &reg_types_, this);
- if (FailOrAbort(this,
- reg_types_.JavaLangThrowable(false).IsAssignableFrom(
+ if (FailOrAbort(reg_types_.JavaLangThrowable(false).IsAssignableFrom(
*common_super, this),
"java.lang.Throwable is not assignable-from common_super at ",
work_insn_idx_)) {
@@ -4430,8 +4431,9 @@ ArtMethod* MethodVerifier::GetQuickInvokedMethod(const Instruction* inst, Regist
if (klass->IsInterface()) {
// Derive Object.class from Class.class.getSuperclass().
mirror::Class* object_klass = klass->GetClass()->GetSuperClass();
- if (FailOrAbort(this, object_klass->IsObjectClass(),
- "Failed to find Object class in quickened invoke receiver", work_insn_idx_)) {
+ if (FailOrAbort(object_klass->IsObjectClass(),
+ "Failed to find Object class in quickened invoke receiver",
+ work_insn_idx_)) {
return nullptr;
}
dispatch_class = object_klass;
@@ -4439,7 +4441,8 @@ ArtMethod* MethodVerifier::GetQuickInvokedMethod(const Instruction* inst, Regist
dispatch_class = klass;
}
if (!dispatch_class->HasVTable()) {
- FailOrAbort(this, allow_failure, "Receiver class has no vtable for quickened invoke at ",
+ FailOrAbort(allow_failure,
+ "Receiver class has no vtable for quickened invoke at ",
work_insn_idx_);
return nullptr;
}
@@ -4447,14 +4450,15 @@ ArtMethod* MethodVerifier::GetQuickInvokedMethod(const Instruction* inst, Regist
auto* cl = Runtime::Current()->GetClassLinker();
auto pointer_size = cl->GetImagePointerSize();
if (static_cast<int32_t>(vtable_index) >= dispatch_class->GetVTableLength()) {
- FailOrAbort(this, allow_failure,
+ FailOrAbort(allow_failure,
"Receiver class has not enough vtable slots for quickened invoke at ",
work_insn_idx_);
return nullptr;
}
ArtMethod* res_method = dispatch_class->GetVTableEntry(vtable_index, pointer_size);
if (self_->IsExceptionPending()) {
- FailOrAbort(this, allow_failure, "Unexpected exception pending for quickened invoke at ",
+ FailOrAbort(allow_failure,
+ "Unexpected exception pending for quickened invoke at ",
work_insn_idx_);
return nullptr;
}
@@ -4470,11 +4474,13 @@ ArtMethod* MethodVerifier::VerifyInvokeVirtualQuickArgs(const Instruction* inst,
Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "Cannot infer method from " << inst->Name();
return nullptr;
}
- if (FailOrAbort(this, !res_method->IsDirect(), "Quick-invoked method is direct at ",
+ if (FailOrAbort(!res_method->IsDirect(),
+ "Quick-invoked method is direct at ",
work_insn_idx_)) {
return nullptr;
}
- if (FailOrAbort(this, !res_method->IsStatic(), "Quick-invoked method is static at ",
+ if (FailOrAbort(!res_method->IsStatic(),
+ "Quick-invoked method is static at ",
work_insn_idx_)) {
return nullptr;
}
diff --git a/runtime/verifier/method_verifier.h b/runtime/verifier/method_verifier.h
index 26c598f224..9a94297942 100644
--- a/runtime/verifier/method_verifier.h
+++ b/runtime/verifier/method_verifier.h
@@ -721,6 +721,8 @@ class MethodVerifier {
const RegType& FromClass(const char* descriptor, mirror::Class* klass, bool precise)
REQUIRES_SHARED(Locks::mutator_lock_);
+ ALWAYS_INLINE bool FailOrAbort(bool condition, const char* error_msg, uint32_t work_insn_idx);
+
// The thread we're verifying on.
Thread* const self_;