blob: 8cd9b1202f62fb6fa0f2d4f078fe396de2ef938c [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;
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070015class ImageWriter;
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070016class Method;
17class String;
18union JValue;
19
Brian Carlstrome4f7e1d2011-09-11 13:21:12 -070020class MANAGED CodeAndDirectMethods : public IntArray {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070021 public:
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070022 void* GetResolvedCode(uint32_t method_idx) const {
23 return reinterpret_cast<byte*>(Get(CodeIndex(method_idx)));
Brian Carlstrom83db7722011-08-26 17:32:56 -070024 }
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070025 Method* GetResolvedMethod(uint32_t method_idx) const {
26 return reinterpret_cast<Method*>(Get(MethodIndex(method_idx)));
Brian Carlstrom83db7722011-08-26 17:32:56 -070027 }
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070028
Brian Carlstrom3320cf42011-10-04 14:58:28 -070029 void SetResolvedDirectMethodTrampoline(uint32_t method_idx, ByteArray* code_array) {
30 CHECK(code_array != NULL);
Ian Rogersad25ac52011-10-04 19:13:33 -070031 int32_t code = reinterpret_cast<int32_t>(code_array->GetData());
Ian Rogersad25ac52011-10-04 19:13:33 -070032 Set(CodeIndex(method_idx), code);
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070033 Set(MethodIndex(method_idx), method_idx);
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070034 }
35
Ian Rogers0571d352011-11-03 19:51:38 -070036 void SetResolvedDirectMethod(uint32_t method_idx, Method* method);
Brian Carlstrom83db7722011-08-26 17:32:56 -070037
buzbee561227c2011-09-02 15:28:19 -070038 static size_t LengthAsArray(size_t elements) {
39 return kMax * elements;
40 }
41
42 // Offset of resolved method entry from start of code_and_direct_methods_
43 static size_t MethodOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070044 return (MethodIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070045 }
46
47 // Offset of resolved method's code_ from start of code_and_direct_methods_
48 static size_t CodeOffsetInBytes(uint32_t method_idx) {
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070049 return (CodeIndex(method_idx) * sizeof(ElementType) + Array::DataOffset().Int32Value());
buzbee561227c2011-09-02 15:28:19 -070050 }
Brian Carlstrom83db7722011-08-26 17:32:56 -070051
Elliott Hughes362f9bc2011-10-17 18:56:41 -070052 size_t NumCodeAndDirectMethods() const {
53 return GetLength() / kMax;
54 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070055
Brian Carlstrom83db7722011-08-26 17:32:56 -070056 private:
57 enum TupleIndex {
58 kCode = 0,
59 kMethod = 1,
60 kMax = 2,
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070061 };
62
Brian Carlstrom69b15fb2011-09-03 12:25:21 -070063 static size_t CodeIndex(uint32_t method_idx) {
64 return method_idx * kMax + kCode;
65 }
66 static size_t MethodIndex(uint32_t method_idx) {
67 return method_idx * kMax + kMethod;
68 }
69
70 // grant friend status to ImageWriter fixup code that needs to know internal layout
71 friend class ImageWriter;
72
73 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeAndDirectMethods);
Brian Carlstrom83db7722011-08-26 17:32:56 -070074};
75
Brian Carlstrome4f7e1d2011-09-11 13:21:12 -070076class MANAGED DexCache : public ObjectArray<Object> {
Brian Carlstrom83db7722011-08-26 17:32:56 -070077 public:
Brian Carlstroma663ea52011-08-19 23:33:41 -070078 void Init(String* location,
79 ObjectArray<String>* strings,
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070080 ObjectArray<Class>* types,
Brian Carlstrom4a96b602011-07-26 16:40:23 -070081 ObjectArray<Method>* methods,
Brian Carlstrom83db7722011-08-26 17:32:56 -070082 ObjectArray<Field>* fields,
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070083 CodeAndDirectMethods* code_and_direct_methods,
84 ObjectArray<StaticStorageBase>* initialized_static_storage);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070085
Brian Carlstroma663ea52011-08-19 23:33:41 -070086 String* GetLocation() const {
87 return Get(kLocation)->AsString();
88 }
89
buzbee5cd21802011-08-26 10:40:14 -070090 static MemberOffset StringsOffset() {
91 return MemberOffset(DataOffset().Int32Value() +
92 kStrings * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070093 }
94
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070095 static MemberOffset ResolvedFieldsOffset() {
buzbee5cd21802011-08-26 10:40:14 -070096 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -070097 kResolvedFields * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070098 }
99
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700100 static MemberOffset ResolvedMethodsOffset() {
buzbee5cd21802011-08-26 10:40:14 -0700101 return MemberOffset(DataOffset().Int32Value() +
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700102 kResolvedMethods * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -0700103 }
104
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700105 size_t NumStrings() const {
106 return GetStrings()->GetLength();
107 }
108
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700109 size_t NumResolvedTypes() const {
110 return GetResolvedTypes()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700111 }
112
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700113 size_t NumResolvedMethods() const {
114 return GetResolvedMethods()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700115 }
116
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700117 size_t NumResolvedFields() const {
118 return GetResolvedFields()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700119 }
120
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700121 size_t NumCodeAndDirectMethods() const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700122 return GetCodeAndDirectMethods()->NumCodeAndDirectMethods();
123 }
124
125 size_t NumInitializedStaticStorage() const {
126 return GetInitializedStaticStorage()->GetLength();
Brian Carlstrom83db7722011-08-26 17:32:56 -0700127 }
128
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700129 String* GetResolvedString(uint32_t string_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700130 return GetStrings()->Get(string_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700131 }
132
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700133 void SetResolvedString(uint32_t string_idx, String* resolved) {
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700134 GetStrings()->Set(string_idx, resolved);
135 }
136
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700137 Class* GetResolvedType(uint32_t type_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700138 return GetResolvedTypes()->Get(type_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700139 }
140
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700141 void SetResolvedType(uint32_t type_idx, Class* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700142 GetResolvedTypes()->Set(type_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700143 }
144
145 Method* GetResolvedMethod(uint32_t method_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700146 return GetResolvedMethods()->Get(method_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700147 }
148
149 void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700150 GetResolvedMethods()->Set(method_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700151 }
152
153 Field* GetResolvedField(uint32_t field_idx) const {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700154 return GetResolvedFields()->Get(field_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700155 }
156
Elliott Hughes4a2b4172011-09-20 17:08:25 -0700157 void SetResolvedField(uint32_t field_idx, Field* resolved) {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700158 GetResolvedFields()->Set(field_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700159 }
160
Ian Rogers0cfe1fb2011-08-26 03:29:44 -0700161 ObjectArray<String>* GetStrings() const {
162 return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700163 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700164 ObjectArray<Class>* GetResolvedTypes() const {
165 return static_cast<ObjectArray<Class>*>(GetNonNull(kResolvedTypes));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700166 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700167 ObjectArray<Method>* GetResolvedMethods() const {
168 return static_cast<ObjectArray<Method>*>(GetNonNull(kResolvedMethods));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700169 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700170 ObjectArray<Field>* GetResolvedFields() const {
171 return static_cast<ObjectArray<Field>*>(GetNonNull(kResolvedFields));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700172 }
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700173 CodeAndDirectMethods* GetCodeAndDirectMethods() const {
174 return static_cast<CodeAndDirectMethods*>(GetNonNull(kCodeAndDirectMethods));
Brian Carlstrom83db7722011-08-26 17:32:56 -0700175 }
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700176 ObjectArray<StaticStorageBase>* GetInitializedStaticStorage() const {
177 return static_cast<ObjectArray<StaticStorageBase>*>(GetNonNull(kInitializedStaticStorage));
178 }
Brian Carlstrom83db7722011-08-26 17:32:56 -0700179
Brian Carlstrom4b620ff2011-09-11 01:11:01 -0700180 static size_t LengthAsArray() {
181 return kMax;
182 }
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700183
184 private:
Brian Carlstrom83db7722011-08-26 17:32:56 -0700185
186 enum ArrayIndex {
Brian Carlstrom1caa2c22011-08-28 13:02:33 -0700187 kLocation = 0,
188 kStrings = 1,
189 kResolvedTypes = 2,
190 kResolvedMethods = 3,
191 kResolvedFields = 4,
192 kCodeAndDirectMethods = 5,
193 kInitializedStaticStorage = 6,
194 kMax = 7,
Brian Carlstrom83db7722011-08-26 17:32:56 -0700195 };
196
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700197 Object* GetNonNull(ArrayIndex array_index) const {
198 Object* obj = Get(array_index);
199 DCHECK(obj != NULL);
200 return obj;
201 }
202 DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700203};
204
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700205} // namespace art
206
207#endif // ART_SRC_DEX_CACHE_H_