diff options
Diffstat (limited to 'runtime/mirror')
| -rw-r--r-- | runtime/mirror/array-inl.h | 4 | ||||
| -rw-r--r-- | runtime/mirror/array.h | 3 | ||||
| -rw-r--r-- | runtime/mirror/art_field.cc | 4 | ||||
| -rw-r--r-- | runtime/mirror/art_field.h | 2 | ||||
| -rw-r--r-- | runtime/mirror/art_method.cc | 4 | ||||
| -rw-r--r-- | runtime/mirror/art_method.h | 2 | ||||
| -rw-r--r-- | runtime/mirror/class.cc | 4 | ||||
| -rw-r--r-- | runtime/mirror/class.h | 2 | ||||
| -rw-r--r-- | runtime/mirror/field.cc | 6 | ||||
| -rw-r--r-- | runtime/mirror/field.h | 2 | ||||
| -rw-r--r-- | runtime/mirror/object_reference.h | 22 | ||||
| -rw-r--r-- | runtime/mirror/reference.cc | 7 | ||||
| -rw-r--r-- | runtime/mirror/reference.h | 2 | ||||
| -rw-r--r-- | runtime/mirror/stack_trace_element.cc | 4 | ||||
| -rw-r--r-- | runtime/mirror/stack_trace_element.h | 2 | ||||
| -rw-r--r-- | runtime/mirror/string.cc | 4 | ||||
| -rw-r--r-- | runtime/mirror/string.h | 2 | ||||
| -rw-r--r-- | runtime/mirror/throwable.cc | 4 | ||||
| -rw-r--r-- | runtime/mirror/throwable.h | 2 |
19 files changed, 53 insertions, 29 deletions
diff --git a/runtime/mirror/array-inl.h b/runtime/mirror/array-inl.h index 7f04992c5c..6452f31ebc 100644 --- a/runtime/mirror/array-inl.h +++ b/runtime/mirror/array-inl.h @@ -196,8 +196,8 @@ inline Array* Array::Alloc(Thread* self, Class* array_class, int32_t component_c } template<class T> -inline void PrimitiveArray<T>::VisitRoots(RootCallback* callback, void* arg) { - array_class_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +inline void PrimitiveArray<T>::VisitRoots(RootVisitor* visitor) { + array_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } template<typename T> diff --git a/runtime/mirror/array.h b/runtime/mirror/array.h index 83e3688917..115fcf2408 100644 --- a/runtime/mirror/array.h +++ b/runtime/mirror/array.h @@ -166,8 +166,7 @@ class MANAGED PrimitiveArray : public Array { array_class_ = GcRoot<Class>(nullptr); } - static void VisitRoots(RootCallback* callback, void* arg) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); private: static GcRoot<Class> array_class_; diff --git a/runtime/mirror/art_field.cc b/runtime/mirror/art_field.cc index 4c36753724..83602d48dc 100644 --- a/runtime/mirror/art_field.cc +++ b/runtime/mirror/art_field.cc @@ -55,8 +55,8 @@ void ArtField::SetOffset(MemberOffset num_bytes) { SetField32<false>(OFFSET_OF_OBJECT_MEMBER(ArtField, offset_), num_bytes.Uint32Value()); } -void ArtField::VisitRoots(RootCallback* callback, void* arg) { - java_lang_reflect_ArtField_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +void ArtField::VisitRoots(RootVisitor* visitor) { + java_lang_reflect_ArtField_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } // TODO: we could speed up the search if fields are ordered by offsets. diff --git a/runtime/mirror/art_field.h b/runtime/mirror/art_field.h index d640165aef..9d95cb922b 100644 --- a/runtime/mirror/art_field.h +++ b/runtime/mirror/art_field.h @@ -138,7 +138,7 @@ class MANAGED ArtField FINAL : public Object { static void SetClass(Class* java_lang_reflect_ArtField); static void ResetClass(); - static void VisitRoots(RootCallback* callback, void* arg) + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool IsVolatile() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { diff --git a/runtime/mirror/art_method.cc b/runtime/mirror/art_method.cc index c1f7594578..edbbb4af30 100644 --- a/runtime/mirror/art_method.cc +++ b/runtime/mirror/art_method.cc @@ -61,8 +61,8 @@ ArtMethod* ArtMethod::FromReflectedMethod(const ScopedObjectAccessAlreadyRunnabl } -void ArtMethod::VisitRoots(RootCallback* callback, void* arg) { - java_lang_reflect_ArtMethod_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +void ArtMethod::VisitRoots(RootVisitor* visitor) { + java_lang_reflect_ArtMethod_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } mirror::String* ArtMethod::GetNameAsString(Thread* self) { diff --git a/runtime/mirror/art_method.h b/runtime/mirror/art_method.h index 82e5d00377..22481cee75 100644 --- a/runtime/mirror/art_method.h +++ b/runtime/mirror/art_method.h @@ -488,7 +488,7 @@ class MANAGED ArtMethod FINAL : public Object { static void ResetClass(); - static void VisitRoots(RootCallback* callback, void* arg) + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); const DexFile* GetDexFile() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); diff --git a/runtime/mirror/class.cc b/runtime/mirror/class.cc index 29851a9d4f..8fb8147a8a 100644 --- a/runtime/mirror/class.cc +++ b/runtime/mirror/class.cc @@ -51,8 +51,8 @@ void Class::ResetClass() { java_lang_Class_ = GcRoot<Class>(nullptr); } -void Class::VisitRoots(RootCallback* callback, void* arg) { - java_lang_Class_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +void Class::VisitRoots(RootVisitor* visitor) { + java_lang_Class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } void Class::SetStatus(Handle<Class> h_this, Status new_status, Thread* self) { diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h index 2dff3835b1..b82a58f4c2 100644 --- a/runtime/mirror/class.h +++ b/runtime/mirror/class.h @@ -971,7 +971,7 @@ class MANAGED Class FINAL : public Object { // Can't call this SetClass or else gets called instead of Object::SetClass in places. static void SetClassClass(Class* java_lang_Class) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); static void ResetClass(); - static void VisitRoots(RootCallback* callback, void* arg) + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // When class is verified, set the kAccPreverified flag on each method. diff --git a/runtime/mirror/field.cc b/runtime/mirror/field.cc index 1724682f79..82cc26e9fe 100644 --- a/runtime/mirror/field.cc +++ b/runtime/mirror/field.cc @@ -48,9 +48,9 @@ void Field::ResetArrayClass() { array_class_ = GcRoot<Class>(nullptr); } -void Field::VisitRoots(RootCallback* callback, void* arg) { - static_class_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); - array_class_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +void Field::VisitRoots(RootVisitor* visitor) { + static_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); + array_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } ArtField* Field::GetArtField() { diff --git a/runtime/mirror/field.h b/runtime/mirror/field.h index f54340a6a4..cea06f5af8 100644 --- a/runtime/mirror/field.h +++ b/runtime/mirror/field.h @@ -89,7 +89,7 @@ class MANAGED Field : public AccessibleObject { static void ResetArrayClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static void VisitRoots(RootCallback* callback, void* arg) + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Slow, try to use only for PrettyField and such. diff --git a/runtime/mirror/object_reference.h b/runtime/mirror/object_reference.h index b63d13d602..5edda8b346 100644 --- a/runtime/mirror/object_reference.h +++ b/runtime/mirror/object_reference.h @@ -43,6 +43,11 @@ class MANAGED ObjectReference { void Clear() { reference_ = 0; + DCHECK(IsNull()); + } + + bool IsNull() const { + return reference_ == 0; } uint32_t AsVRegValue() const { @@ -86,6 +91,23 @@ class MANAGED HeapReference : public ObjectReference<kPoisonHeapReferences, Mirr : ObjectReference<kPoisonHeapReferences, MirrorType>(mirror_ptr) {} }; +// Standard compressed reference used in the runtime. Used for StackRefernce and GC roots. +template<class MirrorType> +class MANAGED CompressedReference : public mirror::ObjectReference<false, MirrorType> { + public: + CompressedReference<MirrorType>() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + : mirror::ObjectReference<false, MirrorType>(nullptr) {} + + static CompressedReference<MirrorType> FromMirrorPtr(MirrorType* p) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + return CompressedReference<MirrorType>(p); + } + + private: + CompressedReference<MirrorType>(MirrorType* p) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) + : mirror::ObjectReference<false, MirrorType>(p) {} +}; + } // namespace mirror } // namespace art diff --git a/runtime/mirror/reference.cc b/runtime/mirror/reference.cc index 35130e8b88..70bcf92e7d 100644 --- a/runtime/mirror/reference.cc +++ b/runtime/mirror/reference.cc @@ -16,6 +16,9 @@ #include "reference.h" +#include "mirror/art_method.h" +#include "gc_root-inl.h" + namespace art { namespace mirror { @@ -32,8 +35,8 @@ void Reference::ResetClass() { java_lang_ref_Reference_ = GcRoot<Class>(nullptr); } -void Reference::VisitRoots(RootCallback* callback, void* arg) { - java_lang_ref_Reference_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +void Reference::VisitRoots(RootVisitor* visitor) { + java_lang_ref_Reference_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } } // namespace mirror diff --git a/runtime/mirror/reference.h b/runtime/mirror/reference.h index 69ef69c662..c11d79dfff 100644 --- a/runtime/mirror/reference.h +++ b/runtime/mirror/reference.h @@ -100,7 +100,7 @@ class MANAGED Reference : public Object { } static void SetClass(Class* klass); static void ResetClass(); - static void VisitRoots(RootCallback* callback, void* arg); + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); private: // Note: This avoids a read barrier, it should only be used by the GC. diff --git a/runtime/mirror/stack_trace_element.cc b/runtime/mirror/stack_trace_element.cc index c2a67e809a..ec2b495024 100644 --- a/runtime/mirror/stack_trace_element.cc +++ b/runtime/mirror/stack_trace_element.cc @@ -67,8 +67,8 @@ void StackTraceElement::Init(Handle<String> declaring_class, Handle<String> meth line_number); } -void StackTraceElement::VisitRoots(RootCallback* callback, void* arg) { - java_lang_StackTraceElement_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +void StackTraceElement::VisitRoots(RootVisitor* visitor) { + java_lang_StackTraceElement_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } diff --git a/runtime/mirror/stack_trace_element.h b/runtime/mirror/stack_trace_element.h index 70acd1ce55..dc7131e46e 100644 --- a/runtime/mirror/stack_trace_element.h +++ b/runtime/mirror/stack_trace_element.h @@ -54,7 +54,7 @@ class MANAGED StackTraceElement FINAL : public Object { static void SetClass(Class* java_lang_StackTraceElement); static void ResetClass(); - static void VisitRoots(RootCallback* callback, void* arg) + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); static Class* GetStackTraceElement() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { DCHECK(!java_lang_StackTraceElement_.IsNull()); diff --git a/runtime/mirror/string.cc b/runtime/mirror/string.cc index e7c88c5425..bd6a63c727 100644 --- a/runtime/mirror/string.cc +++ b/runtime/mirror/string.cc @@ -253,8 +253,8 @@ int32_t String::CompareTo(String* rhs) { return countDiff; } -void String::VisitRoots(RootCallback* callback, void* arg) { - java_lang_String_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +void String::VisitRoots(RootVisitor* visitor) { + java_lang_String_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } } // namespace mirror diff --git a/runtime/mirror/string.h b/runtime/mirror/string.h index 6c22b9b6af..0670d0bec7 100644 --- a/runtime/mirror/string.h +++ b/runtime/mirror/string.h @@ -127,7 +127,7 @@ class MANAGED String FINAL : public Object { static void SetClass(Class* java_lang_String); static void ResetClass(); - static void VisitRoots(RootCallback* callback, void* arg) + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // TODO: Make this private. It's only used on ObjectTest at the moment. diff --git a/runtime/mirror/throwable.cc b/runtime/mirror/throwable.cc index fdfeb47da0..b564649946 100644 --- a/runtime/mirror/throwable.cc +++ b/runtime/mirror/throwable.cc @@ -144,8 +144,8 @@ void Throwable::ResetClass() { java_lang_Throwable_ = GcRoot<Class>(nullptr); } -void Throwable::VisitRoots(RootCallback* callback, void* arg) { - java_lang_Throwable_.VisitRootIfNonNull(callback, arg, RootInfo(kRootStickyClass)); +void Throwable::VisitRoots(RootVisitor* visitor) { + java_lang_Throwable_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); } } // namespace mirror diff --git a/runtime/mirror/throwable.h b/runtime/mirror/throwable.h index c22475b4ce..9cc0b6f5c4 100644 --- a/runtime/mirror/throwable.h +++ b/runtime/mirror/throwable.h @@ -55,7 +55,7 @@ class MANAGED Throwable : public Object { static void SetClass(Class* java_lang_Throwable); static void ResetClass(); - static void VisitRoots(RootCallback* callback, void* arg) + static void VisitRoots(RootVisitor* visitor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); private: |
