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