diff options
Diffstat (limited to 'runtime/verifier/method_verifier.cc')
-rw-r--r-- | runtime/verifier/method_verifier.cc | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index 0de1e76..1502978 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -297,7 +297,7 @@ MethodVerifier::FailureKind MethodVerifier::VerifyMethod(Thread* self, uint32_t return result; } -void MethodVerifier::VerifyMethodAndDump(Thread* self, std::ostream& os, uint32_t dex_method_idx, +MethodVerifier* MethodVerifier::VerifyMethodAndDump(Thread* self, std::ostream& os, uint32_t dex_method_idx, const DexFile* dex_file, ConstHandle<mirror::DexCache> dex_cache, ConstHandle<mirror::ClassLoader> class_loader, @@ -305,12 +305,15 @@ void MethodVerifier::VerifyMethodAndDump(Thread* self, std::ostream& os, uint32_ const DexFile::CodeItem* code_item, ConstHandle<mirror::ArtMethod> method, uint32_t method_access_flags) { - MethodVerifier verifier(self, dex_file, dex_cache, class_loader, class_def, code_item, - dex_method_idx, method, method_access_flags, true, true, true); - verifier.Verify(); - verifier.DumpFailures(os); - os << verifier.info_messages_.str(); - verifier.Dump(os); + MethodVerifier* verifier = new MethodVerifier(self, dex_file, dex_cache, class_loader, + class_def, code_item, dex_method_idx, method, + method_access_flags, true, true, true, true); + verifier->Verify(); + verifier->DumpFailures(os); + os << verifier->info_messages_.str(); + verifier->Dump(os); + + return verifier; } MethodVerifier::MethodVerifier(Thread* self, @@ -320,7 +323,7 @@ MethodVerifier::MethodVerifier(Thread* self, const DexFile::CodeItem* code_item, uint32_t dex_method_idx, ConstHandle<mirror::ArtMethod> method, uint32_t method_access_flags, bool can_load_classes, bool allow_soft_failures, - bool need_precise_constants) + bool need_precise_constants, bool verify_to_dump) : self_(self), reg_types_(can_load_classes), work_insn_idx_(-1), @@ -344,7 +347,8 @@ MethodVerifier::MethodVerifier(Thread* self, allow_soft_failures_(allow_soft_failures), need_precise_constants_(need_precise_constants), has_check_casts_(false), - has_virtual_or_interface_invokes_(false) { + has_virtual_or_interface_invokes_(false), + verify_to_dump_(verify_to_dump) { Runtime::Current()->AddMethodVerifier(this); DCHECK(class_def != nullptr); } @@ -774,7 +778,7 @@ bool MethodVerifier::VerifyInstruction(const Instruction* inst, uint32_t code_of result = false; break; } - if (inst->GetVerifyIsRuntimeOnly() && Runtime::Current()->IsCompiler()) { + if (inst->GetVerifyIsRuntimeOnly() && Runtime::Current()->IsCompiler() && !verify_to_dump_) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "opcode only expected at runtime " << inst->Name(); result = false; } |