blob: 96321b54f5c479b6ddf06e74e55a4887f298a988 [file] [log] [blame]
Mathieu Chartier641a3af2017-12-15 11:42:58 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_RUNTIME_CODE_ITEM_ACCESSORS_NO_ART_INL_H_
18#define ART_RUNTIME_CODE_ITEM_ACCESSORS_NO_ART_INL_H_
19
20#include "code_item_accessors.h"
21
22#include "cdex/compact_dex_file.h"
23#include "dex_file-inl.h"
24#include "standard_dex_file.h"
25
26// The no ART version is used by binaries that don't include the whole runtime.
27
28namespace art {
29
30inline void CodeItemInstructionAccessor::Init(const CompactDexFile::CodeItem& code_item) {
31 insns_size_in_code_units_ = code_item.insns_size_in_code_units_;
32 insns_ = code_item.insns_;
33}
34
35inline void CodeItemInstructionAccessor::Init(const StandardDexFile::CodeItem& code_item) {
36 insns_size_in_code_units_ = code_item.insns_size_in_code_units_;
37 insns_ = code_item.insns_;
38}
39
40inline void CodeItemInstructionAccessor::Init(const DexFile* dex_file,
41 const DexFile::CodeItem* code_item) {
42 DCHECK(dex_file != nullptr);
43 DCHECK(code_item != nullptr);
44 if (dex_file->IsCompactDexFile()) {
45 Init(down_cast<const CompactDexFile::CodeItem&>(*code_item));
46 } else {
47 DCHECK(dex_file->IsStandardDexFile());
48 Init(down_cast<const StandardDexFile::CodeItem&>(*code_item));
49 }
50}
51
52inline CodeItemInstructionAccessor::CodeItemInstructionAccessor(
53 const DexFile* dex_file,
54 const DexFile::CodeItem* code_item) {
55 Init(dex_file, code_item);
56}
57
58inline DexInstructionIterator CodeItemInstructionAccessor::begin() const {
59 return DexInstructionIterator(insns_, 0u);
60}
61
62inline DexInstructionIterator CodeItemInstructionAccessor::end() const {
63 return DexInstructionIterator(insns_, insns_size_in_code_units_);
64}
65
66inline void CodeItemDataAccessor::Init(const CompactDexFile::CodeItem& code_item) {
67 CodeItemInstructionAccessor::Init(code_item);
68 registers_size_ = code_item.registers_size_;
69 ins_size_ = code_item.ins_size_;
70 outs_size_ = code_item.outs_size_;
71 tries_size_ = code_item.tries_size_;
72}
73
74inline void CodeItemDataAccessor::Init(const StandardDexFile::CodeItem& code_item) {
75 CodeItemInstructionAccessor::Init(code_item);
76 registers_size_ = code_item.registers_size_;
77 ins_size_ = code_item.ins_size_;
78 outs_size_ = code_item.outs_size_;
79 tries_size_ = code_item.tries_size_;
80}
81
82inline void CodeItemDataAccessor::Init(const DexFile* dex_file,
83 const DexFile::CodeItem* code_item) {
84 DCHECK(dex_file != nullptr);
85 DCHECK(code_item != nullptr);
86 if (dex_file->IsCompactDexFile()) {
87 CodeItemDataAccessor::Init(down_cast<const CompactDexFile::CodeItem&>(*code_item));
88 } else {
89 DCHECK(dex_file->IsStandardDexFile());
90 CodeItemDataAccessor::Init(down_cast<const StandardDexFile::CodeItem&>(*code_item));
91 }
92}
93
94inline CodeItemDataAccessor::CodeItemDataAccessor(const DexFile* dex_file,
95 const DexFile::CodeItem* code_item) {
96 Init(dex_file, code_item);
97}
98
99inline CodeItemDataAccessor CodeItemDataAccessor::CreateNullable(
100 const DexFile* dex_file,
101 const DexFile::CodeItem* code_item) {
102 CodeItemDataAccessor ret;
103 if (code_item != nullptr) {
104 ret.Init(dex_file, code_item);
105 } else {
106 DCHECK(!ret.HasCodeItem()) << "Should be null initialized";
107 }
108 return ret;
109}
110
111inline IterationRange<const DexFile::TryItem*> CodeItemDataAccessor::TryItems() const {
112 const DexFile::TryItem* try_items = DexFile::GetTryItems(end(), 0u);
113 return {
114 try_items,
115 try_items + TriesSize() };
116}
117
118inline const uint8_t* CodeItemDataAccessor::GetCatchHandlerData(size_t offset) const {
119 return DexFile::GetCatchHandlerData(end(), TriesSize(), offset);
120}
121
122inline const DexFile::TryItem* CodeItemDataAccessor::FindTryItem(uint32_t try_dex_pc) const {
123 IterationRange<const DexFile::TryItem*> try_items(TryItems());
124 int32_t index = DexFile::FindTryItem(try_items.begin(),
125 try_items.end() - try_items.begin(),
126 try_dex_pc);
127 return index != -1 ? &try_items.begin()[index] : nullptr;
128}
129
130inline void CodeItemDebugInfoAccessor::Init(const DexFile* dex_file,
131 const DexFile::CodeItem* code_item,
132 uint32_t debug_info_offset) {
133 dex_file_ = dex_file;
134 debug_info_offset_ = debug_info_offset;
135 if (dex_file->IsCompactDexFile()) {
136 Init(down_cast<const CompactDexFile::CodeItem&>(*code_item));
137 } else {
138 DCHECK(dex_file->IsStandardDexFile());
139 Init(down_cast<const StandardDexFile::CodeItem&>(*code_item));
140 }
141}
142
143inline void CodeItemDebugInfoAccessor::Init(const CompactDexFile::CodeItem& code_item) {
144 CodeItemDataAccessor::Init(code_item);
145}
146
147inline void CodeItemDebugInfoAccessor::Init(const StandardDexFile::CodeItem& code_item) {
148 CodeItemDataAccessor::Init(code_item);
149}
150
151template<typename NewLocalCallback>
152inline bool CodeItemDebugInfoAccessor::DecodeDebugLocalInfo(bool is_static,
153 uint32_t method_idx,
154 NewLocalCallback new_local,
155 void* context) const {
156 return dex_file_->DecodeDebugLocalInfo(RegistersSize(),
157 InsSize(),
158 InsnsSizeInCodeUnits(),
159 DebugInfoOffset(),
160 is_static,
161 method_idx,
162 new_local,
163 context);
164}
165
166
167} // namespace art
168
169#endif // ART_RUNTIME_CODE_ITEM_ACCESSORS_NO_ART_INL_H_