diff options
| author | 2017-02-14 05:40:45 +0000 | |
|---|---|---|
| committer | 2017-02-14 05:40:46 +0000 | |
| commit | df5492c5e1a75a399a2de7bf5d68d0b0aa33c293 (patch) | |
| tree | 7e87fa894090a6b1d8cf0c0b87776bc606725fee /compiler/optimizing/instruction_builder.cc | |
| parent | 1f38f99e3eeed84b49d54762713dec613271b809 (diff) | |
| parent | 5812e20ff7cbc8efa0b8d7486ada2f58840a6ad5 (diff) | |
Merge "Revert^3 "Hash-based dex cache type array.""
Diffstat (limited to 'compiler/optimizing/instruction_builder.cc')
| -rw-r--r-- | compiler/optimizing/instruction_builder.cc | 47 | 
1 files changed, 24 insertions, 23 deletions
| diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc index 3aaf2ca102..a1c391f455 100644 --- a/compiler/optimizing/instruction_builder.cc +++ b/compiler/optimizing/instruction_builder.cc @@ -669,10 +669,11 @@ static InvokeType GetInvokeTypeFromOpCode(Instruction::Code opcode) {  ArtMethod* HInstructionBuilder::ResolveMethod(uint16_t method_idx, InvokeType invoke_type) {    ScopedObjectAccess soa(Thread::Current()); -  StackHandleScope<2> hs(soa.Self()); +  StackHandleScope<3> hs(soa.Self());    ClassLinker* class_linker = dex_compilation_unit_->GetClassLinker(); -  Handle<mirror::ClassLoader> class_loader = dex_compilation_unit_->GetClassLoader(); +  Handle<mirror::ClassLoader> class_loader(hs.NewHandle( +      soa.Decode<mirror::ClassLoader>(dex_compilation_unit_->GetClassLoader())));    Handle<mirror::Class> compiling_class(hs.NewHandle(GetCompilingClass()));    // We fetch the referenced class eagerly (that is, the class pointed by in the MethodId    // at method_idx), as `CanAccessResolvedMethod` expects it be be in the dex cache. @@ -1259,7 +1260,9 @@ bool HInstructionBuilder::BuildInstanceFieldAccess(const Instruction& instructio  static mirror::Class* GetClassFrom(CompilerDriver* driver,                                     const DexCompilationUnit& compilation_unit) {    ScopedObjectAccess soa(Thread::Current()); -  Handle<mirror::ClassLoader> class_loader = compilation_unit.GetClassLoader(); +  StackHandleScope<1> hs(soa.Self()); +  Handle<mirror::ClassLoader> class_loader(hs.NewHandle( +      soa.Decode<mirror::ClassLoader>(compilation_unit.GetClassLoader())));    Handle<mirror::DexCache> dex_cache = compilation_unit.GetDexCache();    return driver->ResolveCompilingMethodsClass(soa, dex_cache, class_loader, &compilation_unit); @@ -1275,9 +1278,10 @@ mirror::Class* HInstructionBuilder::GetCompilingClass() const {  bool HInstructionBuilder::IsOutermostCompilingClass(dex::TypeIndex type_index) const {    ScopedObjectAccess soa(Thread::Current()); -  StackHandleScope<2> hs(soa.Self()); +  StackHandleScope<3> hs(soa.Self());    Handle<mirror::DexCache> dex_cache = dex_compilation_unit_->GetDexCache(); -  Handle<mirror::ClassLoader> class_loader = dex_compilation_unit_->GetClassLoader(); +  Handle<mirror::ClassLoader> class_loader(hs.NewHandle( +      soa.Decode<mirror::ClassLoader>(dex_compilation_unit_->GetClassLoader())));    Handle<mirror::Class> cls(hs.NewHandle(compiler_driver_->ResolveClass(        soa, dex_cache, class_loader, type_index, dex_compilation_unit_)));    Handle<mirror::Class> outer_class(hs.NewHandle(GetOutermostCompilingClass())); @@ -1313,7 +1317,8 @@ ArtField* HInstructionBuilder::ResolveField(uint16_t field_idx, bool is_static,    StackHandleScope<2> hs(soa.Self());    ClassLinker* class_linker = dex_compilation_unit_->GetClassLinker(); -  Handle<mirror::ClassLoader> class_loader = dex_compilation_unit_->GetClassLoader(); +  Handle<mirror::ClassLoader> class_loader(hs.NewHandle( +      soa.Decode<mirror::ClassLoader>(dex_compilation_unit_->GetClassLoader())));    Handle<mirror::Class> compiling_class(hs.NewHandle(GetCompilingClass()));    ArtField* resolved_field = class_linker->ResolveField(*dex_compilation_unit_->GetDexFile(), @@ -1630,8 +1635,10 @@ static TypeCheckKind ComputeTypeCheckKind(Handle<mirror::Class> cls)  HLoadClass* HInstructionBuilder::BuildLoadClass(dex::TypeIndex type_index, uint32_t dex_pc) {    ScopedObjectAccess soa(Thread::Current()); +  StackHandleScope<2> hs(soa.Self());    const DexFile& dex_file = *dex_compilation_unit_->GetDexFile(); -  Handle<mirror::ClassLoader> class_loader = dex_compilation_unit_->GetClassLoader(); +  Handle<mirror::ClassLoader> class_loader(hs.NewHandle( +      soa.Decode<mirror::ClassLoader>(dex_compilation_unit_->GetClassLoader())));    Handle<mirror::Class> klass = handles_->NewHandle(compiler_driver_->ResolveClass(        soa, dex_compilation_unit_->GetDexCache(), class_loader, type_index, dex_compilation_unit_)); @@ -1715,9 +1722,17 @@ void HInstructionBuilder::BuildTypeCheck(const Instruction& instruction,    }  } -bool HInstructionBuilder::NeedsAccessCheck(dex::TypeIndex type_index, bool* finalizable) const { +bool HInstructionBuilder::NeedsAccessCheck(dex::TypeIndex type_index, +                                           Handle<mirror::DexCache> dex_cache, +                                           bool* finalizable) const {    return !compiler_driver_->CanAccessInstantiableTypeWithoutChecks( -      LookupReferrerClass(), LookupResolvedType(type_index, *dex_compilation_unit_), finalizable); +      dex_compilation_unit_->GetDexMethodIndex(), dex_cache, type_index, finalizable); +} + +bool HInstructionBuilder::NeedsAccessCheck(dex::TypeIndex type_index, bool* finalizable) const { +  ScopedObjectAccess soa(Thread::Current()); +  Handle<mirror::DexCache> dex_cache = dex_compilation_unit_->GetDexCache(); +  return NeedsAccessCheck(type_index, dex_cache, finalizable);  }  bool HInstructionBuilder::CanDecodeQuickenedInfo() const { @@ -2757,18 +2772,4 @@ bool HInstructionBuilder::ProcessDexInstruction(const Instruction& instruction,    return true;  }  // NOLINT(readability/fn_size) -ObjPtr<mirror::Class> HInstructionBuilder::LookupResolvedType( -    dex::TypeIndex type_index, -    const DexCompilationUnit& compilation_unit) const { -  return ClassLinker::LookupResolvedType( -        type_index, compilation_unit.GetDexCache().Get(), compilation_unit.GetClassLoader().Get()); -} - -ObjPtr<mirror::Class> HInstructionBuilder::LookupReferrerClass() const { -  // TODO: Cache the result in a Handle<mirror::Class>. -  const DexFile::MethodId& method_id = -      dex_compilation_unit_->GetDexFile()->GetMethodId(dex_compilation_unit_->GetDexMethodIndex()); -  return LookupResolvedType(method_id.class_idx_, *dex_compilation_unit_); -} -  }  // namespace art |