blob: 1e46a90afc1d235a81c068e8a7c3299aa701ecf0 [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) {
29 UNIMPLEMENTED(FATAL) << "need to install a trampoline to resolve the method_idx at runtime";
30 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
42 static size_t LengthAsArray(size_t elements) {
43 return kMax * elements;
44 }
45
46 private:
47 enum TupleIndex {
48 kCode = 0,
49 kMethod = 1,
50 kMax = 2,
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070051 };
52
Brian Carlstrom83db7722011-08-26 17:32:56 -070053};
54
55class DexCache : public ObjectArray<Object> {
56 public:
Brian Carlstroma663ea52011-08-19 23:33:41 -070057 void Init(String* location,
58 ObjectArray<String>* strings,
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070059 ObjectArray<Class>* types,
Brian Carlstrom4a96b602011-07-26 16:40:23 -070060 ObjectArray<Method>* methods,
Brian Carlstrom83db7722011-08-26 17:32:56 -070061 ObjectArray<Field>* fields,
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070062 CodeAndDirectMethods* code_and_direct_methods);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070063
Brian Carlstroma663ea52011-08-19 23:33:41 -070064 String* GetLocation() const {
65 return Get(kLocation)->AsString();
66 }
67
buzbee5cd21802011-08-26 10:40:14 -070068 static MemberOffset StringsOffset() {
69 return MemberOffset(DataOffset().Int32Value() +
70 kStrings * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070071 }
72
buzbee5cd21802011-08-26 10:40:14 -070073 static MemberOffset FieldsOffset() {
74 return MemberOffset(DataOffset().Int32Value() +
75 kFields * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070076 }
77
buzbee5cd21802011-08-26 10:40:14 -070078 static MemberOffset MethodsOffset() {
79 return MemberOffset(DataOffset().Int32Value() +
80 kMethods * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070081 }
82
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070083 size_t NumStrings() const {
84 return GetStrings()->GetLength();
85 }
86
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070087 size_t NumTypes() const {
88 return GetTypes()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070089 }
90
91 size_t NumMethods() const {
92 return GetMethods()->GetLength();
93 }
94
95 size_t NumFields() const {
96 return GetFields()->GetLength();
97 }
98
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070099 size_t NumCodeAndDirectMethods() const {
100 return GetCodeAndDirectMethods()->GetLength();
Brian Carlstrom83db7722011-08-26 17:32:56 -0700101 }
102
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700103 String* GetResolvedString(uint32_t string_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700104 return GetStrings()->Get(string_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700105 }
106
107 void SetResolvedString(uint32_t string_idx, String* resolved) {
108 GetStrings()->Set(string_idx, resolved);
109 }
110
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700111 Class* GetResolvedType(uint32_t type_idx) const {
112 return GetTypes()->Get(type_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700113 }
114
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700115 void SetResolvedType(uint32_t type_idx, Class* resolved) {
116 GetTypes()->Set(type_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700117 }
118
119 Method* GetResolvedMethod(uint32_t method_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700120 return GetMethods()->Get(method_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700121 }
122
123 void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
124 GetMethods()->Set(method_idx, resolved);
125 }
126
127 Field* GetResolvedField(uint32_t field_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700128 return GetFields()->Get(field_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700129 }
130
131 void SetResolvedfield(uint32_t field_idx, Field* resolved) {
132 GetFields()->Set(field_idx, resolved);
133 }
134
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700135 ObjectArray<String>* GetStrings() const {
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700136 return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700137 }
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700138 ObjectArray<Class>* GetTypes() const {
139 return static_cast<ObjectArray<Class>*>(GetNonNull(kTypes));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700140 }
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700141 ObjectArray<Method>* GetMethods() const {
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700142 return static_cast<ObjectArray<Method>*>(GetNonNull(kMethods));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700143 }
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700144 ObjectArray<Field>* GetFields() const {
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700145 return static_cast<ObjectArray<Field>*>(GetNonNull(kFields));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700146 }
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700147 CodeAndDirectMethods* GetCodeAndDirectMethods() const {
148 return static_cast<CodeAndDirectMethods*>(GetNonNull(kCodeAndDirectMethods));
Brian Carlstrom83db7722011-08-26 17:32:56 -0700149 }
150
151 static size_t LengthAsArray() {
152 return kMax;
153 }
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700154
155 private:
Brian Carlstrom83db7722011-08-26 17:32:56 -0700156
157 enum ArrayIndex {
Brian Carlstrom9cc262e2011-08-28 12:45:30 -0700158 kLocation = 0,
159 kStrings = 1,
160 kTypes = 2,
161 kMethods = 3,
162 kFields = 4,
163 kCodeAndDirectMethods = 5,
164 kMax = 6,
Brian Carlstrom83db7722011-08-26 17:32:56 -0700165 };
166
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700167 Object* GetNonNull(ArrayIndex array_index) const {
168 Object* obj = Get(array_index);
169 DCHECK(obj != NULL);
170 return obj;
171 }
172 DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700173};
174
175} // namespace art
176
177#endif // ART_SRC_DEX_CACHE_H_