blob: f6047016455e8cef3d0024c83fdfd3634927ad40 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ART_SRC_DEX_CACHE_H_
#define ART_SRC_DEX_CACHE_H_
#include "dex_file.h"
#include "globals.h"
#include "macros.h"
#include "object.h"
namespace art {
class Class;
class Field;
class ImageWriter;
class Method;
class String;
union JValue;
class MANAGED DexCache : public ObjectArray<Object> {
public:
void Init(String* location,
ObjectArray<String>* strings,
ObjectArray<Class>* types,
ObjectArray<Method>* methods,
ObjectArray<Field>* fields,
ObjectArray<StaticStorageBase>* initialized_static_storage);
void Fixup(Method* trampoline);
String* GetLocation() const {
return Get(kLocation)->AsString();
}
static MemberOffset StringsOffset() {
return MemberOffset(DataOffset(sizeof(Object*)).Int32Value() +
kStrings * sizeof(Object*));
}
static MemberOffset ResolvedFieldsOffset() {
return MemberOffset(DataOffset(sizeof(Object*)).Int32Value() +
kResolvedFields * sizeof(Object*));
}
static MemberOffset ResolvedMethodsOffset() {
return MemberOffset(DataOffset(sizeof(Object*)).Int32Value() +
kResolvedMethods * sizeof(Object*));
}
size_t NumStrings() const {
return GetStrings()->GetLength();
}
size_t NumResolvedTypes() const {
return GetResolvedTypes()->GetLength();
}
size_t NumResolvedMethods() const {
return GetResolvedMethods()->GetLength();
}
size_t NumResolvedFields() const {
return GetResolvedFields()->GetLength();
}
size_t NumInitializedStaticStorage() const {
return GetInitializedStaticStorage()->GetLength();
}
String* GetResolvedString(uint32_t string_idx) const {
return GetStrings()->Get(string_idx);
}
void SetResolvedString(uint32_t string_idx, String* resolved) {
GetStrings()->Set(string_idx, resolved);
}
Class* GetResolvedType(uint32_t type_idx) const {
return GetResolvedTypes()->Get(type_idx);
}
void SetResolvedType(uint32_t type_idx, Class* resolved) {
GetResolvedTypes()->Set(type_idx, resolved);
}
Method* GetResolvedMethod(uint32_t method_idx) const {
Method* method = GetResolvedMethods()->Get(method_idx);
// Hide resolution trampoline methods from the caller
if (method != NULL && method->GetDexMethodIndex() == DexFile::kDexNoIndex16) {
DCHECK(method == Runtime::Current()->GetResolutionMethod());
return NULL;
} else {
return method;
}
}
void SetResolvedMethod(uint32_t method_idx, Method* resolved) {
GetResolvedMethods()->Set(method_idx, resolved);
}
Field* GetResolvedField(uint32_t field_idx) const {
return GetResolvedFields()->Get(field_idx);
}
void SetResolvedField(uint32_t field_idx, Field* resolved) {
GetResolvedFields()->Set(field_idx, resolved);
}
ObjectArray<String>* GetStrings() const {
return static_cast<ObjectArray<String>*>(GetNonNull(kStrings));
}
ObjectArray<Class>* GetResolvedTypes() const {
return static_cast<ObjectArray<Class>*>(GetNonNull(kResolvedTypes));
}
ObjectArray<Method>* GetResolvedMethods() const {
return static_cast<ObjectArray<Method>*>(GetNonNull(kResolvedMethods));
}
ObjectArray<Field>* GetResolvedFields() const {
return static_cast<ObjectArray<Field>*>(GetNonNull(kResolvedFields));
}
ObjectArray<StaticStorageBase>* GetInitializedStaticStorage() const {
return static_cast<ObjectArray<StaticStorageBase>*>(GetNonNull(kInitializedStaticStorage));
}
static size_t LengthAsArray() {
return kMax;
}
private:
enum ArrayIndex {
kLocation = 0,
kStrings = 1,
kResolvedTypes = 2,
kResolvedMethods = 3,
kResolvedFields = 4,
kInitializedStaticStorage = 5,
kMax = 6,
};
Object* GetNonNull(ArrayIndex array_index) const {
Object* obj = Get(array_index);
DCHECK(obj != NULL);
return obj;
}
DISALLOW_IMPLICIT_CONSTRUCTORS(DexCache);
};
} // namespace art
#endif // ART_SRC_DEX_CACHE_H_