diff options
| author | 2017-05-12 18:17:30 +0000 | |
|---|---|---|
| committer | 2017-05-12 18:17:32 +0000 | |
| commit | bcd27692d787c510285308daffad1d6d9f44b0bc (patch) | |
| tree | d1c458ac4f6089ba08a786521e861af972f1f22d /compiler | |
| parent | 13b392640f95c1153524096435f939b2908cfb2f (diff) | |
| parent | 26699c6b66546dad072ee3c5b1401fdf6a7503aa (diff) | |
Merge "ART: Refactor VerifiedMethod"
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/dex/verification_results.cc | 7 | ||||
| -rw-r--r-- | compiler/dex/verified_method.cc | 13 | ||||
| -rw-r--r-- | compiler/dex/verified_method.h | 6 |
3 files changed, 19 insertions, 7 deletions
diff --git a/compiler/dex/verification_results.cc b/compiler/dex/verification_results.cc index 3f0df3b2c8..0338cfde8c 100644 --- a/compiler/dex/verification_results.cc +++ b/compiler/dex/verification_results.cc @@ -82,7 +82,12 @@ void VerificationResults::ProcessVerifiedMethod(verifier::MethodVerifier* method // TODO: Investigate why are we doing the work again for this method and try to avoid it. LOG(WARNING) << "Method processed more than once: " << ref.PrettyMethod(); if (!Runtime::Current()->UseJitCompilation()) { - DCHECK_EQ(existing->GetSafeCastSet().size(), verified_method->GetSafeCastSet().size()); + if (kIsDebugBuild) { + auto ex_set = existing->GetSafeCastSet(); + auto ve_set = verified_method->GetSafeCastSet(); + CHECK_EQ(ex_set == nullptr, ve_set == nullptr); + CHECK((ex_set == nullptr) || (ex_set->size() == ve_set->size())); + } } // Let the unique_ptr delete the new verified method since there was already an existing one // registered. It is unsafe to replace the existing one since the JIT may be using it to diff --git a/compiler/dex/verified_method.cc b/compiler/dex/verified_method.cc index 608a18aa66..e46dc597fa 100644 --- a/compiler/dex/verified_method.cc +++ b/compiler/dex/verified_method.cc @@ -49,7 +49,10 @@ const VerifiedMethod* VerifiedMethod::Create(verifier::MethodVerifier* method_ve } bool VerifiedMethod::IsSafeCast(uint32_t pc) const { - return std::binary_search(safe_cast_set_.begin(), safe_cast_set_.end(), pc); + if (safe_cast_set_ == nullptr) { + return false; + } + return std::binary_search(safe_cast_set_->begin(), safe_cast_set_->end(), pc); } void VerifiedMethod::GenerateSafeCastSet(verifier::MethodVerifier* method_verifier) { @@ -94,12 +97,16 @@ void VerifiedMethod::GenerateSafeCastSet(verifier::MethodVerifier* method_verifi /* strict */ true, /* assignable */ true); } + if (safe_cast_set_ == nullptr) { + safe_cast_set_.reset(new SafeCastSet()); + } // Verify ordering for push_back() to the sorted vector. - DCHECK(safe_cast_set_.empty() || safe_cast_set_.back() < dex_pc); - safe_cast_set_.push_back(dex_pc); + DCHECK(safe_cast_set_->empty() || safe_cast_set_->back() < dex_pc); + safe_cast_set_->push_back(dex_pc); } } } + DCHECK(safe_cast_set_ == nullptr || !safe_cast_set_->empty()); } } // namespace art diff --git a/compiler/dex/verified_method.h b/compiler/dex/verified_method.h index 439e69ece9..64b3f448e6 100644 --- a/compiler/dex/verified_method.h +++ b/compiler/dex/verified_method.h @@ -43,8 +43,8 @@ class VerifiedMethod { REQUIRES_SHARED(Locks::mutator_lock_); ~VerifiedMethod() = default; - const SafeCastSet& GetSafeCastSet() const { - return safe_cast_set_; + const SafeCastSet* GetSafeCastSet() const { + return safe_cast_set_.get(); } // Returns true if the cast can statically be verified to be redundant @@ -69,7 +69,7 @@ class VerifiedMethod { void GenerateSafeCastSet(verifier::MethodVerifier* method_verifier) REQUIRES_SHARED(Locks::mutator_lock_); - SafeCastSet safe_cast_set_; + std::unique_ptr<SafeCastSet> safe_cast_set_; const uint32_t encountered_error_types_; const bool has_runtime_throw_; |