diff options
| author | 2015-06-19 13:32:41 +0100 | |
|---|---|---|
| committer | 2015-06-19 13:59:38 +0100 | |
| commit | 30451743493bc2f589e96d68ab98f557461f97f9 (patch) | |
| tree | 7d663eaeba566457b54691c03f377fbfdd609cae /compiler/optimizing | |
| parent | f12ffdb549f1947125e3f56694cb479a619f02bf (diff) | |
Use compiling class instead of referrer for access checks.
bug:21869670
Change-Id: Ief329247e90202835e27fa38803e02dd2e2ae8ca
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 946c0602cf..cafa554177 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -878,17 +878,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 { @@ -928,20 +936,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); @@ -959,12 +967,12 @@ bool HGraphBuilder::BuildStaticFieldAccess(const Instruction& instruction, HLoadClass* constant = new (arena_) HLoadClass(graph_->GetCurrentMethod(), storage_index, *dex_compilation_unit_->GetDexFile(), - is_referrer_class, + 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; |