diff options
author | 2019-11-20 13:49:19 -0800 | |
---|---|---|
committer | 2019-11-21 00:38:16 +0000 | |
commit | e61f16af3976ca8c0ab82cd3f21e5dff66225520 (patch) | |
tree | 4eb932e907b165f267755549361db870d1b51778 | |
parent | 55d9aaad5d5ec9729ce7522eb88b0c69a0b3342d (diff) |
Add missing WriteBarrier on VisitReflectiveTargets
We weren't performing write-barriers during VisitReflectiveTargets.
This could lead to incorrect marking.
Test: ./test.py --host --gcstress
Change-Id: I153f319e257675d83cae6ec25e041cbddecf1a94
-rw-r--r-- | runtime/mirror/dex_cache.cc | 7 | ||||
-rw-r--r-- | runtime/mirror/executable-inl.h | 1 | ||||
-rw-r--r-- | runtime/mirror/field.cc | 2 |
3 files changed, 10 insertions, 0 deletions
diff --git a/runtime/mirror/dex_cache.cc b/runtime/mirror/dex_cache.cc index 96fc403690..dba2860606 100644 --- a/runtime/mirror/dex_cache.cc +++ b/runtime/mirror/dex_cache.cc @@ -31,6 +31,7 @@ #include "string.h" #include "thread.h" #include "utils/dex_cache_arrays_layout-inl.h" +#include "write_barrier.h" namespace art { namespace mirror { @@ -174,6 +175,7 @@ void DexCache::InitializeDexCache(Thread* self, } void DexCache::VisitReflectiveTargets(ReflectiveValueVisitor* visitor) { + bool wrote = false; for (size_t i = 0; i < NumResolvedFields(); i++) { auto pair(GetNativePairPtrSize(GetResolvedFields(), i, kRuntimePointerSize)); if (pair.index == FieldDexCachePair::InvalidIndexForSlot(i)) { @@ -188,6 +190,7 @@ void DexCache::VisitReflectiveTargets(ReflectiveValueVisitor* visitor) { pair.object = new_val; } SetNativePairPtrSize(GetResolvedFields(), i, pair, kRuntimePointerSize); + wrote = true; } } for (size_t i = 0; i < NumResolvedMethods(); i++) { @@ -204,8 +207,12 @@ void DexCache::VisitReflectiveTargets(ReflectiveValueVisitor* visitor) { pair.object = new_val; } SetNativePairPtrSize(GetResolvedMethods(), i, pair, kRuntimePointerSize); + wrote = true; } } + if (wrote) { + WriteBarrier::ForEveryFieldWrite(this); + } } bool DexCache::AddPreResolvedStringsArray() { diff --git a/runtime/mirror/executable-inl.h b/runtime/mirror/executable-inl.h index f2d684a3d5..77669dace8 100644 --- a/runtime/mirror/executable-inl.h +++ b/runtime/mirror/executable-inl.h @@ -47,6 +47,7 @@ inline void Executable::VisitTarget(ReflectiveValueVisitor* v) { SetArtMethod(new_target); SetDexMethodIndex(new_target->GetDexMethodIndex()); SetDeclaringClass(new_target->GetDeclaringClass()); + WriteBarrier::ForEveryFieldWrite(this); } } diff --git a/runtime/mirror/field.cc b/runtime/mirror/field.cc index aa071a8a8c..9e566b5ae1 100644 --- a/runtime/mirror/field.cc +++ b/runtime/mirror/field.cc @@ -20,6 +20,7 @@ #include "dex_cache-inl.h" #include "object-inl.h" #include "object_array-inl.h" +#include "write_barrier.h" namespace art { namespace mirror { @@ -32,6 +33,7 @@ void Field::VisitTarget(ReflectiveValueVisitor* v) { SetDexFieldIndex<false>(new_value->GetDexFieldIndex()); SetOffset<false>(new_value->GetOffset().Int32Value()); SetDeclaringClass<false>(new_value->GetDeclaringClass()); + WriteBarrier::ForEveryFieldWrite(this); } DCHECK_EQ(new_value, GetArtField(/*use_dex_cache*/false)); } |