java_asm/dex/
constant.rs

1use crate::dex::raw::{DUByte, DUInt, DUShort};
2use crate::smali::SmaliTokensBuilder;
3use java_asm_macro::const_container;
4
5pub struct MapListTypeConst;
6
7#[const_container(DUShort)]
8impl MapListTypeConst {
9    pub const TYPE_HEADER_ITEM: DUShort = 0x0000;
10    pub const TYPE_STRING_ID_ITEM: DUShort = 0x0001;
11    pub const TYPE_TYPE_ID_ITEM: DUShort = 0x0002;
12    pub const TYPE_PROTO_ID_ITEM: DUShort = 0x0003;
13    pub const TYPE_FIELD_ID_ITEM: DUShort = 0x0004;
14    pub const TYPE_METHOD_ID_ITEM: DUShort = 0x0005;
15    pub const TYPE_CLASS_DEF_ITEM: DUShort = 0x0006;
16    pub const TYPE_CALL_SITE_ID_ITEM: DUShort = 0x0007;
17    pub const TYPE_METHOD_HANDLE_ITEM: DUShort = 0x0008;
18    pub const TYPE_MAP_LIST: DUShort = 0x1000;
19    pub const TYPE_TYPE_LIST: DUShort = 0x1001;
20    pub const TYPE_ANNOTATION_SET_REF_LIST: DUShort = 0x1002;
21    pub const TYPE_ANNOTATION_SET_ITEM: DUShort = 0x1003;
22    pub const TYPE_CLASS_DATA_ITEM: DUShort = 0x2000;
23    pub const TYPE_CODE_ITEM: DUShort = 0x2001;
24    pub const TYPE_STRING_DATA_ITEM: DUShort = 0x2002;
25    pub const TYPE_DEBUG_INFO_ITEM: DUShort = 0x2003;
26    pub const TYPE_ANNOTATION_ITEM: DUShort = 0x2004;
27    pub const TYPE_ENCODED_ARRAY_ITEM: DUShort = 0x2005;
28    pub const TYPE_ANNOTATIONS_DIRECTORY_ITEM: DUShort = 0x2006;
29    pub const TYPE_HIDDENAPI_CLASS_DATA_ITEM: DUShort = 0xF000;
30}
31
32pub struct AccessFlags;
33pub struct ClassAccessFlags; // class specific access flags
34pub struct MethodAccessFlags; // method specific access flags
35pub struct FieldAccessFlags; // field specific access flags
36
37#[const_container(DUInt)]
38impl AccessFlags {
39    pub const ACC_PUBLIC: DUInt = 0x0001;
40    pub const ACC_PRIVATE: DUInt = 0x0002;
41    pub const ACC_PROTECTED: DUInt = 0x0004;
42    pub const ACC_STATIC: DUInt = 0x0008;
43    pub const ACC_FINAL: DUInt = 0x0010;
44    pub const ACC_ABSTRACT: DUInt = 0x0400;
45    pub const UNUSED: DUInt = 0x8000;
46    pub const ACC_SYNTHETIC: DUInt = 0x1000;
47    pub const ACC_ENUM: DUInt = 0x4000;
48
49    pub fn render(access_flag: DUInt, mut tb: SmaliTokensBuilder) -> SmaliTokensBuilder {
50        if access_flag & Self::ACC_PUBLIC != 0 { tb = tb.raw("public"); }
51        if access_flag & Self::ACC_PRIVATE != 0 { tb = tb.raw("private"); }
52        if access_flag & Self::ACC_PROTECTED != 0 { tb = tb.raw("protected"); }
53        if access_flag & Self::ACC_STATIC != 0 { tb = tb.raw("static"); }
54        if access_flag & Self::ACC_FINAL != 0 { tb = tb.raw("final"); }
55        if access_flag & Self::ACC_ABSTRACT != 0 { tb = tb.raw("abstract"); }
56        if access_flag & Self::ACC_SYNTHETIC != 0 { tb = tb.raw("synthetic"); }
57        if access_flag & Self::ACC_ENUM != 0 { tb = tb.raw("enum"); }
58        tb
59    }
60}
61
62#[const_container(DUInt)]
63impl ClassAccessFlags {
64    pub const ACC_PUBLIC: DUInt = AccessFlags::ACC_PUBLIC;
65    pub const ACC_PRIVATE: DUInt = AccessFlags::ACC_PRIVATE;
66    pub const ACC_PROTECTED: DUInt = AccessFlags::ACC_PROTECTED;
67    pub const ACC_STATIC: DUInt = AccessFlags::ACC_STATIC;
68    pub const ACC_FINAL: DUInt = AccessFlags::ACC_FINAL;
69    pub const ACC_INTERFACE: DUInt = 0x0200;
70    pub const ACC_ABSTRACT: DUInt = AccessFlags::ACC_ABSTRACT;
71    pub const ACC_SYNTHETIC: DUInt = AccessFlags::ACC_SYNTHETIC;
72    pub const ACC_ANNOTATION: DUInt = 0x2000;
73    pub const ACC_ENUM: DUInt = AccessFlags::ACC_ENUM;
74
75    pub fn render(access_flag: DUInt, mut tb: SmaliTokensBuilder) -> SmaliTokensBuilder {
76        tb = AccessFlags::render(access_flag, tb);
77        if access_flag & Self::ACC_INTERFACE != 0 { tb = tb.raw("interface"); }
78        if access_flag & Self::ACC_ANNOTATION != 0 { tb = tb.raw("annotation"); }
79        tb
80    }
81}
82
83#[const_container(DUInt)]
84impl MethodAccessFlags {
85    pub const ACC_PUBLIC: DUInt = AccessFlags::ACC_PUBLIC;
86    pub const ACC_PRIVATE: DUInt = AccessFlags::ACC_PRIVATE;
87    pub const ACC_PROTECTED: DUInt = AccessFlags::ACC_PROTECTED;
88    pub const ACC_STATIC: DUInt = AccessFlags::ACC_STATIC;
89    pub const ACC_FINAL: DUInt = AccessFlags::ACC_FINAL;
90    pub const ACC_SYNCHRONIZED: DUInt = 0x0020;
91    pub const ACC_BRIDGE: DUInt = 0x0040;
92    pub const ACC_VARARGS: DUInt = 0x0080;
93    pub const ACC_NATIVE: DUInt = 0x0100;
94    pub const ACC_ABSTRACT: DUInt = AccessFlags::ACC_ABSTRACT;
95    pub const ACC_STRICT: DUInt = 0x0800;
96    pub const ACC_SYNTHETIC: DUInt = AccessFlags::ACC_SYNTHETIC;
97    pub const ACC_CONSTRUCTOR: DUInt = 0x10000;
98    pub const ACC_DECLARED_SYNCHRONIZED: DUInt = 0x20000;
99
100    pub fn render(access_flag: DUInt, mut tb: SmaliTokensBuilder) -> SmaliTokensBuilder {
101        tb = AccessFlags::render(access_flag, tb);
102        if access_flag & Self::ACC_SYNCHRONIZED != 0 { tb = tb.raw("synchronized"); }
103        if access_flag & Self::ACC_BRIDGE != 0 { tb = tb.raw("bridge"); }
104        if access_flag & Self::ACC_VARARGS != 0 { tb = tb.raw("varargs"); }
105        if access_flag & Self::ACC_NATIVE != 0 { tb = tb.raw("native"); }
106        if access_flag & Self::ACC_STRICT != 0 { tb = tb.raw("strict"); }
107        if access_flag & Self::ACC_CONSTRUCTOR != 0 { tb = tb.raw("constructor"); }
108        if access_flag & Self::ACC_DECLARED_SYNCHRONIZED != 0 { tb = tb.raw("declared-synchronized"); }
109        tb
110    }
111}
112
113#[const_container(DUInt)]
114impl FieldAccessFlags {
115    pub const ACC_PUBLIC: DUInt = AccessFlags::ACC_PUBLIC;
116    pub const ACC_PRIVATE: DUInt = AccessFlags::ACC_PRIVATE;
117    pub const ACC_PROTECTED: DUInt = AccessFlags::ACC_PROTECTED;
118    pub const ACC_STATIC: DUInt = AccessFlags::ACC_STATIC;
119    pub const ACC_FINAL: DUInt = AccessFlags::ACC_FINAL;
120    pub const ACC_VOLATILE: DUInt = 0x0040;
121    pub const ACC_TRANSIENT: DUInt = 0x0080;
122    pub const ACC_SYNTHETIC: DUInt = AccessFlags::ACC_SYNTHETIC;
123    pub const ACC_ENUM: DUInt = 0x4000;
124
125    pub fn render(access_flag: DUInt, mut tb: SmaliTokensBuilder) -> SmaliTokensBuilder {
126        tb = AccessFlags::render(access_flag, tb);
127        if access_flag & Self::ACC_VOLATILE != 0 { tb = tb.raw("volatile"); }
128        if access_flag & Self::ACC_TRANSIENT != 0 { tb = tb.raw("transient"); }
129        if access_flag & Self::ACC_ENUM != 0 { tb = tb.raw("enum"); }
130        tb
131    }
132}
133
134pub struct EncodedValueType;
135#[const_container(DUByte)]
136impl EncodedValueType {
137    pub const VALUE_BYTE: DUByte = 0x00;
138    pub const VALUE_SHORT: DUByte = 0x02;
139    pub const VALUE_CHAR: DUByte = 0x03;
140    pub const VALUE_INT: DUByte = 0x04;
141    pub const VALUE_LONG: DUByte = 0x06;
142    pub const VALUE_FLOAT: DUByte = 0x10;
143    pub const VALUE_DOUBLE: DUByte = 0x11;
144    pub const VALUE_METHOD_TYPE: DUByte = 0x15;
145    pub const VALUE_METHOD_HANDLE: DUByte = 0x16;
146    pub const VALUE_STRING: DUByte = 0x17;
147    pub const VALUE_TYPE: DUByte = 0x18;
148    pub const VALUE_FIELD: DUByte = 0x19;
149    pub const VALUE_METHOD: DUByte = 0x1a;
150    pub const VALUE_ENUM: DUByte = 0x1b;
151    pub const VALUE_ARRAY: DUByte = 0x1c;
152    pub const VALUE_ANNOTATION: DUByte = 0x1d;
153    pub const VALUE_NULL: DUByte = 0x1e;
154    pub const VALUE_BOOLEAN: DUByte = 0x1f;
155}
156
157pub struct MethodHandleType;
158
159#[const_container(DUShort)]
160impl MethodHandleType {
161    pub const H_STATIC_PUT: DUShort = 0x00;
162    pub const H_STATIC_GET: DUShort = 0x01;
163    pub const H_INSTANCE_PUT: DUShort = 0x02;
164    pub const H_INSTANCE_GET: DUShort = 0x03;
165    pub const H_INVOKE_STATIC: DUShort = 0x04;
166    pub const H_INVOKE_INSTANCE: DUShort = 0x05;
167    pub const H_INVOKE_CONSTRUCTOR: DUShort = 0x06;
168    pub const H_INVOKE_DIRECT: DUShort = 0x07;
169    pub const H_INVOKE_INTERFACE: DUShort = 0x08;
170}