blob: bef5c0de434be38f77f5238a62c392bf73fb0851 [file] [log] [blame]
David Sehr7629f602016-08-07 16:01:51 -07001/*
2 * Copyright (C) 2016 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 * Header file of an in-memory representation of DEX files.
17 */
18
19#ifndef ART_DEXLAYOUT_DEX_IR_H_
20#define ART_DEXLAYOUT_DEX_IR_H_
21
22#include <iostream>
23#include <map>
24#include <vector>
25#include <stdint.h>
26
27#include "dex_file.h"
28
29namespace art {
30namespace dex_ir {
31
32// Forward declarations for classes used in containers or pointed to.
33class AnnotationsDirectoryItem;
34class AnnotationSetItem;
35class ArrayItem;
36class ClassData;
37class ClassDef;
38class CodeItem;
39class DebugInfoItem;
40class FieldId;
41class FieldItem;
42class Header;
43class MapList;
44class MapItem;
45class MethodId;
46class MethodItem;
47class ProtoId;
48class StringId;
49class TryItem;
50class TypeId;
51
52// Visitor support
53class AbstractDispatcher {
54 public:
55 AbstractDispatcher() = default;
56 virtual ~AbstractDispatcher() { }
57
58 virtual void Dispatch(Header* header) = 0;
59 virtual void Dispatch(const StringId* string_id) = 0;
60 virtual void Dispatch(const TypeId* type_id) = 0;
61 virtual void Dispatch(const ProtoId* proto_id) = 0;
62 virtual void Dispatch(const FieldId* field_id) = 0;
63 virtual void Dispatch(const MethodId* method_id) = 0;
64 virtual void Dispatch(ClassData* class_data) = 0;
65 virtual void Dispatch(ClassDef* class_def) = 0;
66 virtual void Dispatch(FieldItem* field_item) = 0;
67 virtual void Dispatch(MethodItem* method_item) = 0;
68 virtual void Dispatch(ArrayItem* array_item) = 0;
69 virtual void Dispatch(CodeItem* code_item) = 0;
70 virtual void Dispatch(TryItem* try_item) = 0;
71 virtual void Dispatch(DebugInfoItem* debug_info_item) = 0;
72 virtual void Dispatch(AnnotationSetItem* annotation_set_item) = 0;
73 virtual void Dispatch(AnnotationsDirectoryItem* annotations_directory_item) = 0;
74 virtual void Dispatch(MapList* map_list) = 0;
75 virtual void Dispatch(MapItem* map_item) = 0;
76
77 private:
78 DISALLOW_COPY_AND_ASSIGN(AbstractDispatcher);
79};
80
81// Collections become owners of the objects added by moving them into unique pointers.
82template<class T> class CollectionWithOffset {
83 public:
84 CollectionWithOffset() = default;
85 std::vector<std::unique_ptr<T>>& Collection() { return collection_; }
86 // Read-time support methods
87 void AddWithPosition(uint32_t position, T* object) {
88 collection_.push_back(std::unique_ptr<T>(object));
89 collection_.back()->SetOffset(position);
90 }
91 // Ordinary object insertion into collection.
92 void Insert(T object ATTRIBUTE_UNUSED) {
93 // TODO(sehr): add ordered insertion support.
94 UNIMPLEMENTED(FATAL) << "Insertion not ready";
95 }
96 uint32_t GetOffset() const { return offset_; }
97 void SetOffset(uint32_t new_offset) { offset_ = new_offset; }
98 uint32_t Size() const { return collection_.size(); }
99
100 private:
101 std::vector<std::unique_ptr<T>> collection_;
102 uint32_t offset_ = 0;
103 DISALLOW_COPY_AND_ASSIGN(CollectionWithOffset);
104};
105
106class Item {
107 public:
108 virtual ~Item() { }
109 uint32_t GetOffset() const { return offset_; }
110 void SetOffset(uint32_t offset) { offset_ = offset; }
111 protected:
112 uint32_t offset_ = 0;
113};
114
115class Header : public Item {
116 public:
117 explicit Header(const DexFile& dex_file);
118 ~Header() OVERRIDE { }
119
120 const DexFile& GetDexFile() const { return dex_file_; }
121
122 const uint8_t* Magic() const { return magic_; }
123 uint32_t Checksum() const { return checksum_; }
124 const uint8_t* Signature() const { return signature_; }
125 uint32_t EndianTag() const { return endian_tag_; }
126 uint32_t FileSize() const { return file_size_; }
127 uint32_t HeaderSize() const { return header_size_; }
128 uint32_t LinkSize() const { return link_size_; }
129 uint32_t LinkOffset() const { return link_offset_; }
130 uint32_t DataSize() const { return data_size_; }
131 uint32_t DataOffset() const { return data_offset_; }
132
133 void SetChecksum(uint32_t new_checksum) { checksum_ = new_checksum; }
134 void SetSignature(const uint8_t* new_signature) {
135 memcpy(signature_, new_signature, sizeof(signature_));
136 }
137 void SetFileSize(uint32_t new_file_size) { file_size_ = new_file_size; }
138 void SetHeaderSize(uint32_t new_header_size) { header_size_ = new_header_size; }
139 void SetLinkSize(uint32_t new_link_size) { link_size_ = new_link_size; }
140 void SetLinkOffset(uint32_t new_link_offset) { link_offset_ = new_link_offset; }
141 void SetDataSize(uint32_t new_data_size) { data_size_ = new_data_size; }
142 void SetDataOffset(uint32_t new_data_offset) { data_offset_ = new_data_offset; }
143
144 // Collections.
145 std::vector<std::unique_ptr<StringId>>& StringIds() { return string_ids_.Collection(); }
146 std::vector<std::unique_ptr<TypeId>>& TypeIds() { return type_ids_.Collection(); }
147 std::vector<std::unique_ptr<ProtoId>>& ProtoIds() { return proto_ids_.Collection(); }
148 std::vector<std::unique_ptr<FieldId>>& FieldIds() { return field_ids_.Collection(); }
149 std::vector<std::unique_ptr<MethodId>>& MethodIds() { return method_ids_.Collection(); }
150 std::vector<std::unique_ptr<ClassDef>>& ClassDefs() { return class_defs_.Collection(); }
151 uint32_t StringIdsOffset() const { return string_ids_.GetOffset(); }
152 uint32_t TypeIdsOffset() const { return type_ids_.GetOffset(); }
153 uint32_t ProtoIdsOffset() const { return proto_ids_.GetOffset(); }
154 uint32_t FieldIdsOffset() const { return field_ids_.GetOffset(); }
155 uint32_t MethodIdsOffset() const { return method_ids_.GetOffset(); }
156 uint32_t ClassDefsOffset() const { return class_defs_.GetOffset(); }
157 void SetStringIdsOffset(uint32_t new_offset) { string_ids_.SetOffset(new_offset); }
158 void SetTypeIdsOffset(uint32_t new_offset) { type_ids_.SetOffset(new_offset); }
159 void SetProtoIdsOffset(uint32_t new_offset) { proto_ids_.SetOffset(new_offset); }
160 void SetFieldIdsOffset(uint32_t new_offset) { field_ids_.SetOffset(new_offset); }
161 void SetMethodIdsOffset(uint32_t new_offset) { method_ids_.SetOffset(new_offset); }
162 void SetClassDefsOffset(uint32_t new_offset) { class_defs_.SetOffset(new_offset); }
163 uint32_t StringIdsSize() const { return string_ids_.Size(); }
164 uint32_t TypeIdsSize() const { return type_ids_.Size(); }
165 uint32_t ProtoIdsSize() const { return proto_ids_.Size(); }
166 uint32_t FieldIdsSize() const { return field_ids_.Size(); }
167 uint32_t MethodIdsSize() const { return method_ids_.Size(); }
168 uint32_t ClassDefsSize() const { return class_defs_.Size(); }
169
170 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
171
172 private:
173 const DexFile& dex_file_;
174 uint8_t magic_[8];
175 uint32_t checksum_;
176 uint8_t signature_[DexFile::kSha1DigestSize];
177 uint32_t endian_tag_;
178 uint32_t file_size_;
179 uint32_t header_size_;
180 uint32_t link_size_;
181 uint32_t link_offset_;
182 uint32_t data_size_;
183 uint32_t data_offset_;
184
185 CollectionWithOffset<StringId> string_ids_;
186 CollectionWithOffset<TypeId> type_ids_;
187 CollectionWithOffset<ProtoId> proto_ids_;
188 CollectionWithOffset<FieldId> field_ids_;
189 CollectionWithOffset<MethodId> method_ids_;
190 CollectionWithOffset<ClassDef> class_defs_;
191 DISALLOW_COPY_AND_ASSIGN(Header);
192};
193
194class StringId : public Item {
195 public:
196 StringId(const DexFile::StringId& disk_string_id, Header& header) :
197 data_(strdup(header.GetDexFile().GetStringData(disk_string_id))) {
198 }
199 ~StringId() OVERRIDE { }
200
201 const char* Data() const { return data_.get(); }
202
203 void Accept(AbstractDispatcher* dispatch) const { dispatch->Dispatch(this); }
204
205 private:
206 std::unique_ptr<const char> data_;
207 DISALLOW_COPY_AND_ASSIGN(StringId);
208};
209
210class TypeId : public Item {
211 public:
212 TypeId(const DexFile::TypeId& disk_type_id, Header& header) :
213 string_id_(header.StringIds()[disk_type_id.descriptor_idx_].get()) {
214 }
215 ~TypeId() OVERRIDE { }
216
217 StringId* GetStringId() const { return string_id_; }
218
219 void Accept(AbstractDispatcher* dispatch) const { dispatch->Dispatch(this); }
220
221 private:
222 StringId* string_id_;
223 DISALLOW_COPY_AND_ASSIGN(TypeId);
224};
225
226class ProtoId : public Item {
227 public:
228 ProtoId(const DexFile::ProtoId& disk_proto_id, Header& header) {
229 shorty_ = header.StringIds()[disk_proto_id.shorty_idx_].get();
230 return_type_ = header.TypeIds()[disk_proto_id.return_type_idx_].get();
231 DexFileParameterIterator dfpi(header.GetDexFile(), disk_proto_id);
232 while (dfpi.HasNext()) {
233 parameters_.push_back(header.TypeIds()[dfpi.GetTypeIdx()].get());
234 dfpi.Next();
235 }
236 }
237 ~ProtoId() OVERRIDE { }
238
239 const StringId* Shorty() const { return shorty_; }
240 const TypeId* ReturnType() const { return return_type_; }
241 const std::vector<const TypeId*>& Parameters() const { return parameters_; }
242
243 void Accept(AbstractDispatcher* dispatch) const { dispatch->Dispatch(this); }
244
245 private:
246 const StringId* shorty_;
247 const TypeId* return_type_;
248 std::vector<const TypeId*> parameters_;
249 DISALLOW_COPY_AND_ASSIGN(ProtoId);
250};
251
252class FieldId : public Item {
253 public:
254 FieldId(const DexFile::FieldId& disk_field_id, Header& header) {
255 class_ = header.TypeIds()[disk_field_id.class_idx_].get();
256 type_ = header.TypeIds()[disk_field_id.type_idx_].get();
257 name_ = header.StringIds()[disk_field_id.name_idx_].get();
258 }
259 ~FieldId() OVERRIDE { }
260
261 const TypeId* Class() const { return class_; }
262 const TypeId* Type() const { return type_; }
263 const StringId* Name() const { return name_; }
264
265 void Accept(AbstractDispatcher* dispatch) const { dispatch->Dispatch(this); }
266
267 private:
268 const TypeId* class_;
269 const TypeId* type_;
270 const StringId* name_;
271 DISALLOW_COPY_AND_ASSIGN(FieldId);
272};
273
274class MethodId : public Item {
275 public:
276 MethodId(const DexFile::MethodId& disk_method_id, Header& header) {
277 class_ = header.TypeIds()[disk_method_id.class_idx_].get();
278 proto_ = header.ProtoIds()[disk_method_id.proto_idx_].get();
279 name_ = header.StringIds()[disk_method_id.name_idx_].get();
280 }
281 ~MethodId() OVERRIDE { }
282
283 const TypeId* Class() const { return class_; }
284 const ProtoId* Proto() const { return proto_; }
285 const StringId* Name() const { return name_; }
286
287 void Accept(AbstractDispatcher* dispatch) const { dispatch->Dispatch(this); }
288
289 private:
290 const TypeId* class_;
291 const ProtoId* proto_;
292 const StringId* name_;
293 DISALLOW_COPY_AND_ASSIGN(MethodId);
294};
295
296class FieldItem : public Item {
297 public:
298 FieldItem(uint32_t access_flags, const FieldId* field_id) :
299 access_flags_(access_flags), field_id_(field_id) { }
300 ~FieldItem() OVERRIDE { }
301
302 uint32_t GetAccessFlags() const { return access_flags_; }
303 const FieldId* GetFieldId() const { return field_id_; }
304
305 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
306
307 private:
308 uint32_t access_flags_;
309 const FieldId* field_id_;
310 DISALLOW_COPY_AND_ASSIGN(FieldItem);
311};
312
313class MethodItem : public Item {
314 public:
315 MethodItem(uint32_t access_flags, const MethodId* method_id, const CodeItem* code) :
316 access_flags_(access_flags), method_id_(method_id), code_(code) { }
317 ~MethodItem() OVERRIDE { }
318
319 uint32_t GetAccessFlags() const { return access_flags_; }
320 const MethodId* GetMethodId() const { return method_id_; }
321 const CodeItem* GetCodeItem() const { return code_.get(); }
322
323 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
324
325 private:
326 uint32_t access_flags_;
327 const MethodId* method_id_;
328 std::unique_ptr<const CodeItem> code_;
329 DISALLOW_COPY_AND_ASSIGN(MethodItem);
330};
331
332class ArrayItem : public Item {
333 public:
334 class NameValuePair {
335 public:
336 NameValuePair(StringId* name, ArrayItem* value) :
337 name_(name), value_(value) { }
338
339 StringId* Name() const { return name_; }
340 ArrayItem* Value() const { return value_.get(); }
341
342 private:
343 StringId* name_;
344 std::unique_ptr<ArrayItem> value_;
345 DISALLOW_COPY_AND_ASSIGN(NameValuePair);
346 };
347
348 ArrayItem(Header& header, const uint8_t** data, uint8_t type, uint8_t length);
349 ArrayItem(Header& header, const uint8_t** data);
350 ~ArrayItem() OVERRIDE { }
351
352 int8_t Type() const { return type_; }
353 bool GetBoolean() const { return item_.bool_val_; }
354 int8_t GetByte() const { return item_.byte_val_; }
355 int16_t GetShort() const { return item_.short_val_; }
356 uint16_t GetChar() const { return item_.char_val_; }
357 int32_t GetInt() const { return item_.int_val_; }
358 int64_t GetLong() const { return item_.long_val_; }
359 float GetFloat() const { return item_.float_val_; }
360 double GetDouble() const { return item_.double_val_; }
361 StringId* GetStringId() const { return item_.string_val_; }
362 FieldId* GetFieldId() const { return item_.field_val_; }
363 MethodId* GetMethodId() const { return item_.method_val_; }
364 std::vector<std::unique_ptr<ArrayItem>>* GetAnnotationArray() const {
365 return item_.annotation_array_val_;
366 }
367 StringId* GetAnnotationAnnotationString() const {
368 return item_.annotation_annotation_val_.string_;
369 }
370 std::vector<std::unique_ptr<NameValuePair>>* GetAnnotationAnnotationNameValuePairArray() const {
371 return item_.annotation_annotation_val_.array_;
372 }
373
374 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
375
376 private:
377 void Read(Header& header, const uint8_t** data, uint8_t type, uint8_t length);
378 uint8_t type_;
379 union {
380 bool bool_val_;
381 int8_t byte_val_;
382 int16_t short_val_;
383 uint16_t char_val_;
384 int32_t int_val_;
385 int64_t long_val_;
386 float float_val_;
387 double double_val_;
388 StringId* string_val_;
389 FieldId* field_val_;
390 MethodId* method_val_;
391 std::vector<std::unique_ptr<ArrayItem>>* annotation_array_val_;
392 struct {
393 StringId* string_;
394 std::vector<std::unique_ptr<NameValuePair>>* array_;
395 } annotation_annotation_val_;
396 } item_;
397 DISALLOW_COPY_AND_ASSIGN(ArrayItem);
398};
399
400class ClassData : public Item {
401 public:
402 ClassData() = default;
403 ~ClassData() OVERRIDE = default;
404 std::vector<std::unique_ptr<FieldItem>>& StaticFields() { return static_fields_; }
405 std::vector<std::unique_ptr<FieldItem>>& InstanceFields() { return instance_fields_; }
406 std::vector<std::unique_ptr<MethodItem>>& DirectMethods() { return direct_methods_; }
407 std::vector<std::unique_ptr<MethodItem>>& VirtualMethods() { return virtual_methods_; }
408
409 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
410
411 private:
412 std::vector<std::unique_ptr<FieldItem>> static_fields_;
413 std::vector<std::unique_ptr<FieldItem>> instance_fields_;
414 std::vector<std::unique_ptr<MethodItem>> direct_methods_;
415 std::vector<std::unique_ptr<MethodItem>> virtual_methods_;
416 DISALLOW_COPY_AND_ASSIGN(ClassData);
417};
418
419class ClassDef : public Item {
420 public:
421 ClassDef(const DexFile::ClassDef& disk_class_def, Header& header);
422 ~ClassDef() OVERRIDE { }
423
424 const TypeId* ClassType() const { return class_type_; }
425 uint32_t GetAccessFlags() const { return access_flags_; }
426 const TypeId* Superclass() const { return superclass_; }
427 std::vector<TypeId*>* Interfaces() { return &interfaces_; }
428 uint32_t InterfacesOffset() const { return interfaces_offset_; }
429 void SetInterfacesOffset(uint32_t new_offset) { interfaces_offset_ = new_offset; }
430 const StringId* SourceFile() const { return source_file_; }
431 AnnotationsDirectoryItem* Annotations() const { return annotations_.get(); }
432 std::vector<std::unique_ptr<ArrayItem>>* StaticValues() { return static_values_; }
433 ClassData* GetClassData() { return &class_data_; }
434
435 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
436
437 private:
438 const TypeId* class_type_;
439 uint32_t access_flags_;
440 const TypeId* superclass_;
441 std::vector<TypeId*> interfaces_;
442 uint32_t interfaces_offset_;
443 const StringId* source_file_;
444 std::unique_ptr<AnnotationsDirectoryItem> annotations_;
445 std::vector<std::unique_ptr<ArrayItem>>* static_values_;
446 ClassData class_data_;
447 DISALLOW_COPY_AND_ASSIGN(ClassDef);
448};
449
450class CodeItem : public Item {
451 public:
452 CodeItem(const DexFile::CodeItem& disk_code_item, Header& header);
453 ~CodeItem() OVERRIDE { }
454
455 uint16_t RegistersSize() const { return registers_size_; }
456 uint16_t InsSize() const { return ins_size_; }
457 uint16_t OutsSize() const { return outs_size_; }
458 uint16_t TriesSize() const { return tries_size_; }
459 DebugInfoItem* DebugInfo() const { return debug_info_.get(); }
460 uint32_t InsnsSize() const { return insns_size_; }
461 uint16_t* Insns() const { return insns_.get(); }
462 std::vector<std::unique_ptr<const TryItem>>* Tries() const { return tries_; }
463
464 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
465
466 private:
467 uint16_t registers_size_;
468 uint16_t ins_size_;
469 uint16_t outs_size_;
470 uint16_t tries_size_;
471 std::unique_ptr<DebugInfoItem> debug_info_;
472 uint32_t insns_size_;
473 std::unique_ptr<uint16_t[]> insns_;
474 std::vector<std::unique_ptr<const TryItem>>* tries_;
475 DISALLOW_COPY_AND_ASSIGN(CodeItem);
476};
477
478class TryItem : public Item {
479 public:
480 class CatchHandler {
481 public:
482 CatchHandler(const TypeId* type_id, uint32_t address) : type_id_(type_id), address_(address) { }
483
484 const TypeId* GetTypeId() const { return type_id_; }
485 uint32_t GetAddress() const { return address_; }
486
487 private:
488 const TypeId* type_id_;
489 uint32_t address_;
490 DISALLOW_COPY_AND_ASSIGN(CatchHandler);
491 };
492
493 TryItem(const DexFile::TryItem& disk_try_item,
494 const DexFile::CodeItem& disk_code_item,
495 Header& header) {
496 start_addr_ = disk_try_item.start_addr_;
497 insn_count_ = disk_try_item.insn_count_;
498 for (CatchHandlerIterator it(disk_code_item, disk_try_item); it.HasNext(); it.Next()) {
499 const uint16_t type_index = it.GetHandlerTypeIndex();
500 const TypeId* type_id = type_index != DexFile::kDexNoIndex16 ?
501 header.TypeIds()[type_index].get() : nullptr;
502 handlers_.push_back(std::unique_ptr<const CatchHandler>(
503 new CatchHandler(type_id, it.GetHandlerAddress())));
504 }
505 }
506 ~TryItem() OVERRIDE { }
507
508 uint32_t StartAddr() const { return start_addr_; }
509 uint16_t InsnCount() const { return insn_count_; }
510 const std::vector<std::unique_ptr<const CatchHandler>>& GetHandlers() const { return handlers_; }
511
512 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
513
514 private:
515 uint32_t start_addr_;
516 uint16_t insn_count_;
517 std::vector<std::unique_ptr<const CatchHandler>> handlers_;
518 DISALLOW_COPY_AND_ASSIGN(TryItem);
519};
520
521
522struct PositionInfo {
523 PositionInfo(uint32_t address, uint32_t line) : address_(address), line_(line) { }
524
525 uint32_t address_;
526 uint32_t line_;
527};
528
529struct LocalInfo {
530 LocalInfo(const char* name, const char* descriptor, const char* signature, uint32_t start_address,
531 uint32_t end_address, uint16_t reg) :
532 name_(name), descriptor_(descriptor), signature_(signature), start_address_(start_address),
533 end_address_(end_address), reg_(reg) { }
534
535 std::string name_;
536 std::string descriptor_;
537 std::string signature_;
538 uint32_t start_address_;
539 uint32_t end_address_;
540 uint16_t reg_;
541};
542
543class DebugInfoItem : public Item {
544 public:
545 DebugInfoItem() = default;
546
547 std::vector<std::unique_ptr<PositionInfo>>& GetPositionInfo() { return positions_; }
548 std::vector<std::unique_ptr<LocalInfo>>& GetLocalInfo() { return locals_; }
549
550 private:
551 std::vector<std::unique_ptr<PositionInfo>> positions_;
552 std::vector<std::unique_ptr<LocalInfo>> locals_;
553 DISALLOW_COPY_AND_ASSIGN(DebugInfoItem);
554};
555
556class AnnotationSetItem : public Item {
557 public:
558 class AnnotationItem {
559 public:
560 AnnotationItem(uint8_t visibility, ArrayItem* item) :
561 visibility_(visibility), item_(item) { }
562
563 uint8_t GetVisibility() const { return visibility_; }
564 ArrayItem* GetItem() const { return item_.get(); }
565
566 private:
567 uint8_t visibility_;
568 std::unique_ptr<ArrayItem> item_;
569 DISALLOW_COPY_AND_ASSIGN(AnnotationItem);
570 };
571
572 AnnotationSetItem(const DexFile::AnnotationSetItem& disk_annotations_item, Header& header);
573 ~AnnotationSetItem() OVERRIDE { }
574
575 std::vector<std::unique_ptr<AnnotationItem>>& GetItems() { return items_; }
576
577 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
578
579 private:
580 std::vector<std::unique_ptr<AnnotationItem>> items_;
581 DISALLOW_COPY_AND_ASSIGN(AnnotationSetItem);
582};
583
584class AnnotationsDirectoryItem : public Item {
585 public:
586 class FieldAnnotation {
587 public:
588 FieldAnnotation(FieldId* field_id, AnnotationSetItem* annotation_set_item) :
589 field_id_(field_id), annotation_set_item_(annotation_set_item) { }
590
591 FieldId* GetFieldId() const { return field_id_; }
592 AnnotationSetItem* GetAnnotationSetItem() const { return annotation_set_item_.get(); }
593
594 private:
595 FieldId* field_id_;
596 std::unique_ptr<AnnotationSetItem> annotation_set_item_;
597 DISALLOW_COPY_AND_ASSIGN(FieldAnnotation);
598 };
599
600 class MethodAnnotation {
601 public:
602 MethodAnnotation(MethodId* method_id, AnnotationSetItem* annotation_set_item) :
603 method_id_(method_id), annotation_set_item_(annotation_set_item) { }
604
605 MethodId* GetMethodId() const { return method_id_; }
606 AnnotationSetItem* GetAnnotationSetItem() const { return annotation_set_item_.get(); }
607
608 private:
609 MethodId* method_id_;
610 std::unique_ptr<AnnotationSetItem> annotation_set_item_;
611 DISALLOW_COPY_AND_ASSIGN(MethodAnnotation);
612 };
613
614 class ParameterAnnotation {
615 public:
616 ParameterAnnotation(MethodId* method_id,
617 const DexFile::AnnotationSetRefList* annotation_set_ref_list,
618 Header& header) :
619 method_id_(method_id) {
620 for (uint32_t i = 0; i < annotation_set_ref_list->size_; ++i) {
621 const DexFile::AnnotationSetItem* annotation_set_item =
622 header.GetDexFile().GetSetRefItemItem(&annotation_set_ref_list->list_[i]);
623 annotations_.push_back(std::unique_ptr<AnnotationSetItem>(
624 new AnnotationSetItem(*annotation_set_item, header)));
625 }
626 }
627
628 MethodId* GetMethodId() const { return method_id_; }
629 std::vector<std::unique_ptr<AnnotationSetItem>>& GetAnnotations() { return annotations_; }
630
631 private:
632 MethodId* method_id_;
633 std::vector<std::unique_ptr<AnnotationSetItem>> annotations_;
634 DISALLOW_COPY_AND_ASSIGN(ParameterAnnotation);
635 };
636
637 AnnotationsDirectoryItem(const DexFile::AnnotationsDirectoryItem* disk_annotations_item,
638 Header& header);
639
640 AnnotationSetItem* GetClassAnnotation() const { return class_annotation_.get(); }
641
642 std::vector<std::unique_ptr<FieldAnnotation>>& GetFieldAnnotations() {
643 return field_annotations_;
644 }
645
646 std::vector<std::unique_ptr<MethodAnnotation>>& GetMethodAnnotations() {
647 return method_annotations_;
648 }
649
650 std::vector<std::unique_ptr<ParameterAnnotation>>& GetParameterAnnotations() {
651 return parameter_annotations_;
652 }
653
654 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
655
656 private:
657 std::unique_ptr<AnnotationSetItem> class_annotation_;
658 std::vector<std::unique_ptr<FieldAnnotation>> field_annotations_;
659 std::vector<std::unique_ptr<MethodAnnotation>> method_annotations_;
660 std::vector<std::unique_ptr<ParameterAnnotation>> parameter_annotations_;
661 DISALLOW_COPY_AND_ASSIGN(AnnotationsDirectoryItem);
662};
663
664// TODO(sehr): implement MapList.
665class MapList : public Item {
666 public:
667 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
668
669 private:
670 DISALLOW_COPY_AND_ASSIGN(MapList);
671};
672
673class MapItem : public Item {
674 public:
675 void Accept(AbstractDispatcher* dispatch) { dispatch->Dispatch(this); }
676
677 private:
678 DISALLOW_COPY_AND_ASSIGN(MapItem);
679};
680
681} // namespace dex_ir
682} // namespace art
683
684#endif // ART_DEXLAYOUT_DEX_IR_H_