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