blob: 804f68064aca8a4486d6d34e6b9e8e3ccebc4810 [file] [log] [blame]
Brian Carlstrom7e49dca2011-07-22 18:07:34 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_DEX_CACHE_H_
4#define ART_SRC_DEX_CACHE_H_
5
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -07006#include "dex_file.h"
Brian Carlstrom7e49dca2011-07-22 18:07:34 -07007#include "globals.h"
8#include "macros.h"
9#include "object.h"
10
11namespace art {
12
13class Class;
14class Field;
15class Method;
16class String;
17union JValue;
18
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070019class CodeAndDirectMethods : public IntArray {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070020 public:
Brian Carlstrom83db7722011-08-26 17:32:56 -070021 Method* GetResolvedCode(uint32_t method_idx) const {
22 return reinterpret_cast<Method*>(Get(method_idx * kMax + kCode));
23 }
24 void* GetResolvedMethod(uint32_t method_idx) const {
25 return reinterpret_cast<byte*>(Get(method_idx * kMax + kMethod));
26 }
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070027
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070028 void SetResolvedDirectMethodTrampoline(uint32_t method_idx) {
Brian Carlstrom8a487412011-08-29 20:08:52 -070029 UNIMPLEMENTED(WARNING) << "need to install a trampoline to resolve the method_idx at runtime";
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070030 Set(method_idx * kMax + kCode, 0xffffffff);
31 Set(method_idx * kMax + kMethod, method_idx);
32 }
33
34 void SetResolvedDirectMethod(uint32_t method_idx, Method* method) {
Brian Carlstrom83db7722011-08-26 17:32:56 -070035 CHECK(method != NULL);
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070036 CHECK(method->IsDirect());
Brian Carlstrom83db7722011-08-26 17:32:56 -070037 // CHECK(method->GetCode() != NULL); // TODO enable when all code is compiling
38 Set(method_idx * kMax + kCode, reinterpret_cast<int32_t>(method->GetCode()));
39 Set(method_idx * kMax + kMethod, reinterpret_cast<int32_t>(method));
40 }
41
buzbee561227c2011-09-02 15:28:19 -070042 static size_t LengthAsArray(size_t elements) {
43 return kMax * elements;
44 }
45
46 // Offset of resolved method entry from start of code_and_direct_methods_
47 static size_t MethodOffsetInBytes(uint32_t method_idx) {
48 return ((method_idx * kMax + kMethod) * sizeof(ElementType) +
49 Array::DataOffset().Int32Value());
50 }
51
52 // Offset of resolved method's code_ from start of code_and_direct_methods_
53 static size_t CodeOffsetInBytes(uint32_t method_idx) {
54 return ((method_idx * kMax + kCode) * sizeof(ElementType) +
55 Array::DataOffset().Int32Value());
56 }
Brian Carlstrom83db7722011-08-26 17:32:56 -070057
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070058 size_t NumCodeAndDirectMethods() const {
59 return GetLength() / kMax;
60 }
61
Brian Carlstrom83db7722011-08-26 17:32:56 -070062 private:
63 enum TupleIndex {
64 kCode = 0,
65 kMethod = 1,
66 kMax = 2,
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070067 };
68
Brian Carlstrom83db7722011-08-26 17:32:56 -070069};
70
71class DexCache : public ObjectArray<Object> {
72 public:
Brian Carlstroma663ea52011-08-19 23:33:41 -070073 void Init(String* location,
74 ObjectArray<String>* strings,
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070075 ObjectArray<Class>* types,
Brian Carlstrom4a96b602011-07-26 16:40:23 -070076 ObjectArray<Method>* methods,
Brian Carlstrom83db7722011-08-26 17:32:56 -070077 ObjectArray<Field>* fields,
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070078 CodeAndDirectMethods* code_and_direct_methods,
79 ObjectArray<StaticStorageBase>* initialized_static_storage);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070080
Brian Carlstroma663ea52011-08-19 23:33:41 -070081 String* GetLocation() const {
82 return Get(kLocation)->AsString();
83 }
84
buzbee5cd21802011-08-26 10:40:14 -070085 static MemberOffset StringsOffset() {
86 return MemberOffset(DataOffset().Int32Value() +
87 kStrings * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070088 }
89
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070090 static MemberOffset ResolvedFieldsOffset() {
buzbee5cd21802011-08-26 10:40:14 -070091 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070092 kResolvedFields * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070093 }
94
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070095 static MemberOffset ResolvedMethodsOffset() {
buzbee5cd21802011-08-26 10:40:14 -070096 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070097 kResolvedMethods * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070098 }
99
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700100 size_t NumStrings() const {
101 return GetStrings()->GetLength();
102 }
103
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700104 size_t NumResolvedTypes() const {
105 return GetResolvedTypes()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700106 }
107
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700108 size_t NumResolvedMethods() const {
109 return GetResolvedMethods()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700110 }
111
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700112 size_t NumResolvedFields() const {
113 return GetResolvedFields()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700114 }
115
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700116 size_t NumCodeAndDirectMethods() const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700117 return GetCodeAndDirectMethods()->NumCodeAndDirectMethods();
118 }
119
120 size_t NumInitializedStaticStorage() const {
121 return GetInitializedStaticStorage()->GetLength();
Brian Carlstrom83db7722011-08-26 17:32:56 -0700122 }
123
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700124 String* GetResolvedString(uint32_t string_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700125 return GetStrings()->Get(string_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700126 }
127
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700128 void SetResolvedString(uint32_t string_idx, String* resolved) {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700129 GetStrings()->Set(string_idx, resolved);
130 }
131
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700132 Class* GetResolvedType(uint32_t type_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700133 return GetResolvedTypes()->Get(type_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700134 }
135
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700136 void SetResolvedType(uint32_t type_idx, Class* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700137 GetResolvedTypes()->Set(type_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700138 }
139
140 Method* GetResolvedMethod(uint32_t method_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700141 return GetResolvedMethods()->Get(method_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700142 }
143
144 void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700145 GetResolvedMethods()->Set(method_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700146 }
147
148 Field* GetResolvedField(uint32_t field_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700149 return GetResolvedFields()->Get(field_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700150 }
151
152 void SetResolvedfield(uint32_t field_idx, Field* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700153 GetResolvedFields()->Set(field_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700154 }
155
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700156 ObjectArray<String>* GetStrings() const {
157 return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700158 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700159 ObjectArray<Class>* GetResolvedTypes() const {
160 return static_cast<ObjectArray<Class>*>(GetNonNull(kResolvedTypes));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700161 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700162 ObjectArray<Method>* GetResolvedMethods() const {
163 return static_cast<ObjectArray<Method>*>(GetNonNull(kResolvedMethods));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700164 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700165 ObjectArray<Field>* GetResolvedFields() const {
166 return static_cast<ObjectArray<Field>*>(GetNonNull(kResolvedFields));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700167 }
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700168 CodeAndDirectMethods* GetCodeAndDirectMethods() const {
169 return static_cast<CodeAndDirectMethods*>(GetNonNull(kCodeAndDirectMethods));
Brian Carlstrom83db7722011-08-26 17:32:56 -0700170 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700171 ObjectArray<StaticStorageBase>* GetInitializedStaticStorage() const {
172 return static_cast<ObjectArray<StaticStorageBase>*>(GetNonNull(kInitializedStaticStorage));
173 }
Brian Carlstrom83db7722011-08-26 17:32:56 -0700174
175 static size_t LengthAsArray() {
176 return kMax;
177 }
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700178
179 private:
Brian Carlstrom83db7722011-08-26 17:32:56 -0700180
181 enum ArrayIndex {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700182 kLocation = 0,
183 kStrings = 1,
184 kResolvedTypes = 2,
185 kResolvedMethods = 3,
186 kResolvedFields = 4,
187 kCodeAndDirectMethods = 5,
188 kInitializedStaticStorage = 6,
189 kMax = 7,
Brian Carlstrom83db7722011-08-26 17:32:56 -0700190 };
191
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700192 Object* GetNonNull(ArrayIndex array_index) const {
193 Object* obj = Get(array_index);
194 DCHECK(obj != NULL);
195 return obj;
196 }
197 DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700198};
199
200} // namespace art
201
202#endif // ART_SRC_DEX_CACHE_H_