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 #ifndef ART_RUNTIME_DEX_FILE_ANNOTATIONS_H_
18 #define ART_RUNTIME_DEX_FILE_ANNOTATIONS_H_
19 
20 #include "dex_file.h"
21 
22 #include "mirror/object_array.h"
23 
24 namespace art {
25 
26 namespace mirror {
27   class ClassLoader;
28   class DexCache;
29 }  // namespace mirror
30 class ArtField;
31 class ArtMethod;
32 class ClassLinker;
33 template<class T> class MutableHandle;
34 
35 namespace annotations {
36 
37 // Field annotations.
38 mirror::Object* GetAnnotationForField(ArtField* field, Handle<mirror::Class> annotation_class)
39     REQUIRES_SHARED(Locks::mutator_lock_);
40 mirror::ObjectArray<mirror::Object>* GetAnnotationsForField(ArtField* field)
41     REQUIRES_SHARED(Locks::mutator_lock_);
42 mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForField(ArtField* field)
43     REQUIRES_SHARED(Locks::mutator_lock_);
44 bool IsFieldAnnotationPresent(ArtField* field, Handle<mirror::Class> annotation_class)
45     REQUIRES_SHARED(Locks::mutator_lock_);
46 
47 // Method annotations.
48 mirror::Object* GetAnnotationDefaultValue(ArtMethod* method)
49     REQUIRES_SHARED(Locks::mutator_lock_);
50 mirror::Object* GetAnnotationForMethod(ArtMethod* method, Handle<mirror::Class> annotation_class)
51     REQUIRES_SHARED(Locks::mutator_lock_);
52 mirror::ObjectArray<mirror::Object>* GetAnnotationsForMethod(ArtMethod* method)
53     REQUIRES_SHARED(Locks::mutator_lock_);
54 mirror::ObjectArray<mirror::Class>* GetExceptionTypesForMethod(ArtMethod* method)
55     REQUIRES_SHARED(Locks::mutator_lock_);
56 mirror::ObjectArray<mirror::Object>* GetParameterAnnotations(ArtMethod* method)
57     REQUIRES_SHARED(Locks::mutator_lock_);
58 mirror::Object* GetAnnotationForMethodParameter(ArtMethod* method,
59                                                 uint32_t parameter_idx,
60                                                 Handle<mirror::Class> annotation_class)
61     REQUIRES_SHARED(Locks::mutator_lock_);
62 bool GetParametersMetadataForMethod(ArtMethod* method,
63                                     MutableHandle<mirror::ObjectArray<mirror::String>>* names,
64                                     MutableHandle<mirror::IntArray>* access_flags)
65     REQUIRES_SHARED(Locks::mutator_lock_);
66 mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForMethod(ArtMethod* method)
67     REQUIRES_SHARED(Locks::mutator_lock_);
68 // Check whether `method` is annotated with `annotation_class`.
69 // If `lookup_in_resolved_boot_classes` is true, look up any of the
70 // method's annotations' classes in the bootstrap class loader's
71 // resolved types; if it is false (default value), resolve them as a
72 // side effect.
73 bool IsMethodAnnotationPresent(ArtMethod* method,
74                                Handle<mirror::Class> annotation_class,
75                                uint32_t visibility = DexFile::kDexVisibilityRuntime,
76                                bool lookup_in_resolved_boot_classes = false)
77     REQUIRES_SHARED(Locks::mutator_lock_);
78 
79 // Class annotations.
80 mirror::Object* GetAnnotationForClass(Handle<mirror::Class> klass,
81                                       Handle<mirror::Class> annotation_class)
82     REQUIRES_SHARED(Locks::mutator_lock_);
83 mirror::ObjectArray<mirror::Object>* GetAnnotationsForClass(Handle<mirror::Class> klass)
84     REQUIRES_SHARED(Locks::mutator_lock_);
85 mirror::ObjectArray<mirror::Class>* GetDeclaredClasses(Handle<mirror::Class> klass)
86     REQUIRES_SHARED(Locks::mutator_lock_);
87 mirror::Class* GetDeclaringClass(Handle<mirror::Class> klass)
88     REQUIRES_SHARED(Locks::mutator_lock_);
89 mirror::Class* GetEnclosingClass(Handle<mirror::Class> klass)
90     REQUIRES_SHARED(Locks::mutator_lock_);
91 mirror::Object* GetEnclosingMethod(Handle<mirror::Class> klass)
92     REQUIRES_SHARED(Locks::mutator_lock_);
93 bool GetInnerClass(Handle<mirror::Class> klass, mirror::String** name)
94     REQUIRES_SHARED(Locks::mutator_lock_);
95 bool GetInnerClassFlags(Handle<mirror::Class> klass, uint32_t* flags)
96     REQUIRES_SHARED(Locks::mutator_lock_);
97 mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForClass(Handle<mirror::Class> klass)
98     REQUIRES_SHARED(Locks::mutator_lock_);
99 const char* GetSourceDebugExtension(Handle<mirror::Class> klass)
100     REQUIRES_SHARED(Locks::mutator_lock_);
101 bool IsClassAnnotationPresent(Handle<mirror::Class> klass,
102                               Handle<mirror::Class> annotation_class)
103     REQUIRES_SHARED(Locks::mutator_lock_);
104 
105 // Map back from a PC to the line number in a method.
106 int32_t GetLineNumFromPC(const DexFile* dex_file, ArtMethod* method, uint32_t rel_pc)
107     REQUIRES_SHARED(Locks::mutator_lock_);
108 
109 // Annotations iterator.
110 class RuntimeEncodedStaticFieldValueIterator : public EncodedStaticFieldValueIterator {
111  public:
112   // A constructor meant to be called from runtime code.
RuntimeEncodedStaticFieldValueIterator(const DexFile & dex_file,Handle<mirror::DexCache> * dex_cache,Handle<mirror::ClassLoader> * class_loader,ClassLinker * linker,const DexFile::ClassDef & class_def)113   RuntimeEncodedStaticFieldValueIterator(const DexFile& dex_file,
114                                          Handle<mirror::DexCache>* dex_cache,
115                                          Handle<mirror::ClassLoader>* class_loader,
116                                          ClassLinker* linker,
117                                          const DexFile::ClassDef& class_def)
118       REQUIRES_SHARED(Locks::mutator_lock_)
119       : EncodedStaticFieldValueIterator(dex_file, class_def),
120         dex_cache_(dex_cache),
121         class_loader_(class_loader),
122         linker_(linker) {
123   }
124 
125   template<bool kTransactionActive>
126   void ReadValueToField(ArtField* field) const REQUIRES_SHARED(Locks::mutator_lock_);
127 
128  private:
129   Handle<mirror::DexCache>* const dex_cache_;  // Dex cache to resolve literal objects.
130   Handle<mirror::ClassLoader>* const class_loader_;  // ClassLoader to resolve types.
131   ClassLinker* linker_;  // Linker to resolve literal objects.
132   DISALLOW_IMPLICIT_CONSTRUCTORS(RuntimeEncodedStaticFieldValueIterator);
133 };
134 
135 }  // namespace annotations
136 
137 }  // namespace art
138 
139 #endif  // ART_RUNTIME_DEX_FILE_ANNOTATIONS_H_
140