summaryrefslogtreecommitdiffstats
path: root/runtime/mirror
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2014-04-25 07:37:49 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-04-25 07:37:49 +0000
commit942c8e3723ad1e12039deef5754440dd8e1c546d (patch)
treee05d0f71932320f1f8f4f9987a88065c22739663 /runtime/mirror
parent011005100214eb40c2aaad3f8fe9c3dc9465bcec (diff)
parent479fc1ecc12fa6560ca90d841c4d5174fb346618 (diff)
downloadart-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.cc21
-rw-r--r--runtime/mirror/art_field.h4
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