summaryrefslogtreecommitdiff
path: root/compiler/driver/compiler_driver.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r--compiler/driver/compiler_driver.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc
index a60c5bc98e..eb5739f3e4 100644
--- a/compiler/driver/compiler_driver.cc
+++ b/compiler/driver/compiler_driver.cc
@@ -1094,11 +1094,17 @@ bool CompilerDriver::ComputeStaticFieldInfo(uint32_t field_idx, const DexCompila
if (resolved_field != nullptr && referrer_class != nullptr) {
*is_volatile = IsFieldVolatile(resolved_field);
std::pair<bool, bool> fast_path = IsFastStaticField(
- dex_cache, referrer_class, resolved_field, field_idx, field_offset,
- storage_index, is_referrers_class, is_initialized);
+ dex_cache, referrer_class, resolved_field, field_idx, storage_index);
result = is_put ? fast_path.second : fast_path.first;
}
- if (!result) {
+ if (result) {
+ *field_offset = GetFieldOffset(resolved_field);
+ *is_referrers_class = IsStaticFieldInReferrerClass(referrer_class, resolved_field);
+ // *is_referrers_class == true implies no worrying about class initialization.
+ *is_initialized = (*is_referrers_class) ||
+ (IsStaticFieldsClassInitialized(referrer_class, resolved_field) &&
+ CanAssumeTypeIsPresentInDexCache(*mUnit->GetDexFile(), *storage_index));
+ } else {
// Conservative defaults.
*is_volatile = true;
*field_offset = MemberOffset(static_cast<size_t>(-1));