diff options
author | Sebastien Hertz <shertz@google.com> | 2014-04-25 07:37:49 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-04-25 07:37:49 +0000 |
commit | 942c8e3723ad1e12039deef5754440dd8e1c546d (patch) | |
tree | e05d0f71932320f1f8f4f9987a88065c22739663 /runtime/verifier | |
parent | 011005100214eb40c2aaad3f8fe9c3dc9465bcec (diff) | |
parent | 479fc1ecc12fa6560ca90d841c4d5174fb346618 (diff) | |
download | art-942c8e3723ad1e12039deef5754440dd8e1c546d.tar.gz art-942c8e3723ad1e12039deef5754440dd8e1c546d.tar.bz2 art-942c8e3723ad1e12039deef5754440dd8e1c546d.zip |
Merge "Support field watchpoint in interpreter"
Diffstat (limited to 'runtime/verifier')
-rw-r--r-- | runtime/verifier/method_verifier.cc | 31 |
1 files changed, 7 insertions, 24 deletions
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index b6fe4d5644..5d033bc109 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -3594,29 +3594,6 @@ void MethodVerifier::VerifyISPut(const Instruction* inst, const RegType& insn_ty } } -// Look for an instance field with this offset. -// TODO: we may speed up the search if offsets are sorted by doing a quick search. -static mirror::ArtField* FindInstanceFieldWithOffset(mirror::Class* klass, uint32_t field_offset) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - mirror::ObjectArray<mirror::ArtField>* instance_fields = klass->GetIFields(); - if (instance_fields != NULL) { - for (int32_t i = 0, e = instance_fields->GetLength(); i < e; ++i) { - mirror::ArtField* field = instance_fields->Get(i); - if (field->GetOffset().Uint32Value() == field_offset) { - return field; - } - } - } - // We did not find field in class: look into superclass. - if (klass->GetSuperClass() != NULL) { - return FindInstanceFieldWithOffset(klass->GetSuperClass(), field_offset); - } else { - VLOG(verifier) << "Failed to find instance field at offset '" << field_offset - << "' from '" << PrettyDescriptor(klass) << "'"; - return nullptr; - } -} - mirror::ArtField* MethodVerifier::GetQuickFieldAccess(const Instruction* inst, RegisterLine* reg_line) { DCHECK(inst->Opcode() == Instruction::IGET_QUICK || @@ -3631,7 +3608,13 @@ mirror::ArtField* MethodVerifier::GetQuickFieldAccess(const Instruction* inst, return nullptr; } uint32_t field_offset = static_cast<uint32_t>(inst->VRegC_22c()); - return FindInstanceFieldWithOffset(object_type.GetClass(), field_offset); + mirror::ArtField* f = mirror::ArtField::FindInstanceFieldWithOffset(object_type.GetClass(), + field_offset); + if (f == nullptr) { + VLOG(verifier) << "Failed to find instance field at offset '" << field_offset + << "' from '" << PrettyDescriptor(object_type.GetClass()) << "'"; + } + return f; } void MethodVerifier::VerifyIGetQuick(const Instruction* inst, const RegType& insn_type, |