1 /*
2  * Copyright (C) 2012 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_COMPILER_DRIVER_DEX_COMPILATION_UNIT_H_
18 #define ART_COMPILER_DRIVER_DEX_COMPILATION_UNIT_H_
19 
20 #include <stdint.h>
21 
22 #include "base/arena_object.h"
23 #include "dex/code_item_accessors.h"
24 #include "dex/dex_file.h"
25 #include "handle.h"
26 #include "jni.h"
27 
28 namespace art {
29 namespace mirror {
30 class ClassLoader;
31 class DexCache;
32 }  // namespace mirror
33 class ClassLinker;
34 class VerifiedMethod;
35 
36 class DexCompilationUnit : public DeletableArenaObject<kArenaAllocMisc> {
37  public:
38   DexCompilationUnit(Handle<mirror::ClassLoader> class_loader,
39                      ClassLinker* class_linker,
40                      const DexFile& dex_file,
41                      const DexFile::CodeItem* code_item,
42                      uint16_t class_def_idx,
43                      uint32_t method_idx,
44                      uint32_t access_flags,
45                      const VerifiedMethod* verified_method,
46                      Handle<mirror::DexCache> dex_cache);
47 
GetClassLoader()48   Handle<mirror::ClassLoader> GetClassLoader() const {
49     return class_loader_;
50   }
51 
GetClassLinker()52   ClassLinker* GetClassLinker() const {
53     return class_linker_;
54   }
55 
GetDexFile()56   const DexFile* GetDexFile() const {
57     return dex_file_;
58   }
59 
GetClassDefIndex()60   uint16_t GetClassDefIndex() const {
61     return class_def_idx_;
62   }
63 
GetDexMethodIndex()64   uint32_t GetDexMethodIndex() const {
65     return dex_method_idx_;
66   }
67 
GetCodeItem()68   const DexFile::CodeItem* GetCodeItem() const {
69     return code_item_;
70   }
71 
GetShorty()72   const char* GetShorty() const {
73     const DexFile::MethodId& method_id = dex_file_->GetMethodId(dex_method_idx_);
74     return dex_file_->GetMethodShorty(method_id);
75   }
76 
GetShorty(uint32_t * shorty_len)77   const char* GetShorty(uint32_t* shorty_len) const {
78     const DexFile::MethodId& method_id = dex_file_->GetMethodId(dex_method_idx_);
79     return dex_file_->GetMethodShorty(method_id, shorty_len);
80   }
81 
GetAccessFlags()82   uint32_t GetAccessFlags() const {
83     return access_flags_;
84   }
85 
IsConstructor()86   bool IsConstructor() const {
87     return ((access_flags_ & kAccConstructor) != 0);
88   }
89 
IsNative()90   bool IsNative() const {
91     return ((access_flags_ & kAccNative) != 0);
92   }
93 
IsStatic()94   bool IsStatic() const {
95     return ((access_flags_ & kAccStatic) != 0);
96   }
97 
IsSynchronized()98   bool IsSynchronized() const {
99     return ((access_flags_ & kAccSynchronized) != 0);
100   }
101 
GetVerifiedMethod()102   const VerifiedMethod* GetVerifiedMethod() const {
103     return verified_method_;
104   }
105 
ClearVerifiedMethod()106   void ClearVerifiedMethod() {
107     verified_method_ = nullptr;
108   }
109 
110   const std::string& GetSymbol();
111 
GetDexCache()112   Handle<mirror::DexCache> GetDexCache() const {
113     return dex_cache_;
114   }
115 
GetCodeItemAccessor()116   const CodeItemDataAccessor& GetCodeItemAccessor() const {
117     return code_item_accessor_;
118   }
119 
120  private:
121   const Handle<mirror::ClassLoader> class_loader_;
122 
123   ClassLinker* const class_linker_;
124 
125   const DexFile* const dex_file_;
126 
127   const DexFile::CodeItem* const code_item_;
128   const uint16_t class_def_idx_;
129   const uint32_t dex_method_idx_;
130   const uint32_t access_flags_;
131   const VerifiedMethod* verified_method_;
132 
133   const Handle<mirror::DexCache> dex_cache_;
134 
135   const CodeItemDataAccessor code_item_accessor_;
136 
137   std::string symbol_;
138 };
139 
140 }  // namespace art
141 
142 #endif  // ART_COMPILER_DRIVER_DEX_COMPILATION_UNIT_H_
143