blob: 2f75c8623d01a963158ef20804220809e1882749 [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 Carlstrom83db7722011-08-26 17:32:56 -070019class CodeAndMethods : 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 Carlstrom83db7722011-08-26 17:32:56 -070028 void SetResolvedMethod(uint32_t method_idx, Method* method) {
29 CHECK(method != NULL);
30 // CHECK(method->GetCode() != NULL); // TODO enable when all code is compiling
31 Set(method_idx * kMax + kCode, reinterpret_cast<int32_t>(method->GetCode()));
32 Set(method_idx * kMax + kMethod, reinterpret_cast<int32_t>(method));
33 }
34
35 static size_t LengthAsArray(size_t elements) {
36 return kMax * elements;
37 }
38
39 private:
40 enum TupleIndex {
41 kCode = 0,
42 kMethod = 1,
43 kMax = 2,
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070044 };
45
Brian Carlstrom83db7722011-08-26 17:32:56 -070046};
47
48class DexCache : public ObjectArray<Object> {
49 public:
Brian Carlstroma663ea52011-08-19 23:33:41 -070050 void Init(String* location,
51 ObjectArray<String>* strings,
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070052 ObjectArray<Class>* types,
Brian Carlstrom4a96b602011-07-26 16:40:23 -070053 ObjectArray<Method>* methods,
Brian Carlstrom83db7722011-08-26 17:32:56 -070054 ObjectArray<Field>* fields,
55 CodeAndMethods* code_and_methods);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070056
Brian Carlstroma663ea52011-08-19 23:33:41 -070057 String* GetLocation() const {
58 return Get(kLocation)->AsString();
59 }
60
buzbee5cd21802011-08-26 10:40:14 -070061 static MemberOffset StringsOffset() {
62 return MemberOffset(DataOffset().Int32Value() +
63 kStrings * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070064 }
65
buzbee5cd21802011-08-26 10:40:14 -070066 static MemberOffset FieldsOffset() {
67 return MemberOffset(DataOffset().Int32Value() +
68 kFields * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070069 }
70
buzbee5cd21802011-08-26 10:40:14 -070071 static MemberOffset MethodsOffset() {
72 return MemberOffset(DataOffset().Int32Value() +
73 kMethods * sizeof(Object*));
buzbeec5ef0462011-08-25 18:44:49 -070074 }
75
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070076 size_t NumStrings() const {
77 return GetStrings()->GetLength();
78 }
79
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070080 size_t NumTypes() const {
81 return GetTypes()->GetLength();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070082 }
83
84 size_t NumMethods() const {
85 return GetMethods()->GetLength();
86 }
87
88 size_t NumFields() const {
89 return GetFields()->GetLength();
90 }
91
Brian Carlstrom83db7722011-08-26 17:32:56 -070092 size_t NumCodeAndMethods() const {
93 return GetCodeAndMethods()->GetLength();
94 }
95
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070096 String* GetResolvedString(uint32_t string_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -070097 return GetStrings()->Get(string_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070098 }
99
100 void SetResolvedString(uint32_t string_idx, String* resolved) {
101 GetStrings()->Set(string_idx, resolved);
102 }
103
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700104 Class* GetResolvedType(uint32_t type_idx) const {
105 return GetTypes()->Get(type_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700106 }
107
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700108 void SetResolvedType(uint32_t type_idx, Class* resolved) {
109 GetTypes()->Set(type_idx, resolved);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700110 }
111
112 Method* GetResolvedMethod(uint32_t method_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700113 return GetMethods()->Get(method_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700114 }
115
116 void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
117 GetMethods()->Set(method_idx, resolved);
118 }
119
120 Field* GetResolvedField(uint32_t field_idx) const {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700121 return GetFields()->Get(field_idx);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700122 }
123
124 void SetResolvedfield(uint32_t field_idx, Field* resolved) {
125 GetFields()->Set(field_idx, resolved);
126 }
127
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700128 ObjectArray<String>* GetStrings() const {
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700129 return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700130 }
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -0700131 ObjectArray<Class>* GetTypes() const {
132 return static_cast<ObjectArray<Class>*>(GetNonNull(kTypes));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700133 }
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700134 ObjectArray<Method>* GetMethods() const {
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700135 return static_cast<ObjectArray<Method>*>(GetNonNull(kMethods));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700136 }
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700137 ObjectArray<Field>* GetFields() const {
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700138 return static_cast<ObjectArray<Field>*>(GetNonNull(kFields));
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700139 }
Brian Carlstrom83db7722011-08-26 17:32:56 -0700140 CodeAndMethods* GetCodeAndMethods() const {
141 return static_cast<CodeAndMethods*>(GetNonNull(kCodeAndMethods));
142 }
143
144 static size_t LengthAsArray() {
145 return kMax;
146 }
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700147
148 private:
Brian Carlstrom83db7722011-08-26 17:32:56 -0700149
150 enum ArrayIndex {
151 kLocation = 0,
152 kStrings = 1,
153 kTypes = 2,
154 kMethods = 3,
155 kFields = 4,
156 kCodeAndMethods = 5,
157 kMax = 6,
158 };
159
Brian Carlstromc4fa2c02011-08-21 03:00:12 -0700160 Object* GetNonNull(ArrayIndex array_index) const {
161 Object* obj = Get(array_index);
162 DCHECK(obj != NULL);
163 return obj;
164 }
165 DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700166};
167
168} // namespace art
169
170#endif // ART_SRC_DEX_CACHE_H_