auto* dex_caches = image_header.GetImageRoot<kWithoutReadBarrier>(ImageHeader::kDexCaches)->
AsObjectArray<mirror::DexCache>();
for (int32_t i = 0, count = dex_caches->GetLength(); i < count; ++i) {
- mirror::DexCache* dex_cache = dex_caches->Get(i);
+ mirror::DexCache* dex_cache = dex_caches->Get<kVerifyNone, kWithoutReadBarrier>(i);
// Fix up dex cache pointers.
GcRoot<mirror::String>* strings = dex_cache->GetStrings();
if (strings != nullptr) {
if (strings != new_strings) {
dex_cache->SetFieldPtr64<false>(mirror::DexCache::StringsOffset(), new_strings);
}
- dex_cache->FixupStrings(new_strings, fixup_adapter);
+ dex_cache->FixupStrings<kWithoutReadBarrier>(new_strings, fixup_adapter);
}
GcRoot<mirror::Class>* types = dex_cache->GetResolvedTypes();
if (types != nullptr) {
if (types != new_types) {
dex_cache->SetFieldPtr64<false>(mirror::DexCache::ResolvedTypesOffset(), new_types);
}
- dex_cache->FixupResolvedTypes(new_types, fixup_adapter);
+ dex_cache->FixupResolvedTypes<kWithoutReadBarrier>(new_types, fixup_adapter);
}
ArtMethod** methods = dex_cache->GetResolvedMethods();
if (methods != nullptr) {
}
}
-template <typename Visitor>
+template <ReadBarrierOption kReadBarrierOption, typename Visitor>
inline void DexCache::FixupStrings(GcRoot<mirror::String>* dest, const Visitor& visitor) {
GcRoot<mirror::String>* src = GetStrings();
for (size_t i = 0, count = NumStrings(); i < count; ++i) {
- // TODO: Probably don't need read barrier for most callers.
- mirror::String* source = src[i].Read();
+ mirror::String* source = src[i].Read<kReadBarrierOption>();
mirror::String* new_source = visitor(source);
if (source != new_source) {
dest[i] = GcRoot<mirror::String>(new_source);
}
}
-template <typename Visitor>
+template <ReadBarrierOption kReadBarrierOption, typename Visitor>
inline void DexCache::FixupResolvedTypes(GcRoot<mirror::Class>* dest, const Visitor& visitor) {
GcRoot<mirror::Class>* src = GetResolvedTypes();
for (size_t i = 0, count = NumResolvedTypes(); i < count; ++i) {
- // TODO: Probably don't need read barrier for most callers.
- mirror::Class* source = src[i].Read();
+ mirror::Class* source = src[i].Read<kReadBarrierOption>();
mirror::Class* new_source = visitor(source);
if (source != new_source) {
dest[i] = GcRoot<mirror::Class>(new_source);
void Fixup(ArtMethod* trampoline, size_t pointer_size)
SHARED_REQUIRES(Locks::mutator_lock_);
- template <typename Visitor>
+ template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier, typename Visitor>
void FixupStrings(GcRoot<mirror::String>* dest, const Visitor& visitor)
SHARED_REQUIRES(Locks::mutator_lock_);
- template <typename Visitor>
+ template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier, typename Visitor>
void FixupResolvedTypes(GcRoot<mirror::Class>* dest, const Visitor& visitor)
SHARED_REQUIRES(Locks::mutator_lock_);