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/mirror | |
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/mirror')
-rw-r--r-- | runtime/mirror/art_field.cc | 21 | ||||
-rw-r--r-- | runtime/mirror/art_field.h | 4 |
2 files changed, 25 insertions, 0 deletions
diff --git a/runtime/mirror/art_field.cc b/runtime/mirror/art_field.cc index f91cab1036..7b0b94cd78 100644 --- a/runtime/mirror/art_field.cc +++ b/runtime/mirror/art_field.cc @@ -19,6 +19,7 @@ #include "art_field-inl.h" #include "gc/accounting/card_table-inl.h" #include "object-inl.h" +#include "object_array-inl.h" #include "object_utils.h" #include "runtime.h" #include "scoped_thread_state_change.h" @@ -69,5 +70,25 @@ void ArtField::VisitRoots(RootCallback* callback, void* arg) { } } +// TODO: we could speed up the search if fields are ordered by offsets. +ArtField* ArtField::FindInstanceFieldWithOffset(mirror::Class* klass, uint32_t field_offset) { + DCHECK(klass != nullptr); + ObjectArray<ArtField>* instance_fields = klass->GetIFields(); + if (instance_fields != nullptr) { + for (int32_t i = 0, e = instance_fields->GetLength(); i < e; ++i) { + mirror::ArtField* field = instance_fields->GetWithoutChecks(i); + if (field->GetOffset().Uint32Value() == field_offset) { + return field; + } + } + } + // We did not find field in the class: look into superclass. + if (klass->GetSuperClass() != NULL) { + return FindInstanceFieldWithOffset(klass->GetSuperClass(), field_offset); + } else { + return nullptr; + } +} + } // namespace mirror } // namespace art diff --git a/runtime/mirror/art_field.h b/runtime/mirror/art_field.h index 0daa838a2c..ba70cc64e3 100644 --- a/runtime/mirror/art_field.h +++ b/runtime/mirror/art_field.h @@ -132,6 +132,10 @@ class MANAGED ArtField : public Object { return (GetAccessFlags() & kAccVolatile) != 0; } + // Returns an instance field with this offset in the given class or nullptr if not found. + static ArtField* FindInstanceFieldWithOffset(mirror::Class* klass, uint32_t field_offset) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + private: // Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses". // The class we are a part of |