122d5e735f403c57525fe868304c7123f0ce66399Ian Rogers/* 222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * Copyright (C) 2011 The Android Open Source Project 322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * 422d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 522d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * you may not use this file except in compliance with the License. 622d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * You may obtain a copy of the License at 722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * 822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * 1022d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * Unless required by applicable law or agreed to in writing, software 1122d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 1222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * See the License for the specific language governing permissions and 1422d5e735f403c57525fe868304c7123f0ce66399Ian Rogers * limitations under the License. 1522d5e735f403c57525fe868304c7123f0ce66399Ian Rogers */ 1622d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 1722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "field_helper.h" 1822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 1922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "class_linker-inl.h" 2022d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "dex_file.h" 2122d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "mirror/dex_cache.h" 2222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "runtime.h" 2322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers#include "thread-inl.h" 2422d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 2522d5e735f403c57525fe868304c7123f0ce66399Ian Rogersnamespace art { 2622d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 2722d5e735f403c57525fe868304c7123f0ce66399Ian Rogersmirror::Class* FieldHelper::GetType(bool resolve) { 2822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers uint32_t field_index = field_->GetDexFieldIndex(); 2922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers if (UNLIKELY(field_->GetDeclaringClass()->IsProxyClass())) { 3022d5e735f403c57525fe868304c7123f0ce66399Ian Rogers return Runtime::Current()->GetClassLinker()->FindSystemClass(Thread::Current(), 3122d5e735f403c57525fe868304c7123f0ce66399Ian Rogers field_->GetTypeDescriptor()); 3222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers } 3322d5e735f403c57525fe868304c7123f0ce66399Ian Rogers const DexFile* dex_file = field_->GetDexFile(); 3422d5e735f403c57525fe868304c7123f0ce66399Ian Rogers const DexFile::FieldId& field_id = dex_file->GetFieldId(field_index); 3522d5e735f403c57525fe868304c7123f0ce66399Ian Rogers mirror::Class* type = field_->GetDexCache()->GetResolvedType(field_id.type_idx_); 3622d5e735f403c57525fe868304c7123f0ce66399Ian Rogers if (resolve && (type == nullptr)) { 3722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers type = Runtime::Current()->GetClassLinker()->ResolveType(field_id.type_idx_, field_.Get()); 3822d5e735f403c57525fe868304c7123f0ce66399Ian Rogers CHECK(type != nullptr || Thread::Current()->IsExceptionPending()); 3922d5e735f403c57525fe868304c7123f0ce66399Ian Rogers } 4022d5e735f403c57525fe868304c7123f0ce66399Ian Rogers return type; 4122d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} 4222d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 4322d5e735f403c57525fe868304c7123f0ce66399Ian Rogersconst char* FieldHelper::GetDeclaringClassDescriptor() { 44cb6b0f31ede2275e79e6199ec391147585a37a2aIan Rogers return field_->GetDeclaringClass()->GetDescriptor(&declaring_class_descriptor_); 4522d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} 4622d5e735f403c57525fe868304c7123f0ce66399Ian Rogers 4722d5e735f403c57525fe868304c7123f0ce66399Ian Rogers} // namespace art 48