diff options
Diffstat (limited to 'runtime/image-inl.h')
-rw-r--r-- | runtime/image-inl.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/runtime/image-inl.h b/runtime/image-inl.h index c527f6fbcc..9fde669a49 100644 --- a/runtime/image-inl.h +++ b/runtime/image-inl.h @@ -49,6 +49,38 @@ inline ObjPtr<mirror::ObjectArray<mirror::Object>> ImageHeader::GetImageRoots() return image_roots; } +inline void ImageHeader::VisitPackedArtFields(ArtFieldVisitor* visitor, uint8_t* base) const { + const ImageSection& fields = GetFieldsSection(); + for (size_t pos = 0; pos < fields.Size(); ) { + auto* array = reinterpret_cast<LengthPrefixedArray<ArtField>*>(base + fields.Offset() + pos); + for (size_t i = 0; i < array->size(); ++i) { + visitor->Visit(&array->At(i, sizeof(ArtField))); + } + pos += array->ComputeSize(array->size()); + } +} + +inline void ImageHeader::VisitPackedArtMethods(ArtMethodVisitor* visitor, + uint8_t* base, + PointerSize pointer_size) const { + const size_t method_alignment = ArtMethod::Alignment(pointer_size); + const size_t method_size = ArtMethod::Size(pointer_size); + const ImageSection& methods = GetMethodsSection(); + for (size_t pos = 0; pos < methods.Size(); ) { + auto* array = reinterpret_cast<LengthPrefixedArray<ArtMethod>*>(base + methods.Offset() + pos); + for (size_t i = 0; i < array->size(); ++i) { + visitor->Visit(&array->At(i, method_size, method_alignment)); + } + pos += array->ComputeSize(array->size(), method_size, method_alignment); + } + const ImageSection& runtime_methods = GetRuntimeMethodsSection(); + for (size_t pos = 0; pos < runtime_methods.Size(); ) { + auto* method = reinterpret_cast<ArtMethod*>(base + runtime_methods.Offset() + pos); + visitor->Visit(method); + pos += method_size; + } +} + template <typename Visitor> inline void ImageHeader::VisitPackedImTables(const Visitor& visitor, uint8_t* base, |