diff options
author | Hiroshi Yamauchi <yamauchi@google.com> | 2015-05-21 12:05:27 -0700 |
---|---|---|
committer | Hiroshi Yamauchi <yamauchi@google.com> | 2015-05-22 11:42:29 -0700 |
commit | 08d1b5f2296c0f51507b8b443f4e39dfc161572c (patch) | |
tree | 90e2c9952949faa8ba8a24285d8afa03e3d8b04c /runtime/mirror | |
parent | d58a6deedabf98e7996634bca6d94c6eb2ac3861 (diff) | |
download | art-08d1b5f2296c0f51507b8b443f4e39dfc161572c.tar.gz art-08d1b5f2296c0f51507b8b443f4e39dfc161572c.tar.bz2 art-08d1b5f2296c0f51507b8b443f4e39dfc161572c.zip |
Fix for potential moving GC bugs around proxy class.
- Handlerize proxy_class which is live across multiple allocation
points in ClassLinker::CreateProxyClass().
- In ClassLinker::CreateProxyClass(), insert a proxy class into the
class table before creating ArtFields for it (and update it later in
LinkClass()) because the field roots (ArtField::declaring_class_)
won't be updated by GC unless the class is in the class table. If GC
happens before they are updated by FixupTemporaryDeclaringClass()
from LinkClass(), FixupTemporaryDeclaringClass() may not update the
field roots correctly because the old class may already be moved but
the fields roots may not. Reduce a window of time where the fields
roots could be stale.
- In ClassLinker::LinkClass(), directly wrap a new class in a handle
to avoid a window of time where new_class may be potentially stale.
- Print more diagnostic info about the holder of the field upon a mark
sweep invalid ref crash.
- Add an additional sanity check in Field::GetArtField().
Bug: 20557050
Change-Id: I9ad32d304922da96b7e1fad262d97de21cbac776
Diffstat (limited to 'runtime/mirror')
-rw-r--r-- | runtime/mirror/field.cc | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/runtime/mirror/field.cc b/runtime/mirror/field.cc index 933784e7ff..ac56129a16 100644 --- a/runtime/mirror/field.cc +++ b/runtime/mirror/field.cc @@ -69,6 +69,7 @@ ArtField* Field::GetArtField() { mirror::DexCache* const dex_cache = declaring_class->GetDexCache(); ArtField* const art_field = dex_cache->GetResolvedField(GetDexFieldIndex(), sizeof(void*)); CHECK(art_field != nullptr); + CHECK_EQ(declaring_class, art_field->GetDeclaringClass()); return art_field; } |