diff options
Diffstat (limited to 'disassembler_dex.h')
-rw-r--r-- | disassembler_dex.h | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/disassembler_dex.h b/disassembler_dex.h index 2038a3c..d9d93b2 100644 --- a/disassembler_dex.h +++ b/disassembler_dex.h @@ -24,6 +24,7 @@ namespace zucchini { class DisassemblerDex : public Disassembler { public: + static constexpr uint16_t kVersion = 1; // Pools follow canonical order. enum ReferencePool : uint8_t { kStringId, @@ -32,8 +33,8 @@ class DisassemblerDex : public Disassembler { kFieldId, kMethodId, // kClassDef, // Unused - // kCallSiteId, // Unused - // kMethodHandle, // Unused + kCallSiteId, + kMethodHandle, kTypeList, kAnnotationSetRefList, kAnnotionSet, @@ -43,7 +44,7 @@ class DisassemblerDex : public Disassembler { kAnnotation, kEncodedArray, kAnnotationsDirectory, - // kCallSite, // Unused + kCallSite, kNumPools }; @@ -69,15 +70,22 @@ class DisassemblerDex : public Disassembler { kTypeListToTypeId, kCodeToTypeId, - kMethodIdToProtoId, // kProtoId + kCodeToProtoId, // kProtoId + kMethodIdToProtoId, kCodeToFieldId, // kFieldId + kMethodHandleToFieldId, kAnnotationsDirectoryToFieldId, kCodeToMethodId, // kMethodId + kMethodHandleToMethodId, kAnnotationsDirectoryToMethodId, kAnnotationsDirectoryToParameterMethodId, + kCodeToCallSiteId, // kCallSiteId + + kCodeToMethodHandle, // kMethodHandle + kProtoIdToParametersTypeList, // kTypeList kClassDefToInterfacesTypeList, @@ -102,10 +110,7 @@ class DisassemblerDex : public Disassembler { kClassDefToAnnotationDirectory, // kAnnotationsDirectory - // Intentionally ignored references (never appeared in test corpus). - // kMethodHandleToFieldId, - // kMethodHandleToMethodId, - // kCallSiteIdToCallSite, + kCallSiteIdToCallSite, // kCallSite kNumTypes }; @@ -172,6 +177,13 @@ class DisassemblerDex : public Disassembler { std::unique_ptr<ReferenceReader> MakeReadClassDefToStaticValuesEncodedArray( offset_t lo, offset_t hi); + std::unique_ptr<ReferenceReader> MakeReadCallSiteIdToCallSite32(offset_t lo, + offset_t hi); + std::unique_ptr<ReferenceReader> MakeReadMethodHandleToFieldId16(offset_t lo, + offset_t hi); + std::unique_ptr<ReferenceReader> MakeReadMethodHandleToMethodId16( + offset_t lo, + offset_t hi); std::unique_ptr<ReferenceReader> MakeReadTypeListToTypeId16(offset_t lo, offset_t hi); std::unique_ptr<ReferenceReader> MakeReadAnnotationSetToAnnotation( @@ -203,10 +215,16 @@ class DisassemblerDex : public Disassembler { offset_t hi); std::unique_ptr<ReferenceReader> MakeReadCodeToTypeId16(offset_t lo, offset_t hi); + std::unique_ptr<ReferenceReader> MakeReadCodeToProtoId16(offset_t lo, + offset_t hi); std::unique_ptr<ReferenceReader> MakeReadCodeToFieldId16(offset_t lo, offset_t hi); std::unique_ptr<ReferenceReader> MakeReadCodeToMethodId16(offset_t lo, offset_t hi); + std::unique_ptr<ReferenceReader> MakeReadCodeToCallSiteId16(offset_t lo, + offset_t hi); + std::unique_ptr<ReferenceReader> MakeReadCodeToMethodHandle16(offset_t lo, + offset_t hi); std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode8(offset_t lo, offset_t hi); std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode16(offset_t lo, @@ -225,6 +243,10 @@ class DisassemblerDex : public Disassembler { std::unique_ptr<ReferenceWriter> MakeWriteFieldId32(MutableBufferView image); std::unique_ptr<ReferenceWriter> MakeWriteMethodId16(MutableBufferView image); std::unique_ptr<ReferenceWriter> MakeWriteMethodId32(MutableBufferView image); + std::unique_ptr<ReferenceWriter> MakeWriteCallSiteId16( + MutableBufferView image); + std::unique_ptr<ReferenceWriter> MakeWriteMethodHandle16( + MutableBufferView image); std::unique_ptr<ReferenceWriter> MakeWriteRelCode8(MutableBufferView image); std::unique_ptr<ReferenceWriter> MakeWriteRelCode16(MutableBufferView image); std::unique_ptr<ReferenceWriter> MakeWriteRelCode32(MutableBufferView image); @@ -248,12 +270,12 @@ class DisassemblerDex : public Disassembler { dex::MapItem field_map_item_ = {}; dex::MapItem method_map_item_ = {}; dex::MapItem class_def_map_item_ = {}; + dex::MapItem call_site_map_item_ = {}; + dex::MapItem method_handle_map_item_ = {}; dex::MapItem type_list_map_item_ = {}; - dex::MapItem code_map_item_ = {}; - - // Optionally supported (not all DEX files have these). dex::MapItem annotation_set_ref_list_map_item_ = {}; dex::MapItem annotation_set_map_item_ = {}; + dex::MapItem code_map_item_ = {}; dex::MapItem annotations_directory_map_item_ = {}; // Sorted list of offsets of parsed items in |image_|. |