Home | History | Annotate | Download | only in dex
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "dex_file_annotations.h"
     18 
     19 #include <stdlib.h>
     20 
     21 #include "android-base/stringprintf.h"
     22 
     23 #include "art_field-inl.h"
     24 #include "art_method-inl.h"
     25 #include "base/sdk_version.h"
     26 #include "class_linker-inl.h"
     27 #include "class_root.h"
     28 #include "dex/dex_file-inl.h"
     29 #include "dex/dex_instruction-inl.h"
     30 #include "jni/jni_internal.h"
     31 #include "jvalue-inl.h"
     32 #include "mirror/array-alloc-inl.h"
     33 #include "mirror/class-alloc-inl.h"
     34 #include "mirror/field.h"
     35 #include "mirror/method.h"
     36 #include "mirror/object_array-alloc-inl.h"
     37 #include "mirror/object_array-inl.h"
     38 #include "oat_file.h"
     39 #include "obj_ptr-inl.h"
     40 #include "quicken_info.h"
     41 #include "reflection.h"
     42 #include "thread.h"
     43 #include "well_known_classes.h"
     44 
     45 namespace art {
     46 
     47 using android::base::StringPrintf;
     48 
     49 using dex::AnnotationItem;
     50 using dex::AnnotationSetItem;
     51 using dex::AnnotationSetRefItem;
     52 using dex::AnnotationSetRefList;
     53 using dex::AnnotationsDirectoryItem;
     54 using dex::FieldAnnotationsItem;
     55 using dex::MethodAnnotationsItem;
     56 using dex::ParameterAnnotationsItem;
     57 
     58 struct DexFile::AnnotationValue {
     59   JValue value_;
     60   uint8_t type_;
     61 };
     62 
     63 namespace {
     64 
     65 // A helper class that contains all the data needed to do annotation lookup.
     66 class ClassData {
     67  public:
     68   explicit ClassData(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_)
     69     : ClassData(ScopedNullHandle<mirror::Class>(),  // klass
     70                 method,
     71                 *method->GetDexFile(),
     72                 &method->GetClassDef()) {}
     73 
     74   // Requires Scope to be able to create at least 1 handles.
     75   template <typename Scope>
     76   ClassData(Scope& hs, ArtField* field) REQUIRES_SHARED(Locks::mutator_lock_)
     77     : ClassData(hs.NewHandle(field->GetDeclaringClass())) { }
     78 
     79   explicit ClassData(Handle<mirror::Class> klass) REQUIRES_SHARED(art::Locks::mutator_lock_)
     80     : ClassData(klass,  // klass
     81                 nullptr,  // method
     82                 klass->GetDexFile(),
     83                 klass->GetClassDef()) {}
     84 
     85   const DexFile& GetDexFile() const REQUIRES_SHARED(Locks::mutator_lock_) {
     86     return dex_file_;
     87   }
     88 
     89   const dex::ClassDef* GetClassDef() const REQUIRES_SHARED(Locks::mutator_lock_) {
     90     return class_def_;
     91   }
     92 
     93   ObjPtr<mirror::DexCache> GetDexCache() const REQUIRES_SHARED(Locks::mutator_lock_) {
     94     if (method_ != nullptr) {
     95       return method_->GetDexCache();
     96     } else {
     97       return real_klass_->GetDexCache();
     98     }
     99   }
    100 
    101   ObjPtr<mirror::ClassLoader> GetClassLoader() const REQUIRES_SHARED(Locks::mutator_lock_) {
    102     if (method_ != nullptr) {
    103       return method_->GetDeclaringClass()->GetClassLoader();
    104     } else {
    105       return real_klass_->GetClassLoader();
    106     }
    107   }
    108 
    109   ObjPtr<mirror::Class> GetRealClass() const REQUIRES_SHARED(Locks::mutator_lock_) {
    110     if (method_ != nullptr) {
    111       return method_->GetDeclaringClass();
    112     } else {
    113       return real_klass_.Get();
    114     }
    115   }
    116 
    117  private:
    118   ClassData(Handle<mirror::Class> klass,
    119             ArtMethod* method,
    120             const DexFile& dex_file,
    121             const dex::ClassDef* class_def) REQUIRES_SHARED(Locks::mutator_lock_)
    122       : real_klass_(klass),
    123         method_(method),
    124         dex_file_(dex_file),
    125         class_def_(class_def) {
    126     DCHECK((method_ == nullptr) || real_klass_.IsNull());
    127   }
    128 
    129   Handle<mirror::Class> real_klass_;
    130   ArtMethod* method_;
    131   const DexFile& dex_file_;
    132   const dex::ClassDef* class_def_;
    133 
    134   DISALLOW_COPY_AND_ASSIGN(ClassData);
    135 };
    136 
    137 ObjPtr<mirror::Object> CreateAnnotationMember(const ClassData& klass,
    138                                               Handle<mirror::Class> annotation_class,
    139                                               const uint8_t** annotation)
    140     REQUIRES_SHARED(Locks::mutator_lock_);
    141 
    142 bool IsVisibilityCompatible(uint32_t actual, uint32_t expected) {
    143   if (expected == DexFile::kDexVisibilityRuntime) {
    144     if (IsSdkVersionSetAndAtMost(Runtime::Current()->GetTargetSdkVersion(), SdkVersion::kM)) {
    145       return actual == DexFile::kDexVisibilityRuntime || actual == DexFile::kDexVisibilityBuild;
    146     }
    147   }
    148   return actual == expected;
    149 }
    150 
    151 static const AnnotationSetItem* FindAnnotationSetForField(const DexFile& dex_file,
    152                                                           const dex::ClassDef& class_def,
    153                                                           uint32_t field_index)
    154     REQUIRES_SHARED(Locks::mutator_lock_) {
    155   const AnnotationsDirectoryItem* annotations_dir = dex_file.GetAnnotationsDirectory(class_def);
    156   if (annotations_dir == nullptr) {
    157     return nullptr;
    158   }
    159   const FieldAnnotationsItem* field_annotations = dex_file.GetFieldAnnotations(annotations_dir);
    160   if (field_annotations == nullptr) {
    161     return nullptr;
    162   }
    163   uint32_t field_count = annotations_dir->fields_size_;
    164   for (uint32_t i = 0; i < field_count; ++i) {
    165     if (field_annotations[i].field_idx_ == field_index) {
    166       return dex_file.GetFieldAnnotationSetItem(field_annotations[i]);
    167     }
    168   }
    169   return nullptr;
    170 }
    171 
    172 static const AnnotationSetItem* FindAnnotationSetForField(ArtField* field)
    173     REQUIRES_SHARED(Locks::mutator_lock_) {
    174   ObjPtr<mirror::Class> klass = field->GetDeclaringClass();
    175   const dex::ClassDef* class_def = klass->GetClassDef();
    176   if (class_def == nullptr) {
    177     DCHECK(klass->IsProxyClass());
    178     return nullptr;
    179   }
    180   return FindAnnotationSetForField(*field->GetDexFile(), *class_def, field->GetDexFieldIndex());
    181 }
    182 
    183 const AnnotationItem* SearchAnnotationSet(const DexFile& dex_file,
    184                                           const AnnotationSetItem* annotation_set,
    185                                           const char* descriptor,
    186                                           uint32_t visibility)
    187     REQUIRES_SHARED(Locks::mutator_lock_) {
    188   const AnnotationItem* result = nullptr;
    189   for (uint32_t i = 0; i < annotation_set->size_; ++i) {
    190     const AnnotationItem* annotation_item = dex_file.GetAnnotationItem(annotation_set, i);
    191     if (!IsVisibilityCompatible(annotation_item->visibility_, visibility)) {
    192       continue;
    193     }
    194     const uint8_t* annotation = annotation_item->annotation_;
    195     uint32_t type_index = DecodeUnsignedLeb128(&annotation);
    196 
    197     if (strcmp(descriptor, dex_file.StringByTypeIdx(dex::TypeIndex(type_index))) == 0) {
    198       result = annotation_item;
    199       break;
    200     }
    201   }
    202   return result;
    203 }
    204 
    205 bool SkipAnnotationValue(const DexFile& dex_file, const uint8_t** annotation_ptr)
    206     REQUIRES_SHARED(Locks::mutator_lock_) {
    207   const uint8_t* annotation = *annotation_ptr;
    208   uint8_t header_byte = *(annotation++);
    209   uint8_t value_type = header_byte & DexFile::kDexAnnotationValueTypeMask;
    210   uint8_t value_arg = header_byte >> DexFile::kDexAnnotationValueArgShift;
    211   int32_t width = value_arg + 1;
    212 
    213   switch (value_type) {
    214     case DexFile::kDexAnnotationByte:
    215     case DexFile::kDexAnnotationShort:
    216     case DexFile::kDexAnnotationChar:
    217     case DexFile::kDexAnnotationInt:
    218     case DexFile::kDexAnnotationLong:
    219     case DexFile::kDexAnnotationFloat:
    220     case DexFile::kDexAnnotationDouble:
    221     case DexFile::kDexAnnotationString:
    222     case DexFile::kDexAnnotationType:
    223     case DexFile::kDexAnnotationMethod:
    224     case DexFile::kDexAnnotationField:
    225     case DexFile::kDexAnnotationEnum:
    226       break;
    227     case DexFile::kDexAnnotationArray:
    228     {
    229       uint32_t size = DecodeUnsignedLeb128(&annotation);
    230       for (; size != 0u; --size) {
    231         if (!SkipAnnotationValue(dex_file, &annotation)) {
    232           return false;
    233         }
    234       }
    235       width = 0;
    236       break;
    237     }
    238     case DexFile::kDexAnnotationAnnotation:
    239     {
    240       DecodeUnsignedLeb128(&annotation);  // unused type_index
    241       uint32_t size = DecodeUnsignedLeb128(&annotation);
    242       for (; size != 0u; --size) {
    243         DecodeUnsignedLeb128(&annotation);  // unused element_name_index
    244         if (!SkipAnnotationValue(dex_file, &annotation)) {
    245           return false;
    246         }
    247       }
    248       width = 0;
    249       break;
    250     }
    251     case DexFile::kDexAnnotationBoolean:
    252     case DexFile::kDexAnnotationNull:
    253       width = 0;
    254       break;
    255     default:
    256       LOG(FATAL) << StringPrintf("Bad annotation element value byte 0x%02x", value_type);
    257       UNREACHABLE();
    258   }
    259 
    260   annotation += width;
    261   *annotation_ptr = annotation;
    262   return true;
    263 }
    264 
    265 const uint8_t* SearchEncodedAnnotation(const DexFile& dex_file,
    266                                        const uint8_t* annotation,
    267                                        const char* name)
    268     REQUIRES_SHARED(Locks::mutator_lock_) {
    269   DecodeUnsignedLeb128(&annotation);  // unused type_index
    270   uint32_t size = DecodeUnsignedLeb128(&annotation);
    271 
    272   while (size != 0) {
    273     uint32_t element_name_index = DecodeUnsignedLeb128(&annotation);
    274     const char* element_name =
    275         dex_file.GetStringData(dex_file.GetStringId(dex::StringIndex(element_name_index)));
    276     if (strcmp(name, element_name) == 0) {
    277       return annotation;
    278     }
    279     SkipAnnotationValue(dex_file, &annotation);
    280     size--;
    281   }
    282   return nullptr;
    283 }
    284 
    285 static const AnnotationSetItem* FindAnnotationSetForMethod(const DexFile& dex_file,
    286                                                            const dex::ClassDef& class_def,
    287                                                            uint32_t method_index) {
    288   const AnnotationsDirectoryItem* annotations_dir = dex_file.GetAnnotationsDirectory(class_def);
    289   if (annotations_dir == nullptr) {
    290     return nullptr;
    291   }
    292   const MethodAnnotationsItem* method_annotations = dex_file.GetMethodAnnotations(annotations_dir);
    293   if (method_annotations == nullptr) {
    294     return nullptr;
    295   }
    296   uint32_t method_count = annotations_dir->methods_size_;
    297   for (uint32_t i = 0; i < method_count; ++i) {
    298     if (method_annotations[i].method_idx_ == method_index) {
    299       return dex_file.GetMethodAnnotationSetItem(method_annotations[i]);
    300     }
    301   }
    302   return nullptr;
    303 }
    304 
    305 inline const AnnotationSetItem* FindAnnotationSetForMethod(ArtMethod* method)
    306     REQUIRES_SHARED(Locks::mutator_lock_) {
    307   if (method->IsProxyMethod()) {
    308     return nullptr;
    309   }
    310   return FindAnnotationSetForMethod(*method->GetDexFile(),
    311                                     method->GetClassDef(),
    312                                     method->GetDexMethodIndex());
    313 }
    314 
    315 const ParameterAnnotationsItem* FindAnnotationsItemForMethod(ArtMethod* method)
    316     REQUIRES_SHARED(Locks::mutator_lock_) {
    317   const DexFile* dex_file = method->GetDexFile();
    318   const AnnotationsDirectoryItem* annotations_dir =
    319       dex_file->GetAnnotationsDirectory(method->GetClassDef());
    320   if (annotations_dir == nullptr) {
    321     return nullptr;
    322   }
    323   const ParameterAnnotationsItem* parameter_annotations =
    324       dex_file->GetParameterAnnotations(annotations_dir);
    325   if (parameter_annotations == nullptr) {
    326     return nullptr;
    327   }
    328   uint32_t method_index = method->GetDexMethodIndex();
    329   uint32_t parameter_count = annotations_dir->parameters_size_;
    330   for (uint32_t i = 0; i < parameter_count; ++i) {
    331     if (parameter_annotations[i].method_idx_ == method_index) {
    332       return &parameter_annotations[i];
    333     }
    334   }
    335   return nullptr;
    336 }
    337 
    338 static const AnnotationSetItem* FindAnnotationSetForClass(const ClassData& klass)
    339     REQUIRES_SHARED(Locks::mutator_lock_) {
    340   const DexFile& dex_file = klass.GetDexFile();
    341   const dex::ClassDef* class_def = klass.GetClassDef();
    342   if (class_def == nullptr) {
    343     DCHECK(klass.GetRealClass()->IsProxyClass());
    344     return nullptr;
    345   }
    346   const AnnotationsDirectoryItem* annotations_dir = dex_file.GetAnnotationsDirectory(*class_def);
    347   if (annotations_dir == nullptr) {
    348     return nullptr;
    349   }
    350   return dex_file.GetClassAnnotationSet(annotations_dir);
    351 }
    352 
    353 ObjPtr<mirror::Object> ProcessEncodedAnnotation(const ClassData& klass, const uint8_t** annotation)
    354     REQUIRES_SHARED(Locks::mutator_lock_) {
    355   uint32_t type_index = DecodeUnsignedLeb128(annotation);
    356   uint32_t size = DecodeUnsignedLeb128(annotation);
    357 
    358   Thread* self = Thread::Current();
    359   ScopedObjectAccessUnchecked soa(self);
    360   StackHandleScope<4> hs(self);
    361   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    362   Handle<mirror::Class> annotation_class(hs.NewHandle(
    363       class_linker->ResolveType(dex::TypeIndex(type_index),
    364                                 hs.NewHandle(klass.GetDexCache()),
    365                                 hs.NewHandle(klass.GetClassLoader()))));
    366   if (annotation_class == nullptr) {
    367     LOG(INFO) << "Unable to resolve " << klass.GetRealClass()->PrettyClass()
    368               << " annotation class " << type_index;
    369     DCHECK(Thread::Current()->IsExceptionPending());
    370     Thread::Current()->ClearException();
    371     return nullptr;
    372   }
    373 
    374   ObjPtr<mirror::Class> annotation_member_class =
    375       soa.Decode<mirror::Class>(WellKnownClasses::libcore_reflect_AnnotationMember);
    376   ObjPtr<mirror::Class> annotation_member_array_class =
    377       class_linker->FindArrayClass(self, annotation_member_class);
    378   if (annotation_member_array_class == nullptr) {
    379     return nullptr;
    380   }
    381   ObjPtr<mirror::ObjectArray<mirror::Object>> element_array = nullptr;
    382   if (size > 0) {
    383     element_array =
    384         mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_member_array_class, size);
    385     if (element_array == nullptr) {
    386       LOG(ERROR) << "Failed to allocate annotation member array (" << size << " elements)";
    387       return nullptr;
    388     }
    389   }
    390 
    391   Handle<mirror::ObjectArray<mirror::Object>> h_element_array(hs.NewHandle(element_array));
    392   for (uint32_t i = 0; i < size; ++i) {
    393     ObjPtr<mirror::Object> new_member = CreateAnnotationMember(klass, annotation_class, annotation);
    394     if (new_member == nullptr) {
    395       return nullptr;
    396     }
    397     h_element_array->SetWithoutChecks<false>(i, new_member);
    398   }
    399 
    400   JValue result;
    401   ArtMethod* create_annotation_method =
    402       jni::DecodeArtMethod(WellKnownClasses::libcore_reflect_AnnotationFactory_createAnnotation);
    403   uint32_t args[2] = { static_cast<uint32_t>(reinterpret_cast<uintptr_t>(annotation_class.Get())),
    404                        static_cast<uint32_t>(reinterpret_cast<uintptr_t>(h_element_array.Get())) };
    405   create_annotation_method->Invoke(self, args, sizeof(args), &result, "LLL");
    406   if (self->IsExceptionPending()) {
    407     LOG(INFO) << "Exception in AnnotationFactory.createAnnotation";
    408     return nullptr;
    409   }
    410 
    411   return result.GetL();
    412 }
    413 
    414 template <bool kTransactionActive>
    415 bool ProcessAnnotationValue(const ClassData& klass,
    416                             const uint8_t** annotation_ptr,
    417                             DexFile::AnnotationValue* annotation_value,
    418                             Handle<mirror::Class> array_class,
    419                             DexFile::AnnotationResultStyle result_style)
    420     REQUIRES_SHARED(Locks::mutator_lock_) {
    421   const DexFile& dex_file = klass.GetDexFile();
    422   Thread* self = Thread::Current();
    423   ObjPtr<mirror::Object> element_object = nullptr;
    424   bool set_object = false;
    425   Primitive::Type primitive_type = Primitive::kPrimVoid;
    426   const uint8_t* annotation = *annotation_ptr;
    427   uint8_t header_byte = *(annotation++);
    428   uint8_t value_type = header_byte & DexFile::kDexAnnotationValueTypeMask;
    429   uint8_t value_arg = header_byte >> DexFile::kDexAnnotationValueArgShift;
    430   int32_t width = value_arg + 1;
    431   annotation_value->type_ = value_type;
    432 
    433   switch (value_type) {
    434     case DexFile::kDexAnnotationByte:
    435       annotation_value->value_.SetB(
    436           static_cast<int8_t>(DexFile::ReadSignedInt(annotation, value_arg)));
    437       primitive_type = Primitive::kPrimByte;
    438       break;
    439     case DexFile::kDexAnnotationShort:
    440       annotation_value->value_.SetS(
    441           static_cast<int16_t>(DexFile::ReadSignedInt(annotation, value_arg)));
    442       primitive_type = Primitive::kPrimShort;
    443       break;
    444     case DexFile::kDexAnnotationChar:
    445       annotation_value->value_.SetC(
    446           static_cast<uint16_t>(DexFile::ReadUnsignedInt(annotation, value_arg, false)));
    447       primitive_type = Primitive::kPrimChar;
    448       break;
    449     case DexFile::kDexAnnotationInt:
    450       annotation_value->value_.SetI(DexFile::ReadSignedInt(annotation, value_arg));
    451       primitive_type = Primitive::kPrimInt;
    452       break;
    453     case DexFile::kDexAnnotationLong:
    454       annotation_value->value_.SetJ(DexFile::ReadSignedLong(annotation, value_arg));
    455       primitive_type = Primitive::kPrimLong;
    456       break;
    457     case DexFile::kDexAnnotationFloat:
    458       annotation_value->value_.SetI(DexFile::ReadUnsignedInt(annotation, value_arg, true));
    459       primitive_type = Primitive::kPrimFloat;
    460       break;
    461     case DexFile::kDexAnnotationDouble:
    462       annotation_value->value_.SetJ(DexFile::ReadUnsignedLong(annotation, value_arg, true));
    463       primitive_type = Primitive::kPrimDouble;
    464       break;
    465     case DexFile::kDexAnnotationBoolean:
    466       annotation_value->value_.SetZ(value_arg != 0);
    467       primitive_type = Primitive::kPrimBoolean;
    468       width = 0;
    469       break;
    470     case DexFile::kDexAnnotationString: {
    471       uint32_t index = DexFile::ReadUnsignedInt(annotation, value_arg, false);
    472       if (result_style == DexFile::kAllRaw) {
    473         annotation_value->value_.SetI(index);
    474       } else {
    475         StackHandleScope<1> hs(self);
    476         element_object = Runtime::Current()->GetClassLinker()->ResolveString(
    477             dex::StringIndex(index), hs.NewHandle(klass.GetDexCache()));
    478         set_object = true;
    479         if (element_object == nullptr) {
    480           return false;
    481         }
    482       }
    483       break;
    484     }
    485     case DexFile::kDexAnnotationType: {
    486       uint32_t index = DexFile::ReadUnsignedInt(annotation, value_arg, false);
    487       if (result_style == DexFile::kAllRaw) {
    488         annotation_value->value_.SetI(index);
    489       } else {
    490         dex::TypeIndex type_index(index);
    491         StackHandleScope<2> hs(self);
    492         element_object = Runtime::Current()->GetClassLinker()->ResolveType(
    493             type_index,
    494             hs.NewHandle(klass.GetDexCache()),
    495             hs.NewHandle(klass.GetClassLoader()));
    496         set_object = true;
    497         if (element_object == nullptr) {
    498           CHECK(self->IsExceptionPending());
    499           if (result_style == DexFile::kAllObjects) {
    500             const char* msg = dex_file.StringByTypeIdx(type_index);
    501             self->ThrowNewWrappedException("Ljava/lang/TypeNotPresentException;", msg);
    502             element_object = self->GetException();
    503             self->ClearException();
    504           } else {
    505             return false;
    506           }
    507         }
    508       }
    509       break;
    510     }
    511     case DexFile::kDexAnnotationMethod: {
    512       uint32_t index = DexFile::ReadUnsignedInt(annotation, value_arg, false);
    513       if (result_style == DexFile::kAllRaw) {
    514         annotation_value->value_.SetI(index);
    515       } else {
    516         ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    517         StackHandleScope<2> hs(self);
    518         ArtMethod* method = class_linker->ResolveMethodWithoutInvokeType(
    519             index,
    520             hs.NewHandle(klass.GetDexCache()),
    521             hs.NewHandle(klass.GetClassLoader()));
    522         if (method == nullptr) {
    523           return false;
    524         }
    525         PointerSize pointer_size = class_linker->GetImagePointerSize();
    526         set_object = true;
    527         if (method->IsConstructor()) {
    528           if (pointer_size == PointerSize::k64) {
    529             element_object = mirror::Constructor::CreateFromArtMethod<PointerSize::k64,
    530                 kTransactionActive>(self, method);
    531           } else {
    532             element_object = mirror::Constructor::CreateFromArtMethod<PointerSize::k32,
    533                 kTransactionActive>(self, method);
    534           }
    535         } else {
    536           if (pointer_size == PointerSize::k64) {
    537             element_object = mirror::Method::CreateFromArtMethod<PointerSize::k64,
    538                 kTransactionActive>(self, method);
    539           } else {
    540             element_object = mirror::Method::CreateFromArtMethod<PointerSize::k32,
    541                 kTransactionActive>(self, method);
    542           }
    543         }
    544         if (element_object == nullptr) {
    545           return false;
    546         }
    547       }
    548       break;
    549     }
    550     case DexFile::kDexAnnotationField: {
    551       uint32_t index = DexFile::ReadUnsignedInt(annotation, value_arg, false);
    552       if (result_style == DexFile::kAllRaw) {
    553         annotation_value->value_.SetI(index);
    554       } else {
    555         StackHandleScope<2> hs(self);
    556         ArtField* field = Runtime::Current()->GetClassLinker()->ResolveFieldJLS(
    557             index,
    558             hs.NewHandle(klass.GetDexCache()),
    559             hs.NewHandle(klass.GetClassLoader()));
    560         if (field == nullptr) {
    561           return false;
    562         }
    563         set_object = true;
    564         PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
    565         if (pointer_size == PointerSize::k64) {
    566           element_object = mirror::Field::CreateFromArtField<PointerSize::k64,
    567               kTransactionActive>(self, field, true);
    568         } else {
    569           element_object = mirror::Field::CreateFromArtField<PointerSize::k32,
    570               kTransactionActive>(self, field, true);
    571         }
    572         if (element_object == nullptr) {
    573           return false;
    574         }
    575       }
    576       break;
    577     }
    578     case DexFile::kDexAnnotationEnum: {
    579       uint32_t index = DexFile::ReadUnsignedInt(annotation, value_arg, false);
    580       if (result_style == DexFile::kAllRaw) {
    581         annotation_value->value_.SetI(index);
    582       } else {
    583         StackHandleScope<3> hs(self);
    584         ArtField* enum_field = Runtime::Current()->GetClassLinker()->ResolveField(
    585             index,
    586             hs.NewHandle(klass.GetDexCache()),
    587             hs.NewHandle(klass.GetClassLoader()),
    588             true);
    589         if (enum_field == nullptr) {
    590           return false;
    591         } else {
    592           Handle<mirror::Class> field_class(hs.NewHandle(enum_field->GetDeclaringClass()));
    593           Runtime::Current()->GetClassLinker()->EnsureInitialized(self, field_class, true, true);
    594           element_object = enum_field->GetObject(field_class.Get());
    595           set_object = true;
    596         }
    597       }
    598       break;
    599     }
    600     case DexFile::kDexAnnotationArray:
    601       if (result_style == DexFile::kAllRaw || array_class == nullptr) {
    602         return false;
    603       } else {
    604         ScopedObjectAccessUnchecked soa(self);
    605         StackHandleScope<2> hs(self);
    606         uint32_t size = DecodeUnsignedLeb128(&annotation);
    607         Handle<mirror::Class> component_type(hs.NewHandle(array_class->GetComponentType()));
    608         Handle<mirror::Array> new_array(hs.NewHandle(mirror::Array::Alloc<true>(
    609             self, array_class.Get(), size, array_class->GetComponentSizeShift(),
    610             Runtime::Current()->GetHeap()->GetCurrentAllocator())));
    611         if (new_array == nullptr) {
    612           LOG(ERROR) << "Annotation element array allocation failed with size " << size;
    613           return false;
    614         }
    615         DexFile::AnnotationValue new_annotation_value;
    616         for (uint32_t i = 0; i < size; ++i) {
    617           if (!ProcessAnnotationValue<kTransactionActive>(klass,
    618                                                           &annotation,
    619                                                           &new_annotation_value,
    620                                                           component_type,
    621                                                           DexFile::kPrimitivesOrObjects)) {
    622             return false;
    623           }
    624           if (!component_type->IsPrimitive()) {
    625             ObjPtr<mirror::Object> obj = new_annotation_value.value_.GetL();
    626             new_array->AsObjectArray<mirror::Object>()->
    627                 SetWithoutChecks<kTransactionActive>(i, obj);
    628           } else {
    629             switch (new_annotation_value.type_) {
    630               case DexFile::kDexAnnotationByte:
    631                 new_array->AsByteArray()->SetWithoutChecks<kTransactionActive>(
    632                     i, new_annotation_value.value_.GetB());
    633                 break;
    634               case DexFile::kDexAnnotationShort:
    635                 new_array->AsShortArray()->SetWithoutChecks<kTransactionActive>(
    636                     i, new_annotation_value.value_.GetS());
    637                 break;
    638               case DexFile::kDexAnnotationChar:
    639                 new_array->AsCharArray()->SetWithoutChecks<kTransactionActive>(
    640                     i, new_annotation_value.value_.GetC());
    641                 break;
    642               case DexFile::kDexAnnotationInt:
    643                 new_array->AsIntArray()->SetWithoutChecks<kTransactionActive>(
    644                     i, new_annotation_value.value_.GetI());
    645                 break;
    646               case DexFile::kDexAnnotationLong:
    647                 new_array->AsLongArray()->SetWithoutChecks<kTransactionActive>(
    648                     i, new_annotation_value.value_.GetJ());
    649                 break;
    650               case DexFile::kDexAnnotationFloat:
    651                 new_array->AsFloatArray()->SetWithoutChecks<kTransactionActive>(
    652                     i, new_annotation_value.value_.GetF());
    653                 break;
    654               case DexFile::kDexAnnotationDouble:
    655                 new_array->AsDoubleArray()->SetWithoutChecks<kTransactionActive>(
    656                     i, new_annotation_value.value_.GetD());
    657                 break;
    658               case DexFile::kDexAnnotationBoolean:
    659                 new_array->AsBooleanArray()->SetWithoutChecks<kTransactionActive>(
    660                     i, new_annotation_value.value_.GetZ());
    661                 break;
    662               default:
    663                 LOG(FATAL) << "Found invalid annotation value type while building annotation array";
    664                 return false;
    665             }
    666           }
    667         }
    668         element_object = new_array.Get();
    669         set_object = true;
    670         width = 0;
    671       }
    672       break;
    673     case DexFile::kDexAnnotationAnnotation:
    674       if (result_style == DexFile::kAllRaw) {
    675         return false;
    676       }
    677       element_object = ProcessEncodedAnnotation(klass, &annotation);
    678       if (element_object == nullptr) {
    679         return false;
    680       }
    681       set_object = true;
    682       width = 0;
    683       break;
    684     case DexFile::kDexAnnotationNull:
    685       if (result_style == DexFile::kAllRaw) {
    686         annotation_value->value_.SetI(0);
    687       } else {
    688         CHECK(element_object == nullptr);
    689         set_object = true;
    690       }
    691       width = 0;
    692       break;
    693     default:
    694       LOG(ERROR) << StringPrintf("Bad annotation element value type 0x%02x", value_type);
    695       return false;
    696   }
    697 
    698   annotation += width;
    699   *annotation_ptr = annotation;
    700 
    701   if (result_style == DexFile::kAllObjects && primitive_type != Primitive::kPrimVoid) {
    702     element_object = BoxPrimitive(primitive_type, annotation_value->value_);
    703     set_object = true;
    704   }
    705 
    706   if (set_object) {
    707     annotation_value->value_.SetL(element_object);
    708   }
    709 
    710   return true;
    711 }
    712 
    713 ObjPtr<mirror::Object> CreateAnnotationMember(const ClassData& klass,
    714                                               Handle<mirror::Class> annotation_class,
    715                                               const uint8_t** annotation) {
    716   const DexFile& dex_file = klass.GetDexFile();
    717   Thread* self = Thread::Current();
    718   ScopedObjectAccessUnchecked soa(self);
    719   StackHandleScope<5> hs(self);
    720   uint32_t element_name_index = DecodeUnsignedLeb128(annotation);
    721   const char* name = dex_file.StringDataByIdx(dex::StringIndex(element_name_index));
    722   Handle<mirror::String> string_name(
    723       hs.NewHandle(mirror::String::AllocFromModifiedUtf8(self, name)));
    724 
    725   PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
    726   ArtMethod* annotation_method =
    727       annotation_class->FindDeclaredVirtualMethodByName(name, pointer_size);
    728   if (annotation_method == nullptr) {
    729     return nullptr;
    730   }
    731   Handle<mirror::Class> method_return(hs.NewHandle(annotation_method->ResolveReturnType()));
    732 
    733   DexFile::AnnotationValue annotation_value;
    734   if (!ProcessAnnotationValue<false>(klass,
    735                                      annotation,
    736                                      &annotation_value,
    737                                      method_return,
    738                                      DexFile::kAllObjects)) {
    739     return nullptr;
    740   }
    741   Handle<mirror::Object> value_object(hs.NewHandle(annotation_value.value_.GetL()));
    742 
    743   ObjPtr<mirror::Class> annotation_member_class =
    744       WellKnownClasses::ToClass(WellKnownClasses::libcore_reflect_AnnotationMember);
    745   Handle<mirror::Object> new_member(hs.NewHandle(annotation_member_class->AllocObject(self)));
    746   ObjPtr<mirror::Method> method_obj_ptr;
    747   DCHECK(!Runtime::Current()->IsActiveTransaction());
    748   if (pointer_size == PointerSize::k64) {
    749     method_obj_ptr = mirror::Method::CreateFromArtMethod<PointerSize::k64, false>(
    750         self, annotation_method);
    751   } else {
    752     method_obj_ptr = mirror::Method::CreateFromArtMethod<PointerSize::k32, false>(
    753         self, annotation_method);
    754   }
    755   Handle<mirror::Method> method_object(hs.NewHandle(method_obj_ptr));
    756 
    757   if (new_member == nullptr || string_name == nullptr ||
    758       method_object == nullptr || method_return == nullptr) {
    759     LOG(ERROR) << StringPrintf("Failed creating annotation element (m=%p n=%p a=%p r=%p",
    760         new_member.Get(), string_name.Get(), method_object.Get(), method_return.Get());
    761     return nullptr;
    762   }
    763 
    764   JValue result;
    765   ArtMethod* annotation_member_init =
    766       jni::DecodeArtMethod(WellKnownClasses::libcore_reflect_AnnotationMember_init);
    767   uint32_t args[5] = { static_cast<uint32_t>(reinterpret_cast<uintptr_t>(new_member.Get())),
    768                        static_cast<uint32_t>(reinterpret_cast<uintptr_t>(string_name.Get())),
    769                        static_cast<uint32_t>(reinterpret_cast<uintptr_t>(value_object.Get())),
    770                        static_cast<uint32_t>(reinterpret_cast<uintptr_t>(method_return.Get())),
    771                        static_cast<uint32_t>(reinterpret_cast<uintptr_t>(method_object.Get()))
    772   };
    773   annotation_member_init->Invoke(self, args, sizeof(args), &result, "VLLLL");
    774   if (self->IsExceptionPending()) {
    775     LOG(INFO) << "Exception in AnnotationMember.<init>";
    776     return nullptr;
    777   }
    778 
    779   return new_member.Get();
    780 }
    781 
    782 const AnnotationItem* GetAnnotationItemFromAnnotationSet(const ClassData& klass,
    783                                                          const AnnotationSetItem* annotation_set,
    784                                                          uint32_t visibility,
    785                                                          Handle<mirror::Class> annotation_class)
    786     REQUIRES_SHARED(Locks::mutator_lock_) {
    787   const DexFile& dex_file = klass.GetDexFile();
    788   for (uint32_t i = 0; i < annotation_set->size_; ++i) {
    789     const AnnotationItem* annotation_item = dex_file.GetAnnotationItem(annotation_set, i);
    790     if (!IsVisibilityCompatible(annotation_item->visibility_, visibility)) {
    791       continue;
    792     }
    793     const uint8_t* annotation = annotation_item->annotation_;
    794     uint32_t type_index = DecodeUnsignedLeb128(&annotation);
    795     ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    796     Thread* self = Thread::Current();
    797     StackHandleScope<2> hs(self);
    798     ObjPtr<mirror::Class> resolved_class = class_linker->ResolveType(
    799         dex::TypeIndex(type_index),
    800         hs.NewHandle(klass.GetDexCache()),
    801         hs.NewHandle(klass.GetClassLoader()));
    802     if (resolved_class == nullptr) {
    803       std::string temp;
    804       LOG(WARNING) << StringPrintf("Unable to resolve %s annotation class %d",
    805                                    klass.GetRealClass()->GetDescriptor(&temp), type_index);
    806       CHECK(self->IsExceptionPending());
    807       self->ClearException();
    808       continue;
    809     }
    810     if (resolved_class == annotation_class.Get()) {
    811       return annotation_item;
    812     }
    813   }
    814 
    815   return nullptr;
    816 }
    817 
    818 ObjPtr<mirror::Object> GetAnnotationObjectFromAnnotationSet(const ClassData& klass,
    819                                                             const AnnotationSetItem* annotation_set,
    820                                                             uint32_t visibility,
    821                                                             Handle<mirror::Class> annotation_class)
    822     REQUIRES_SHARED(Locks::mutator_lock_) {
    823   const AnnotationItem* annotation_item = GetAnnotationItemFromAnnotationSet(
    824       klass, annotation_set, visibility, annotation_class);
    825   if (annotation_item == nullptr) {
    826     return nullptr;
    827   }
    828   const uint8_t* annotation = annotation_item->annotation_;
    829   return ProcessEncodedAnnotation(klass, &annotation);
    830 }
    831 
    832 ObjPtr<mirror::Object> GetAnnotationValue(const ClassData& klass,
    833                                           const AnnotationItem* annotation_item,
    834                                           const char* annotation_name,
    835                                           Handle<mirror::Class> array_class,
    836                                           uint32_t expected_type)
    837     REQUIRES_SHARED(Locks::mutator_lock_) {
    838   const DexFile& dex_file = klass.GetDexFile();
    839   const uint8_t* annotation =
    840       SearchEncodedAnnotation(dex_file, annotation_item->annotation_, annotation_name);
    841   if (annotation == nullptr) {
    842     return nullptr;
    843   }
    844   DexFile::AnnotationValue annotation_value;
    845   bool result = Runtime::Current()->IsActiveTransaction()
    846       ? ProcessAnnotationValue<true>(klass,
    847                                      &annotation,
    848                                      &annotation_value,
    849                                      array_class,
    850                                      DexFile::kAllObjects)
    851       : ProcessAnnotationValue<false>(klass,
    852                                       &annotation,
    853                                       &annotation_value,
    854                                       array_class,
    855                                       DexFile::kAllObjects);
    856   if (!result) {
    857     return nullptr;
    858   }
    859   if (annotation_value.type_ != expected_type) {
    860     return nullptr;
    861   }
    862   return annotation_value.value_.GetL();
    863 }
    864 
    865 static ObjPtr<mirror::ObjectArray<mirror::String>> GetSignatureValue(
    866     const ClassData& klass,
    867     const AnnotationSetItem* annotation_set)
    868     REQUIRES_SHARED(Locks::mutator_lock_) {
    869   const DexFile& dex_file = klass.GetDexFile();
    870   StackHandleScope<1> hs(Thread::Current());
    871   const AnnotationItem* annotation_item =
    872       SearchAnnotationSet(dex_file, annotation_set, "Ldalvik/annotation/Signature;",
    873                           DexFile::kDexVisibilitySystem);
    874   if (annotation_item == nullptr) {
    875     return nullptr;
    876   }
    877   Handle<mirror::Class> string_array_class =
    878       hs.NewHandle(GetClassRoot<mirror::ObjectArray<mirror::String>>());
    879   DCHECK(string_array_class != nullptr);
    880   ObjPtr<mirror::Object> obj =
    881       GetAnnotationValue(klass, annotation_item, "value", string_array_class,
    882                          DexFile::kDexAnnotationArray);
    883   if (obj == nullptr) {
    884     return nullptr;
    885   }
    886   return obj->AsObjectArray<mirror::String>();
    887 }
    888 
    889 ObjPtr<mirror::ObjectArray<mirror::Class>> GetThrowsValue(const ClassData& klass,
    890                                                           const AnnotationSetItem* annotation_set)
    891     REQUIRES_SHARED(Locks::mutator_lock_) {
    892   const DexFile& dex_file = klass.GetDexFile();
    893   const AnnotationItem* annotation_item =
    894       SearchAnnotationSet(dex_file, annotation_set, "Ldalvik/annotation/Throws;",
    895                           DexFile::kDexVisibilitySystem);
    896   if (annotation_item == nullptr) {
    897     return nullptr;
    898   }
    899   StackHandleScope<1> hs(Thread::Current());
    900   Handle<mirror::Class> class_array_class =
    901       hs.NewHandle(GetClassRoot<mirror::ObjectArray<mirror::Class>>());
    902   DCHECK(class_array_class != nullptr);
    903   ObjPtr<mirror::Object> obj =
    904       GetAnnotationValue(klass, annotation_item, "value", class_array_class,
    905                          DexFile::kDexAnnotationArray);
    906   if (obj == nullptr) {
    907     return nullptr;
    908   }
    909   return obj->AsObjectArray<mirror::Class>();
    910 }
    911 
    912 ObjPtr<mirror::ObjectArray<mirror::Object>> ProcessAnnotationSet(
    913     const ClassData& klass,
    914     const AnnotationSetItem* annotation_set,
    915     uint32_t visibility)
    916     REQUIRES_SHARED(Locks::mutator_lock_) {
    917   const DexFile& dex_file = klass.GetDexFile();
    918   Thread* self = Thread::Current();
    919   ScopedObjectAccessUnchecked soa(self);
    920   StackHandleScope<2> hs(self);
    921   Handle<mirror::Class> annotation_array_class(hs.NewHandle(
    922       soa.Decode<mirror::Class>(WellKnownClasses::java_lang_annotation_Annotation__array)));
    923   if (annotation_set == nullptr) {
    924     return mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_array_class.Get(), 0);
    925   }
    926 
    927   uint32_t size = annotation_set->size_;
    928   Handle<mirror::ObjectArray<mirror::Object>> result(hs.NewHandle(
    929       mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_array_class.Get(), size)));
    930   if (result == nullptr) {
    931     return nullptr;
    932   }
    933 
    934   uint32_t dest_index = 0;
    935   for (uint32_t i = 0; i < size; ++i) {
    936     const AnnotationItem* annotation_item = dex_file.GetAnnotationItem(annotation_set, i);
    937     // Note that we do not use IsVisibilityCompatible here because older code
    938     // was correct for this case.
    939     if (annotation_item->visibility_ != visibility) {
    940       continue;
    941     }
    942     const uint8_t* annotation = annotation_item->annotation_;
    943     ObjPtr<mirror::Object> annotation_obj = ProcessEncodedAnnotation(klass, &annotation);
    944     if (annotation_obj != nullptr) {
    945       result->SetWithoutChecks<false>(dest_index, annotation_obj);
    946       ++dest_index;
    947     } else if (self->IsExceptionPending()) {
    948       return nullptr;
    949     }
    950   }
    951 
    952   if (dest_index == size) {
    953     return result.Get();
    954   }
    955 
    956   ObjPtr<mirror::ObjectArray<mirror::Object>> trimmed_result =
    957       mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_array_class.Get(), dest_index);
    958   if (trimmed_result == nullptr) {
    959     return nullptr;
    960   }
    961 
    962   for (uint32_t i = 0; i < dest_index; ++i) {
    963     ObjPtr<mirror::Object> obj = result->GetWithoutChecks(i);
    964     trimmed_result->SetWithoutChecks<false>(i, obj);
    965   }
    966 
    967   return trimmed_result;
    968 }
    969 
    970 ObjPtr<mirror::ObjectArray<mirror::Object>> ProcessAnnotationSetRefList(
    971     const ClassData& klass,
    972     const AnnotationSetRefList* set_ref_list,
    973     uint32_t size)
    974     REQUIRES_SHARED(Locks::mutator_lock_) {
    975   const DexFile& dex_file = klass.GetDexFile();
    976   Thread* self = Thread::Current();
    977   ScopedObjectAccessUnchecked soa(self);
    978   StackHandleScope<1> hs(self);
    979   ObjPtr<mirror::Class> annotation_array_class =
    980       soa.Decode<mirror::Class>(WellKnownClasses::java_lang_annotation_Annotation__array);
    981   ObjPtr<mirror::Class> annotation_array_array_class =
    982       Runtime::Current()->GetClassLinker()->FindArrayClass(self, annotation_array_class);
    983   if (annotation_array_array_class == nullptr) {
    984     return nullptr;
    985   }
    986   Handle<mirror::ObjectArray<mirror::Object>> annotation_array_array(hs.NewHandle(
    987       mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_array_array_class, size)));
    988   if (annotation_array_array == nullptr) {
    989     LOG(ERROR) << "Annotation set ref array allocation failed";
    990     return nullptr;
    991   }
    992   for (uint32_t index = 0; index < size; ++index) {
    993     const AnnotationSetRefItem* set_ref_item = &set_ref_list->list_[index];
    994     const AnnotationSetItem* set_item = dex_file.GetSetRefItemItem(set_ref_item);
    995     ObjPtr<mirror::Object> annotation_set = ProcessAnnotationSet(klass,
    996                                                                  set_item,
    997                                                                  DexFile::kDexVisibilityRuntime);
    998     if (annotation_set == nullptr) {
    999       return nullptr;
   1000     }
   1001     annotation_array_array->SetWithoutChecks<false>(index, annotation_set);
   1002   }
   1003   return annotation_array_array.Get();
   1004 }
   1005 }  // namespace
   1006 
   1007 namespace annotations {
   1008 
   1009 ObjPtr<mirror::Object> GetAnnotationForField(ArtField* field,
   1010                                              Handle<mirror::Class> annotation_class) {
   1011   const AnnotationSetItem* annotation_set = FindAnnotationSetForField(field);
   1012   if (annotation_set == nullptr) {
   1013     return nullptr;
   1014   }
   1015   StackHandleScope<1> hs(Thread::Current());
   1016   const ClassData field_class(hs, field);
   1017   return GetAnnotationObjectFromAnnotationSet(field_class,
   1018                                               annotation_set,
   1019                                               DexFile::kDexVisibilityRuntime,
   1020                                               annotation_class);
   1021 }
   1022 
   1023 ObjPtr<mirror::ObjectArray<mirror::Object>> GetAnnotationsForField(ArtField* field) {
   1024   const AnnotationSetItem* annotation_set = FindAnnotationSetForField(field);
   1025   StackHandleScope<1> hs(Thread::Current());
   1026   const ClassData field_class(hs, field);
   1027   return ProcessAnnotationSet(field_class, annotation_set, DexFile::kDexVisibilityRuntime);
   1028 }
   1029 
   1030 ObjPtr<mirror::ObjectArray<mirror::String>> GetSignatureAnnotationForField(ArtField* field) {
   1031   const AnnotationSetItem* annotation_set = FindAnnotationSetForField(field);
   1032   if (annotation_set == nullptr) {
   1033     return nullptr;
   1034   }
   1035   StackHandleScope<1> hs(Thread::Current());
   1036   const ClassData field_class(hs, field);
   1037   return GetSignatureValue(field_class, annotation_set);
   1038 }
   1039 
   1040 bool IsFieldAnnotationPresent(ArtField* field, Handle<mirror::Class> annotation_class) {
   1041   const AnnotationSetItem* annotation_set = FindAnnotationSetForField(field);
   1042   if (annotation_set == nullptr) {
   1043     return false;
   1044   }
   1045   StackHandleScope<1> hs(Thread::Current());
   1046   const ClassData field_class(hs, field);
   1047   const AnnotationItem* annotation_item = GetAnnotationItemFromAnnotationSet(
   1048       field_class, annotation_set, DexFile::kDexVisibilityRuntime, annotation_class);
   1049   return annotation_item != nullptr;
   1050 }
   1051 
   1052 ObjPtr<mirror::Object> GetAnnotationDefaultValue(ArtMethod* method) {
   1053   const ClassData klass(method);
   1054   const DexFile* dex_file = &klass.GetDexFile();
   1055   const AnnotationsDirectoryItem* annotations_dir =
   1056       dex_file->GetAnnotationsDirectory(*klass.GetClassDef());
   1057   if (annotations_dir == nullptr) {
   1058     return nullptr;
   1059   }
   1060   const AnnotationSetItem* annotation_set =
   1061       dex_file->GetClassAnnotationSet(annotations_dir);
   1062   if (annotation_set == nullptr) {
   1063     return nullptr;
   1064   }
   1065   const AnnotationItem* annotation_item = SearchAnnotationSet(*dex_file, annotation_set,
   1066       "Ldalvik/annotation/AnnotationDefault;", DexFile::kDexVisibilitySystem);
   1067   if (annotation_item == nullptr) {
   1068     return nullptr;
   1069   }
   1070   const uint8_t* annotation =
   1071       SearchEncodedAnnotation(*dex_file, annotation_item->annotation_, "value");
   1072   if (annotation == nullptr) {
   1073     return nullptr;
   1074   }
   1075   uint8_t header_byte = *(annotation++);
   1076   if ((header_byte & DexFile::kDexAnnotationValueTypeMask) != DexFile::kDexAnnotationAnnotation) {
   1077     return nullptr;
   1078   }
   1079   annotation = SearchEncodedAnnotation(*dex_file, annotation, method->GetName());
   1080   if (annotation == nullptr) {
   1081     return nullptr;
   1082   }
   1083   DexFile::AnnotationValue annotation_value;
   1084   StackHandleScope<1> hs(Thread::Current());
   1085   Handle<mirror::Class> return_type(hs.NewHandle(method->ResolveReturnType()));
   1086   if (!ProcessAnnotationValue<false>(klass,
   1087                                      &annotation,
   1088                                      &annotation_value,
   1089                                      return_type,
   1090                                      DexFile::kAllObjects)) {
   1091     return nullptr;
   1092   }
   1093   return annotation_value.value_.GetL();
   1094 }
   1095 
   1096 ObjPtr<mirror::Object> GetAnnotationForMethod(ArtMethod* method,
   1097                                               Handle<mirror::Class> annotation_class) {
   1098   const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
   1099   if (annotation_set == nullptr) {
   1100     return nullptr;
   1101   }
   1102   return GetAnnotationObjectFromAnnotationSet(ClassData(method), annotation_set,
   1103                                               DexFile::kDexVisibilityRuntime, annotation_class);
   1104 }
   1105 
   1106 ObjPtr<mirror::ObjectArray<mirror::Object>> GetAnnotationsForMethod(ArtMethod* method) {
   1107   const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
   1108   return ProcessAnnotationSet(ClassData(method),
   1109                               annotation_set,
   1110                               DexFile::kDexVisibilityRuntime);
   1111 }
   1112 
   1113 ObjPtr<mirror::ObjectArray<mirror::Class>> GetExceptionTypesForMethod(ArtMethod* method) {
   1114   const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
   1115   if (annotation_set == nullptr) {
   1116     return nullptr;
   1117   }
   1118   return GetThrowsValue(ClassData(method), annotation_set);
   1119 }
   1120 
   1121 ObjPtr<mirror::ObjectArray<mirror::Object>> GetParameterAnnotations(ArtMethod* method) {
   1122   const DexFile* dex_file = method->GetDexFile();
   1123   const ParameterAnnotationsItem* parameter_annotations =
   1124       FindAnnotationsItemForMethod(method);
   1125   if (parameter_annotations == nullptr) {
   1126     return nullptr;
   1127   }
   1128   const AnnotationSetRefList* set_ref_list =
   1129       dex_file->GetParameterAnnotationSetRefList(parameter_annotations);
   1130   if (set_ref_list == nullptr) {
   1131     return nullptr;
   1132   }
   1133   uint32_t size = set_ref_list->size_;
   1134   return ProcessAnnotationSetRefList(ClassData(method), set_ref_list, size);
   1135 }
   1136 
   1137 uint32_t GetNumberOfAnnotatedMethodParameters(ArtMethod* method) {
   1138   const DexFile* dex_file = method->GetDexFile();
   1139   const ParameterAnnotationsItem* parameter_annotations =
   1140       FindAnnotationsItemForMethod(method);
   1141   if (parameter_annotations == nullptr) {
   1142     return 0u;
   1143   }
   1144   const AnnotationSetRefList* set_ref_list =
   1145       dex_file->GetParameterAnnotationSetRefList(parameter_annotations);
   1146   if (set_ref_list == nullptr) {
   1147     return 0u;
   1148   }
   1149   return set_ref_list->size_;
   1150 }
   1151 
   1152 ObjPtr<mirror::Object> GetAnnotationForMethodParameter(ArtMethod* method,
   1153                                                        uint32_t parameter_idx,
   1154                                                        Handle<mirror::Class> annotation_class) {
   1155   const DexFile* dex_file = method->GetDexFile();
   1156   const ParameterAnnotationsItem* parameter_annotations = FindAnnotationsItemForMethod(method);
   1157   if (parameter_annotations == nullptr) {
   1158     return nullptr;
   1159   }
   1160   const AnnotationSetRefList* set_ref_list =
   1161       dex_file->GetParameterAnnotationSetRefList(parameter_annotations);
   1162   if (set_ref_list == nullptr) {
   1163     return nullptr;
   1164   }
   1165   if (parameter_idx >= set_ref_list->size_) {
   1166     return nullptr;
   1167   }
   1168   const AnnotationSetRefItem* annotation_set_ref = &set_ref_list->list_[parameter_idx];
   1169   const AnnotationSetItem* annotation_set =
   1170      dex_file->GetSetRefItemItem(annotation_set_ref);
   1171   if (annotation_set == nullptr) {
   1172     return nullptr;
   1173   }
   1174   return GetAnnotationObjectFromAnnotationSet(ClassData(method),
   1175                                               annotation_set,
   1176                                               DexFile::kDexVisibilityRuntime,
   1177                                               annotation_class);
   1178 }
   1179 
   1180 bool GetParametersMetadataForMethod(
   1181     ArtMethod* method,
   1182     /*out*/ MutableHandle<mirror::ObjectArray<mirror::String>>* names,
   1183     /*out*/ MutableHandle<mirror::IntArray>* access_flags) {
   1184   const AnnotationSetItem* annotation_set =
   1185       FindAnnotationSetForMethod(method);
   1186   if (annotation_set == nullptr) {
   1187     return false;
   1188   }
   1189 
   1190   const DexFile* dex_file = method->GetDexFile();
   1191   const AnnotationItem* annotation_item =
   1192       SearchAnnotationSet(*dex_file,
   1193                           annotation_set,
   1194                           "Ldalvik/annotation/MethodParameters;",
   1195                           DexFile::kDexVisibilitySystem);
   1196   if (annotation_item == nullptr) {
   1197     return false;
   1198   }
   1199 
   1200   StackHandleScope<4> hs(Thread::Current());
   1201 
   1202   // Extract the parameters' names String[].
   1203   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
   1204   Handle<mirror::Class> string_array_class =
   1205       hs.NewHandle(GetClassRoot<mirror::ObjectArray<mirror::String>>(class_linker));
   1206   DCHECK(string_array_class != nullptr);
   1207 
   1208   ClassData data(method);
   1209   Handle<mirror::Object> names_obj =
   1210       hs.NewHandle(GetAnnotationValue(data,
   1211                                       annotation_item,
   1212                                       "names",
   1213                                       string_array_class,
   1214                                       DexFile::kDexAnnotationArray));
   1215   if (names_obj == nullptr) {
   1216     return false;
   1217   }
   1218 
   1219   // Extract the parameters' access flags int[].
   1220   Handle<mirror::Class> int_array_class(hs.NewHandle(GetClassRoot<mirror::IntArray>(class_linker)));
   1221   DCHECK(int_array_class != nullptr);
   1222   Handle<mirror::Object> access_flags_obj =
   1223       hs.NewHandle(GetAnnotationValue(data,
   1224                                       annotation_item,
   1225                                       "accessFlags",
   1226                                       int_array_class,
   1227                                       DexFile::kDexAnnotationArray));
   1228   if (access_flags_obj == nullptr) {
   1229     return false;
   1230   }
   1231 
   1232   names->Assign(names_obj->AsObjectArray<mirror::String>());
   1233   access_flags->Assign(access_flags_obj->AsIntArray());
   1234   return true;
   1235 }
   1236 
   1237 ObjPtr<mirror::ObjectArray<mirror::String>> GetSignatureAnnotationForMethod(ArtMethod* method) {
   1238   const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
   1239   if (annotation_set == nullptr) {
   1240     return nullptr;
   1241   }
   1242   return GetSignatureValue(ClassData(method), annotation_set);
   1243 }
   1244 
   1245 bool IsMethodAnnotationPresent(ArtMethod* method,
   1246                                Handle<mirror::Class> annotation_class,
   1247                                uint32_t visibility /* = DexFile::kDexVisibilityRuntime */) {
   1248   const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
   1249   if (annotation_set == nullptr) {
   1250     return false;
   1251   }
   1252   const AnnotationItem* annotation_item = GetAnnotationItemFromAnnotationSet(
   1253       ClassData(method), annotation_set, visibility, annotation_class);
   1254   return annotation_item != nullptr;
   1255 }
   1256 
   1257 static void DCheckNativeAnnotation(const char* descriptor, jclass cls) {
   1258   if (kIsDebugBuild) {
   1259     ScopedObjectAccess soa(Thread::Current());
   1260     ObjPtr<mirror::Class> klass = soa.Decode<mirror::Class>(cls);
   1261     ClassLinker* linker = Runtime::Current()->GetClassLinker();
   1262     // WellKnownClasses may not be initialized yet, so `klass` may be null.
   1263     if (klass != nullptr) {
   1264       // Lookup using the boot class path loader should yield the annotation class.
   1265       CHECK_EQ(klass, linker->LookupClass(soa.Self(), descriptor, /* class_loader= */ nullptr));
   1266     }
   1267   }
   1268 }
   1269 
   1270 // Check whether a method from the `dex_file` with the given `annotation_set`
   1271 // is annotated with `annotation_descriptor` with build visibility.
   1272 static bool IsMethodBuildAnnotationPresent(const DexFile& dex_file,
   1273                                            const AnnotationSetItem& annotation_set,
   1274                                            const char* annotation_descriptor,
   1275                                            jclass annotation_class) {
   1276   for (uint32_t i = 0; i < annotation_set.size_; ++i) {
   1277     const AnnotationItem* annotation_item = dex_file.GetAnnotationItem(&annotation_set, i);
   1278     if (!IsVisibilityCompatible(annotation_item->visibility_, DexFile::kDexVisibilityBuild)) {
   1279       continue;
   1280     }
   1281     const uint8_t* annotation = annotation_item->annotation_;
   1282     uint32_t type_index = DecodeUnsignedLeb128(&annotation);
   1283     const char* descriptor = dex_file.StringByTypeIdx(dex::TypeIndex(type_index));
   1284     if (strcmp(descriptor, annotation_descriptor) == 0) {
   1285       DCheckNativeAnnotation(descriptor, annotation_class);
   1286       return true;
   1287     }
   1288   }
   1289   return false;
   1290 }
   1291 
   1292 uint32_t GetNativeMethodAnnotationAccessFlags(const DexFile& dex_file,
   1293                                               const dex::ClassDef& class_def,
   1294                                               uint32_t method_index) {
   1295   const dex::AnnotationSetItem* annotation_set =
   1296       FindAnnotationSetForMethod(dex_file, class_def, method_index);
   1297   if (annotation_set == nullptr) {
   1298     return 0u;
   1299   }
   1300   uint32_t access_flags = 0u;
   1301   if (IsMethodBuildAnnotationPresent(
   1302           dex_file,
   1303           *annotation_set,
   1304           "Ldalvik/annotation/optimization/FastNative;",
   1305           WellKnownClasses::dalvik_annotation_optimization_FastNative)) {
   1306     access_flags |= kAccFastNative;
   1307   }
   1308   if (IsMethodBuildAnnotationPresent(
   1309           dex_file,
   1310           *annotation_set,
   1311           "Ldalvik/annotation/optimization/CriticalNative;",
   1312           WellKnownClasses::dalvik_annotation_optimization_CriticalNative)) {
   1313     access_flags |= kAccCriticalNative;
   1314   }
   1315   CHECK_NE(access_flags, kAccFastNative | kAccCriticalNative);
   1316   return access_flags;
   1317 }
   1318 
   1319 bool FieldIsReachabilitySensitive(const DexFile& dex_file,
   1320                                   const dex::ClassDef& class_def,
   1321                                   uint32_t field_index)
   1322     REQUIRES_SHARED(Locks::mutator_lock_) {
   1323   const AnnotationSetItem* annotation_set =
   1324       FindAnnotationSetForField(dex_file, class_def, field_index);
   1325   if (annotation_set == nullptr) {
   1326     return false;
   1327   }
   1328   const AnnotationItem* annotation_item = SearchAnnotationSet(dex_file, annotation_set,
   1329       "Ldalvik/annotation/optimization/ReachabilitySensitive;", DexFile::kDexVisibilityRuntime);
   1330   // TODO: We're missing the equivalent of DCheckNativeAnnotation (not a DCHECK). Does it matter?
   1331   return annotation_item != nullptr;
   1332 }
   1333 
   1334 bool MethodIsReachabilitySensitive(const DexFile& dex_file,
   1335                                    const dex::ClassDef& class_def,
   1336                                    uint32_t method_index)
   1337     REQUIRES_SHARED(Locks::mutator_lock_) {
   1338   const AnnotationSetItem* annotation_set =
   1339       FindAnnotationSetForMethod(dex_file, class_def, method_index);
   1340   if (annotation_set == nullptr) {
   1341     return false;
   1342   }
   1343   const AnnotationItem* annotation_item = SearchAnnotationSet(dex_file, annotation_set,
   1344       "Ldalvik/annotation/optimization/ReachabilitySensitive;", DexFile::kDexVisibilityRuntime);
   1345   return annotation_item != nullptr;
   1346 }
   1347 
   1348 static bool MethodIsReachabilitySensitive(const DexFile& dex_file,
   1349                                                uint32_t method_index)
   1350     REQUIRES_SHARED(Locks::mutator_lock_) {
   1351   DCHECK(method_index < dex_file.NumMethodIds());
   1352   const dex::MethodId& method_id = dex_file.GetMethodId(method_index);
   1353   dex::TypeIndex class_index = method_id.class_idx_;
   1354   const dex::ClassDef * class_def = dex_file.FindClassDef(class_index);
   1355   return class_def != nullptr
   1356          && MethodIsReachabilitySensitive(dex_file, *class_def, method_index);
   1357 }
   1358 
   1359 bool MethodContainsRSensitiveAccess(const DexFile& dex_file,
   1360                                     const dex::ClassDef& class_def,
   1361                                     uint32_t method_index)
   1362     REQUIRES_SHARED(Locks::mutator_lock_) {
   1363   // TODO: This is too slow to run very regularly. Currently this is only invoked in the
   1364   // presence of @DeadReferenceSafe, which will be rare. In the long run, we need to quickly
   1365   // check once whether a class has any @ReachabilitySensitive annotations. If not, we can
   1366   // immediately return false here for any method in that class.
   1367   uint32_t code_item_offset = dex_file.FindCodeItemOffset(class_def, method_index);
   1368   const dex::CodeItem* code_item = dex_file.GetCodeItem(code_item_offset);
   1369   CodeItemInstructionAccessor accessor(dex_file, code_item);
   1370   if (!accessor.HasCodeItem()) {
   1371     return false;
   1372   }
   1373   ArrayRef<const uint8_t> quicken_data;
   1374   const OatDexFile* oat_dex_file = dex_file.GetOatDexFile();
   1375   if (oat_dex_file != nullptr) {
   1376     quicken_data = oat_dex_file->GetQuickenedInfoOf(dex_file, method_index);
   1377   }
   1378   const QuickenInfoTable quicken_info(quicken_data);
   1379   uint32_t quicken_index = 0;
   1380   for (DexInstructionIterator iter = accessor.begin(); iter != accessor.end(); ++iter) {
   1381     switch (iter->Opcode()) {
   1382       case Instruction::IGET:
   1383       case Instruction::IGET_QUICK:
   1384       case Instruction::IGET_WIDE:
   1385       case Instruction::IGET_WIDE_QUICK:
   1386       case Instruction::IGET_OBJECT:
   1387       case Instruction::IGET_OBJECT_QUICK:
   1388       case Instruction::IGET_BOOLEAN:
   1389       case Instruction::IGET_BOOLEAN_QUICK:
   1390       case Instruction::IGET_BYTE:
   1391       case Instruction::IGET_BYTE_QUICK:
   1392       case Instruction::IGET_CHAR:
   1393       case Instruction::IGET_CHAR_QUICK:
   1394       case Instruction::IGET_SHORT:
   1395       case Instruction::IGET_SHORT_QUICK:
   1396       case Instruction::IPUT:
   1397       case Instruction::IPUT_QUICK:
   1398       case Instruction::IPUT_WIDE:
   1399       case Instruction::IPUT_WIDE_QUICK:
   1400       case Instruction::IPUT_OBJECT:
   1401       case Instruction::IPUT_OBJECT_QUICK:
   1402       case Instruction::IPUT_BOOLEAN:
   1403       case Instruction::IPUT_BOOLEAN_QUICK:
   1404       case Instruction::IPUT_BYTE:
   1405       case Instruction::IPUT_BYTE_QUICK:
   1406       case Instruction::IPUT_CHAR:
   1407       case Instruction::IPUT_CHAR_QUICK:
   1408       case Instruction::IPUT_SHORT:
   1409       case Instruction::IPUT_SHORT_QUICK:
   1410         {
   1411           uint32_t field_index;
   1412           if (iter->IsQuickened()) {
   1413             field_index = quicken_info.GetData(quicken_index);
   1414           } else {
   1415             field_index = iter->VRegC_22c();
   1416           }
   1417           DCHECK(field_index < dex_file.NumFieldIds());
   1418           // We only guarantee to pay attention to the annotation if it's in the same class,
   1419           // or a containing class, but it's OK to do so in other cases.
   1420           const dex::FieldId& field_id = dex_file.GetFieldId(field_index);
   1421           dex::TypeIndex class_index = field_id.class_idx_;
   1422           const dex::ClassDef * field_class_def = dex_file.FindClassDef(class_index);
   1423           // We do not handle the case in which the field is declared in a superclass, and
   1424           // don't claim to do so. The annotated field should normally be private.
   1425           if (field_class_def != nullptr
   1426               && FieldIsReachabilitySensitive(dex_file, *field_class_def, field_index)) {
   1427             return true;
   1428           }
   1429         }
   1430         break;
   1431       case Instruction::INVOKE_SUPER:
   1432         // Cannot call method in same class. TODO: Try an explicit superclass lookup for
   1433         // better "best effort"?
   1434         break;
   1435       case Instruction::INVOKE_INTERFACE:
   1436         // We handle an interface call just like a virtual call. We will find annotations
   1437         // on interface methods/fields visible to us, but not of the annotation is in a
   1438         // super-interface. Again, we could just ignore it.
   1439       case Instruction::INVOKE_VIRTUAL:
   1440       case Instruction::INVOKE_DIRECT:
   1441         {
   1442           uint32_t called_method_index = iter->VRegB_35c();
   1443           if (MethodIsReachabilitySensitive(dex_file, called_method_index)) {
   1444             return true;
   1445           }
   1446         }
   1447         break;
   1448       case Instruction::INVOKE_INTERFACE_RANGE:
   1449       case Instruction::INVOKE_VIRTUAL_RANGE:
   1450       case Instruction::INVOKE_DIRECT_RANGE:
   1451         {
   1452           uint32_t called_method_index = iter->VRegB_3rc();
   1453           if (MethodIsReachabilitySensitive(dex_file, called_method_index)) {
   1454             return true;
   1455           }
   1456         }
   1457         break;
   1458       case Instruction::INVOKE_VIRTUAL_QUICK:
   1459       case Instruction::INVOKE_VIRTUAL_RANGE_QUICK:
   1460         {
   1461           uint32_t called_method_index = quicken_info.GetData(quicken_index);
   1462           if (MethodIsReachabilitySensitive(dex_file, called_method_index)) {
   1463             return true;
   1464           }
   1465         }
   1466         break;
   1467         // We explicitly do not handle indirect ReachabilitySensitive accesses through VarHandles,
   1468         // etc. Thus we ignore INVOKE_CUSTOM / INVOKE_CUSTOM_RANGE / INVOKE_POLYMORPHIC /
   1469         // INVOKE_POLYMORPHIC_RANGE.
   1470       default:
   1471         // There is no way to add an annotation to array elements, and so far we've encountered no
   1472         // need for that, so we ignore AGET and APUT.
   1473         // It's impractical or impossible to garbage collect a class while one of its methods is
   1474         // on the call stack. We allow ReachabilitySensitive annotations on static methods and
   1475         // fields, but they can be safely ignored.
   1476         break;
   1477     }
   1478     if (QuickenInfoTable::NeedsIndexForInstruction(&iter.Inst())) {
   1479       ++quicken_index;
   1480     }
   1481   }
   1482   return false;
   1483 }
   1484 
   1485 bool HasDeadReferenceSafeAnnotation(const DexFile& dex_file,
   1486                                     const dex::ClassDef& class_def)
   1487   // TODO: This should check outer classes as well.
   1488   // It's conservatively correct not to do so.
   1489     REQUIRES_SHARED(Locks::mutator_lock_) {
   1490   const AnnotationsDirectoryItem* annotations_dir =
   1491       dex_file.GetAnnotationsDirectory(class_def);
   1492   if (annotations_dir == nullptr) {
   1493     return false;
   1494   }
   1495   const AnnotationSetItem* annotation_set = dex_file.GetClassAnnotationSet(annotations_dir);
   1496   if (annotation_set == nullptr) {
   1497     return false;
   1498   }
   1499   const AnnotationItem* annotation_item = SearchAnnotationSet(dex_file, annotation_set,
   1500       "Ldalvik/annotation/optimization/DeadReferenceSafe;", DexFile::kDexVisibilityRuntime);
   1501   return annotation_item != nullptr;
   1502 }
   1503 
   1504 ObjPtr<mirror::Object> GetAnnotationForClass(Handle<mirror::Class> klass,
   1505                                              Handle<mirror::Class> annotation_class) {
   1506   ClassData data(klass);
   1507   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1508   if (annotation_set == nullptr) {
   1509     return nullptr;
   1510   }
   1511   return GetAnnotationObjectFromAnnotationSet(data,
   1512                                               annotation_set,
   1513                                               DexFile::kDexVisibilityRuntime,
   1514                                               annotation_class);
   1515 }
   1516 
   1517 ObjPtr<mirror::ObjectArray<mirror::Object>> GetAnnotationsForClass(Handle<mirror::Class> klass) {
   1518   ClassData data(klass);
   1519   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1520   return ProcessAnnotationSet(data, annotation_set, DexFile::kDexVisibilityRuntime);
   1521 }
   1522 
   1523 ObjPtr<mirror::ObjectArray<mirror::Class>> GetDeclaredClasses(Handle<mirror::Class> klass) {
   1524   ClassData data(klass);
   1525   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1526   if (annotation_set == nullptr) {
   1527     return nullptr;
   1528   }
   1529   const AnnotationItem* annotation_item =
   1530       SearchAnnotationSet(data.GetDexFile(), annotation_set, "Ldalvik/annotation/MemberClasses;",
   1531                           DexFile::kDexVisibilitySystem);
   1532   if (annotation_item == nullptr) {
   1533     return nullptr;
   1534   }
   1535   StackHandleScope<1> hs(Thread::Current());
   1536   Handle<mirror::Class> class_array_class =
   1537       hs.NewHandle(GetClassRoot<mirror::ObjectArray<mirror::Class>>());
   1538   DCHECK(class_array_class != nullptr);
   1539   ObjPtr<mirror::Object> obj =
   1540       GetAnnotationValue(data, annotation_item, "value", class_array_class,
   1541                          DexFile::kDexAnnotationArray);
   1542   if (obj == nullptr) {
   1543     return nullptr;
   1544   }
   1545   return obj->AsObjectArray<mirror::Class>();
   1546 }
   1547 
   1548 ObjPtr<mirror::Class> GetDeclaringClass(Handle<mirror::Class> klass) {
   1549   ClassData data(klass);
   1550   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1551   if (annotation_set == nullptr) {
   1552     return nullptr;
   1553   }
   1554   const AnnotationItem* annotation_item =
   1555       SearchAnnotationSet(data.GetDexFile(), annotation_set, "Ldalvik/annotation/EnclosingClass;",
   1556                           DexFile::kDexVisibilitySystem);
   1557   if (annotation_item == nullptr) {
   1558     return nullptr;
   1559   }
   1560   ObjPtr<mirror::Object> obj = GetAnnotationValue(data,
   1561                                                   annotation_item,
   1562                                                   "value",
   1563                                                   ScopedNullHandle<mirror::Class>(),
   1564                                                   DexFile::kDexAnnotationType);
   1565   if (obj == nullptr) {
   1566     return nullptr;
   1567   }
   1568   return obj->AsClass();
   1569 }
   1570 
   1571 ObjPtr<mirror::Class> GetEnclosingClass(Handle<mirror::Class> klass) {
   1572   ObjPtr<mirror::Class> declaring_class = GetDeclaringClass(klass);
   1573   if (declaring_class != nullptr) {
   1574     return declaring_class;
   1575   }
   1576   ClassData data(klass);
   1577   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1578   if (annotation_set == nullptr) {
   1579     return nullptr;
   1580   }
   1581   const AnnotationItem* annotation_item =
   1582       SearchAnnotationSet(data.GetDexFile(),
   1583                           annotation_set,
   1584                           "Ldalvik/annotation/EnclosingMethod;",
   1585                           DexFile::kDexVisibilitySystem);
   1586   if (annotation_item == nullptr) {
   1587     return nullptr;
   1588   }
   1589   const uint8_t* annotation =
   1590       SearchEncodedAnnotation(data.GetDexFile(), annotation_item->annotation_, "value");
   1591   if (annotation == nullptr) {
   1592     return nullptr;
   1593   }
   1594   DexFile::AnnotationValue annotation_value;
   1595   if (!ProcessAnnotationValue<false>(data,
   1596                                      &annotation,
   1597                                      &annotation_value,
   1598                                      ScopedNullHandle<mirror::Class>(),
   1599                                      DexFile::kAllRaw)) {
   1600     return nullptr;
   1601   }
   1602   if (annotation_value.type_ != DexFile::kDexAnnotationMethod) {
   1603     return nullptr;
   1604   }
   1605   StackHandleScope<2> hs(Thread::Current());
   1606   ArtMethod* method = Runtime::Current()->GetClassLinker()->ResolveMethodWithoutInvokeType(
   1607       annotation_value.value_.GetI(),
   1608       hs.NewHandle(data.GetDexCache()),
   1609       hs.NewHandle(data.GetClassLoader()));
   1610   if (method == nullptr) {
   1611     return nullptr;
   1612   }
   1613   return method->GetDeclaringClass();
   1614 }
   1615 
   1616 ObjPtr<mirror::Object> GetEnclosingMethod(Handle<mirror::Class> klass) {
   1617   ClassData data(klass);
   1618   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1619   if (annotation_set == nullptr) {
   1620     return nullptr;
   1621   }
   1622   const AnnotationItem* annotation_item =
   1623       SearchAnnotationSet(data.GetDexFile(),
   1624                           annotation_set,
   1625                           "Ldalvik/annotation/EnclosingMethod;",
   1626                           DexFile::kDexVisibilitySystem);
   1627   if (annotation_item == nullptr) {
   1628     return nullptr;
   1629   }
   1630   return GetAnnotationValue(data, annotation_item, "value", ScopedNullHandle<mirror::Class>(),
   1631       DexFile::kDexAnnotationMethod);
   1632 }
   1633 
   1634 bool GetInnerClass(Handle<mirror::Class> klass, /*out*/ ObjPtr<mirror::String>* name) {
   1635   ClassData data(klass);
   1636   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1637   if (annotation_set == nullptr) {
   1638     return false;
   1639   }
   1640   const AnnotationItem* annotation_item = SearchAnnotationSet(
   1641       data.GetDexFile(),
   1642       annotation_set,
   1643       "Ldalvik/annotation/InnerClass;",
   1644       DexFile::kDexVisibilitySystem);
   1645   if (annotation_item == nullptr) {
   1646     return false;
   1647   }
   1648   const uint8_t* annotation =
   1649       SearchEncodedAnnotation(data.GetDexFile(), annotation_item->annotation_, "name");
   1650   if (annotation == nullptr) {
   1651     return false;
   1652   }
   1653   DexFile::AnnotationValue annotation_value;
   1654   if (!ProcessAnnotationValue<false>(data,
   1655                                      &annotation,
   1656                                      &annotation_value,
   1657                                      ScopedNullHandle<mirror::Class>(),
   1658                                      DexFile::kAllObjects)) {
   1659     return false;
   1660   }
   1661   if (annotation_value.type_ != DexFile::kDexAnnotationNull &&
   1662       annotation_value.type_ != DexFile::kDexAnnotationString) {
   1663     return false;
   1664   }
   1665   *name = down_cast<mirror::String*>(annotation_value.value_.GetL());
   1666   return true;
   1667 }
   1668 
   1669 bool GetInnerClassFlags(Handle<mirror::Class> klass, uint32_t* flags) {
   1670   ClassData data(klass);
   1671   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1672   if (annotation_set == nullptr) {
   1673     return false;
   1674   }
   1675   const AnnotationItem* annotation_item =
   1676       SearchAnnotationSet(data.GetDexFile(), annotation_set, "Ldalvik/annotation/InnerClass;",
   1677                           DexFile::kDexVisibilitySystem);
   1678   if (annotation_item == nullptr) {
   1679     return false;
   1680   }
   1681   const uint8_t* annotation =
   1682       SearchEncodedAnnotation(data.GetDexFile(), annotation_item->annotation_, "accessFlags");
   1683   if (annotation == nullptr) {
   1684     return false;
   1685   }
   1686   DexFile::AnnotationValue annotation_value;
   1687   if (!ProcessAnnotationValue<false>(data,
   1688                                      &annotation,
   1689                                      &annotation_value,
   1690                                      ScopedNullHandle<mirror::Class>(),
   1691                                      DexFile::kAllRaw)) {
   1692     return false;
   1693   }
   1694   if (annotation_value.type_ != DexFile::kDexAnnotationInt) {
   1695     return false;
   1696   }
   1697   *flags = annotation_value.value_.GetI();
   1698   return true;
   1699 }
   1700 
   1701 ObjPtr<mirror::ObjectArray<mirror::String>> GetSignatureAnnotationForClass(
   1702     Handle<mirror::Class> klass) {
   1703   ClassData data(klass);
   1704   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1705   if (annotation_set == nullptr) {
   1706     return nullptr;
   1707   }
   1708   return GetSignatureValue(data, annotation_set);
   1709 }
   1710 
   1711 const char* GetSourceDebugExtension(Handle<mirror::Class> klass) {
   1712   // Before instantiating ClassData, check that klass has a DexCache
   1713   // assigned.  The ClassData constructor indirectly dereferences it
   1714   // when calling klass->GetDexFile().
   1715   if (klass->GetDexCache() == nullptr) {
   1716     DCHECK(klass->IsPrimitive() || klass->IsArrayClass());
   1717     return nullptr;
   1718   }
   1719 
   1720   ClassData data(klass);
   1721   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1722   if (annotation_set == nullptr) {
   1723     return nullptr;
   1724   }
   1725 
   1726   const AnnotationItem* annotation_item = SearchAnnotationSet(
   1727       data.GetDexFile(),
   1728       annotation_set,
   1729       "Ldalvik/annotation/SourceDebugExtension;",
   1730       DexFile::kDexVisibilitySystem);
   1731   if (annotation_item == nullptr) {
   1732     return nullptr;
   1733   }
   1734 
   1735   const uint8_t* annotation =
   1736       SearchEncodedAnnotation(data.GetDexFile(), annotation_item->annotation_, "value");
   1737   if (annotation == nullptr) {
   1738     return nullptr;
   1739   }
   1740   DexFile::AnnotationValue annotation_value;
   1741   if (!ProcessAnnotationValue<false>(data,
   1742                                      &annotation,
   1743                                      &annotation_value,
   1744                                      ScopedNullHandle<mirror::Class>(),
   1745                                      DexFile::kAllRaw)) {
   1746     return nullptr;
   1747   }
   1748   if (annotation_value.type_ != DexFile::kDexAnnotationString) {
   1749     return nullptr;
   1750   }
   1751   dex::StringIndex index(static_cast<uint32_t>(annotation_value.value_.GetI()));
   1752   return data.GetDexFile().StringDataByIdx(index);
   1753 }
   1754 
   1755 bool IsClassAnnotationPresent(Handle<mirror::Class> klass, Handle<mirror::Class> annotation_class) {
   1756   ClassData data(klass);
   1757   const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(data);
   1758   if (annotation_set == nullptr) {
   1759     return false;
   1760   }
   1761   const AnnotationItem* annotation_item = GetAnnotationItemFromAnnotationSet(
   1762       data, annotation_set, DexFile::kDexVisibilityRuntime, annotation_class);
   1763   return annotation_item != nullptr;
   1764 }
   1765 
   1766 int32_t GetLineNumFromPC(const DexFile* dex_file, ArtMethod* method, uint32_t rel_pc) {
   1767   // For native method, lineno should be -2 to indicate it is native. Note that
   1768   // "line number == -2" is how libcore tells from StackTraceElement.
   1769   if (method->GetCodeItemOffset() == 0) {
   1770     return -2;
   1771   }
   1772 
   1773   CodeItemDebugInfoAccessor accessor(method->DexInstructionDebugInfo());
   1774   DCHECK(accessor.HasCodeItem()) << method->PrettyMethod() << " " << dex_file->GetLocation();
   1775 
   1776   // A method with no line number info should return -1
   1777   uint32_t line_num = -1;
   1778   accessor.GetLineNumForPc(rel_pc, &line_num);
   1779   return line_num;
   1780 }
   1781 
   1782 template<bool kTransactionActive>
   1783 void RuntimeEncodedStaticFieldValueIterator::ReadValueToField(ArtField* field) const {
   1784   DCHECK(dex_cache_ != nullptr);
   1785   switch (type_) {
   1786     case kBoolean: field->SetBoolean<kTransactionActive>(field->GetDeclaringClass(), jval_.z);
   1787         break;
   1788     case kByte:    field->SetByte<kTransactionActive>(field->GetDeclaringClass(), jval_.b); break;
   1789     case kShort:   field->SetShort<kTransactionActive>(field->GetDeclaringClass(), jval_.s); break;
   1790     case kChar:    field->SetChar<kTransactionActive>(field->GetDeclaringClass(), jval_.c); break;
   1791     case kInt:     field->SetInt<kTransactionActive>(field->GetDeclaringClass(), jval_.i); break;
   1792     case kLong:    field->SetLong<kTransactionActive>(field->GetDeclaringClass(), jval_.j); break;
   1793     case kFloat:   field->SetFloat<kTransactionActive>(field->GetDeclaringClass(), jval_.f); break;
   1794     case kDouble:  field->SetDouble<kTransactionActive>(field->GetDeclaringClass(), jval_.d); break;
   1795     case kNull:    field->SetObject<kTransactionActive>(field->GetDeclaringClass(), nullptr); break;
   1796     case kString: {
   1797       ObjPtr<mirror::String> resolved = linker_->ResolveString(dex::StringIndex(jval_.i),
   1798                                                                dex_cache_);
   1799       field->SetObject<kTransactionActive>(field->GetDeclaringClass(), resolved);
   1800       break;
   1801     }
   1802     case kType: {
   1803       ObjPtr<mirror::Class> resolved = linker_->ResolveType(dex::TypeIndex(jval_.i),
   1804                                                             dex_cache_,
   1805                                                             class_loader_);
   1806       field->SetObject<kTransactionActive>(field->GetDeclaringClass(), resolved);
   1807       break;
   1808     }
   1809     default: UNIMPLEMENTED(FATAL) << ": type " << type_;
   1810   }
   1811 }
   1812 template
   1813 void RuntimeEncodedStaticFieldValueIterator::ReadValueToField<true>(ArtField* field) const;
   1814 template
   1815 void RuntimeEncodedStaticFieldValueIterator::ReadValueToField<false>(ArtField* field) const;
   1816 
   1817 }  // namespace annotations
   1818 
   1819 }  // namespace art
   1820