diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2015-06-19 13:32:41 +0100 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2015-06-22 14:12:19 +0100 |
commit | 7d59309458c69e1b2b2e85be5acc150979198f6f (patch) | |
tree | 4d5d30e6ee792ec05d31c60bc26b5f10cc5745b1 /compiler/optimizing | |
parent | 1e256bf257e8d97df9b2178ae8658b731ca2d662 (diff) | |
download | art-7d59309458c69e1b2b2e85be5acc150979198f6f.tar.gz art-7d59309458c69e1b2b2e85be5acc150979198f6f.tar.bz2 art-7d59309458c69e1b2b2e85be5acc150979198f6f.zip |
Use compiling class instead of referrer for access checks.
bug:21869670
(cherry picked from commit 30451743493bc2f589e96d68ab98f557461f97f9)
Change-Id: Ia18986797d166470801e7a9a690c054d2dc57952
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/builder.cc | 36 | ||||
-rw-r--r-- | compiler/optimizing/builder.h | 4 |
2 files changed, 26 insertions, 14 deletions
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index eda2a0d294..2858c5093a 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -862,17 +862,25 @@ bool HGraphBuilder::BuildInstanceFieldAccess(const Instruction& instruction, return true; } -mirror::Class* HGraphBuilder::GetOutermostCompilingClass() const { +static mirror::Class* GetClassFrom(CompilerDriver* driver, + const DexCompilationUnit& compilation_unit) { ScopedObjectAccess soa(Thread::Current()); StackHandleScope<2> hs(soa.Self()); - const DexFile& outer_dex_file = *outer_compilation_unit_->GetDexFile(); + const DexFile& dex_file = *compilation_unit.GetDexFile(); Handle<mirror::ClassLoader> class_loader(hs.NewHandle( - soa.Decode<mirror::ClassLoader*>(dex_compilation_unit_->GetClassLoader()))); - Handle<mirror::DexCache> outer_dex_cache(hs.NewHandle( - outer_compilation_unit_->GetClassLinker()->FindDexCache(outer_dex_file))); + soa.Decode<mirror::ClassLoader*>(compilation_unit.GetClassLoader()))); + Handle<mirror::DexCache> dex_cache(hs.NewHandle( + compilation_unit.GetClassLinker()->FindDexCache(dex_file))); + + return driver->ResolveCompilingMethodsClass(soa, dex_cache, class_loader, &compilation_unit); +} + +mirror::Class* HGraphBuilder::GetOutermostCompilingClass() const { + return GetClassFrom(compiler_driver_, *outer_compilation_unit_); +} - return compiler_driver_->ResolveCompilingMethodsClass( - soa, outer_dex_cache, class_loader, outer_compilation_unit_); +mirror::Class* HGraphBuilder::GetCompilingClass() const { + return GetClassFrom(compiler_driver_, *dex_compilation_unit_); } bool HGraphBuilder::IsOutermostCompilingClass(uint16_t type_index) const { @@ -912,20 +920,20 @@ bool HGraphBuilder::BuildStaticFieldAccess(const Instruction& instruction, const DexFile& outer_dex_file = *outer_compilation_unit_->GetDexFile(); Handle<mirror::DexCache> outer_dex_cache(hs.NewHandle( outer_compilation_unit_->GetClassLinker()->FindDexCache(outer_dex_file))); - Handle<mirror::Class> referrer_class(hs.NewHandle(GetOutermostCompilingClass())); + Handle<mirror::Class> outer_class(hs.NewHandle(GetOutermostCompilingClass())); // The index at which the field's class is stored in the DexCache's type array. uint32_t storage_index; - bool is_referrer_class = (referrer_class.Get() == resolved_field->GetDeclaringClass()); - if (is_referrer_class) { - storage_index = referrer_class->GetDexTypeIndex(); + bool is_outer_class = (outer_class.Get() == resolved_field->GetDeclaringClass()); + if (is_outer_class) { + storage_index = outer_class->GetDexTypeIndex(); } else if (outer_dex_cache.Get() != dex_cache.Get()) { // The compiler driver cannot currently understand multiple dex caches involved. Just bailout. return false; } else { std::pair<bool, bool> pair = compiler_driver_->IsFastStaticField( outer_dex_cache.Get(), - referrer_class.Get(), + GetCompilingClass(), resolved_field, field_index, &storage_index); @@ -940,11 +948,11 @@ bool HGraphBuilder::BuildStaticFieldAccess(const Instruction& instruction, *outer_compilation_unit_->GetDexFile(), storage_index); bool is_initialized = resolved_field->GetDeclaringClass()->IsInitialized() && is_in_dex_cache; - HLoadClass* constant = new (arena_) HLoadClass(storage_index, is_referrer_class, dex_pc); + HLoadClass* constant = new (arena_) HLoadClass(storage_index, is_outer_class, dex_pc); current_block_->AddInstruction(constant); HInstruction* cls = constant; - if (!is_initialized && !is_referrer_class) { + if (!is_initialized && !is_outer_class) { cls = new (arena_) HClinitCheck(constant, dex_pc); current_block_->AddInstruction(cls); } diff --git a/compiler/optimizing/builder.h b/compiler/optimizing/builder.h index 36503ce43a..b1ee824845 100644 --- a/compiler/optimizing/builder.h +++ b/compiler/optimizing/builder.h @@ -222,8 +222,12 @@ class HGraphBuilder : public ValueObject { void MaybeRecordStat(MethodCompilationStat compilation_stat); + // Returns the outer-most compiling method's class. mirror::Class* GetOutermostCompilingClass() const; + // Returns the class whose method is being compiled. + mirror::Class* GetCompilingClass() const; + // Returns whether `type_index` points to the outer-most compiling method's class. bool IsOutermostCompilingClass(uint16_t type_index) const; |