1use java_asm_macro::const_container;
2
3pub trait ConstContainer {
4 type ConstType: ToString + Copy;
5 fn const_name(c: Self::ConstType) -> Option<&'static str>;
6
7 #[inline]
8 fn const_name_or_default(c: Self::ConstType, prefix: &'static str) -> String {
9 match Self::const_name(c) {
10 Some(c) => c.to_string(),
11 None => format!("{prefix}_{}", c.to_string()),
12 }
13 }
14}
15
16pub struct Constants;
17
18pub struct JavaVersions;
19
20pub struct JavaAccessFlags;
21pub struct JavaClassAccessFlags;
22pub struct JavaMethodAccessFlags;
23pub struct JavaFieldAccessFlags;
24pub struct JavaParameterAccessFlags;
25pub struct JavaModuleAccessFlags;
26pub struct JavaModuleRequireAccessFlags;
27
28pub struct NewArrayTypeOperand;
29pub struct MethodHandleKind;
30
31#[const_container(u32)]
32impl JavaVersions {
33 pub const V1_1: u32 = 3 << 16 | 45;
36 pub const V1_2: u32 = 0 << 16 | 46;
37 pub const V1_3: u32 = 0 << 16 | 47;
38 pub const V1_4: u32 = 0 << 16 | 48;
39 pub const V1_5: u32 = 0 << 16 | 49;
40 pub const V1_6: u32 = 0 << 16 | 50;
41 pub const V1_7: u32 = 0 << 16 | 51;
42 pub const V1_8: u32 = 0 << 16 | 52;
43 pub const V9: u32 = 0 << 16 | 53;
44 pub const V10: u32 = 0 << 16 | 54;
45 pub const V11: u32 = 0 << 16 | 55;
46 pub const V12: u32 = 0 << 16 | 56;
47 pub const V13: u32 = 0 << 16 | 57;
48 pub const V14: u32 = 0 << 16 | 58;
49 pub const V15: u32 = 0 << 16 | 59;
50 pub const V16: u32 = 0 << 16 | 60;
51 pub const V17: u32 = 0 << 16 | 61;
52 pub const V18: u32 = 0 << 16 | 62;
53 pub const V19: u32 = 0 << 16 | 63;
54 pub const V20: u32 = 0 << 16 | 64;
55 pub const V21: u32 = 0 << 16 | 65;
56 pub const V22: u32 = 0 << 16 | 66;
57 pub const V23: u32 = 0 << 16 | 67;
58
59 pub const V_PREVIEW: u32 = 0xFFFF0000;
66}
67
68#[const_container(u16)]
74impl JavaAccessFlags {
75 pub const ACC_PUBLIC: u16 = 0x0001;
76 pub const ACC_PRIVATE: u16 = 0x0002;
77 pub const ACC_PROTECTED: u16 = 0x0004;
78 pub const ACC_STATIC: u16 = 0x0008;
79 pub const ACC_FINAL: u16 = 0x0010;
80 pub const ACC_ABSTRACT: u16 = 0x0400;
81 pub const ACC_SYNTHETIC: u16 = 0x1000;
82 pub const ACC_ENUM: u16 = 0x4000;
83}
84
85#[const_container(u16)]
86impl JavaClassAccessFlags {
87 pub const ACC_PUBLIC: u16 = JavaAccessFlags::ACC_PUBLIC;
88 pub const ACC_PRIVATE: u16 = JavaAccessFlags::ACC_PRIVATE;
89 pub const ACC_PROTECTED: u16 = JavaAccessFlags::ACC_PROTECTED;
90 pub const ACC_FINAL: u16 = JavaAccessFlags::ACC_FINAL;
91 pub const ACC_SUPER: u16 = 0x0020;
92 pub const ACC_INTERFACE: u16 = 0x0200;
93 pub const ACC_ABSTRACT: u16 = JavaAccessFlags::ACC_ABSTRACT;
94 pub const ACC_SYNTHETIC: u16 = JavaAccessFlags::ACC_SYNTHETIC;
95 pub const ACC_ANNOTATION: u16 = 0x2000;
96 pub const ACC_ENUM: u16 = JavaAccessFlags::ACC_ENUM;
97 pub const ACC_MODULE: u16 = 0x8000;
98}
99
100#[const_container(u16)]
101impl JavaMethodAccessFlags {
102 pub const ACC_PUBLIC: u16 = JavaAccessFlags::ACC_PUBLIC;
103 pub const ACC_PRIVATE: u16 = JavaAccessFlags::ACC_PRIVATE;
104 pub const ACC_PROTECTED: u16 = JavaAccessFlags::ACC_PROTECTED;
105 pub const ACC_STATIC: u16 = JavaAccessFlags::ACC_STATIC;
106 pub const ACC_FINAL: u16 = JavaAccessFlags::ACC_FINAL;
107 pub const ACC_SYNCHRONIZED: u16 = 0x0020;
108 pub const ACC_BRIDGE: u16 = 0x0040;
109 pub const ACC_VARARGS: u16 = 0x0080;
110 pub const ACC_NATIVE: u16 = 0x0100;
111 pub const ACC_ABSTRACT: u16 = JavaAccessFlags::ACC_ABSTRACT;
112 pub const ACC_STRICT: u16 = 0x0800;
113 pub const ACC_SYNTHETIC: u16 = JavaAccessFlags::ACC_SYNTHETIC;
114 pub const ACC_MANDATED: u16 = 0x8000;
115}
116
117#[const_container(u16)]
118impl JavaFieldAccessFlags {
119 pub const ACC_PUBLIC: u16 = JavaAccessFlags::ACC_PUBLIC;
120 pub const ACC_PRIVATE: u16 = JavaAccessFlags::ACC_PRIVATE;
121 pub const ACC_PROTECTED: u16 = JavaAccessFlags::ACC_PROTECTED;
122 pub const ACC_STATIC: u16 = JavaAccessFlags::ACC_STATIC;
123 pub const ACC_FINAL: u16 = JavaAccessFlags::ACC_FINAL;
124 pub const ACC_VOLATILE: u16 = 0x0040;
125 pub const ACC_TRANSIENT: u16 = 0x0080;
126 pub const ACC_SYNTHETIC: u16 = JavaAccessFlags::ACC_SYNTHETIC;
127 pub const ACC_ENUM: u16 = JavaAccessFlags::ACC_ENUM;
128 pub const ACC_MANDATED: u16 = 0x8000;
129}
130
131#[const_container(u16)]
132impl JavaParameterAccessFlags {
133 pub const ACC_FINAL: u16 = JavaAccessFlags::ACC_FINAL;
134 pub const ACC_SYNTHETIC: u16 = JavaAccessFlags::ACC_SYNTHETIC;
135 pub const ACC_MANDATED: u16 = 0x8000;
136}
137
138#[const_container(u16)]
139impl JavaModuleAccessFlags {
140 pub const ACC_OPEN: u16 = 0x0020;
141 pub const ACC_SYNTHETIC: u16 = JavaAccessFlags::ACC_SYNTHETIC;
142 pub const ACC_MANDATED: u16 = 0x8000;
143}
144
145#[const_container(u16)]
146impl JavaModuleRequireAccessFlags {
147 pub const ACC_TRANSITIVE: u16 = 0x0020;
148 pub const ACC_STATIC_PHASE: u16 = 0x0040;
149 pub const ACC_SYNTHETIC: u16 = JavaAccessFlags::ACC_SYNTHETIC;
150 pub const ACC_MANDATED: u16 = 0x8000;
151}
152
153#[const_container(u8)]
154impl NewArrayTypeOperand {
155 pub const T_BOOLEAN: u8 = 4;
158 pub const T_CHAR: u8 = 5;
159 pub const T_FLOAT: u8 = 6;
160 pub const T_DOUBLE: u8 = 7;
161 pub const T_BYTE: u8 = 8;
162 pub const T_SHORT: u8 = 9;
163 pub const T_INT: u8 = 10;
164 pub const T_LONG: u8 = 11;
165}
166
167#[const_container(u8)]
168impl MethodHandleKind {
169 pub const H_GETFIELD: u8 = 1;
172 pub const H_GETSTATIC: u8 = 2;
173 pub const H_PUTFIELD: u8 = 3;
174 pub const H_PUTSTATIC: u8 = 4;
175 pub const H_INVOKEVIRTUAL: u8 = 5;
176 pub const H_INVOKESTATIC: u8 = 6;
177 pub const H_INVOKESPECIAL: u8 = 7;
178 pub const H_NEWINVOKESPECIAL: u8 = 8;
179 pub const H_INVOKEINTERFACE: u8 = 9;
180}
181
182#[allow(non_upper_case_globals)]
183impl Constants {
184 pub const CONSTANT_VALUE: &'static str = "ConstantValue";
188 pub const CODE: &'static str = "Code";
189 pub const STACK_MAP_TABLE: &'static str = "StackMapTable";
190 pub const EXCEPTIONS: &'static str = "Exceptions";
191 pub const INNER_CLASSES: &'static str = "InnerClasses";
192 pub const ENCLOSING_METHOD: &'static str = "EnclosingMethod";
193 pub const SYNTHETIC: &'static str = "Synthetic";
194 pub const SIGNATURE: &'static str = "Signature";
195 pub const SOURCE_FILE: &'static str = "SourceFile";
196 pub const SOURCE_DEBUG_EXTENSION: &'static str = "SourceDebugExtension";
197 pub const LINE_NUMBER_TABLE: &'static str = "LineNumberTable";
198 pub const LOCAL_VARIABLE_TABLE: &'static str = "LocalVariableTable";
199 pub const LOCAL_VARIABLE_TYPE_TABLE: &'static str = "LocalVariableTypeTable";
200 pub const DEPRECATED: &'static str = "Deprecated";
201 pub const RUNTIME_VISIBLE_ANNOTATIONS: &'static str = "RuntimeVisibleAnnotations";
202 pub const RUNTIME_INVISIBLE_ANNOTATIONS: &'static str = "RuntimeInvisibleAnnotations";
203 pub const RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS: &'static str = "RuntimeVisibleParameterAnnotations";
204 pub const RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS: &'static str = "RuntimeInvisibleParameterAnnotations";
205 pub const RUNTIME_VISIBLE_TYPE_ANNOTATIONS: &'static str = "RuntimeVisibleTypeAnnotations";
206 pub const RUNTIME_INVISIBLE_TYPE_ANNOTATIONS: &'static str = "RuntimeInvisibleTypeAnnotations";
207 pub const ANNOTATION_DEFAULT: &'static str = "AnnotationDefault";
208 pub const BOOTSTRAP_METHODS: &'static str = "BootstrapMethods";
209 pub const METHOD_PARAMETERS: &'static str = "MethodParameters";
210 pub const MODULE: &'static str = "Module";
211 pub const MODULE_PACKAGES: &'static str = "ModulePackages";
212 pub const MODULE_MAIN_CLASS: &'static str = "ModuleMainClass";
213 pub const NEST_HOST: &'static str = "NestHost";
214 pub const NEST_MEMBERS: &'static str = "NestMembers";
215 pub const PERMITTED_SUBCLASSES: &'static str = "PermittedSubclasses";
216 pub const RECORD: &'static str = "Record";
217
218 pub const CONSTANT_Invalid: u8 = 0;
220 pub const CONSTANT_Utf8: u8 = 1;
221 pub const CONSTANT_Integer: u8 = 3;
222 pub const CONSTANT_Float: u8 = 4;
223 pub const CONSTANT_Long: u8 = 5;
224 pub const CONSTANT_Double: u8 = 6;
225 pub const CONSTANT_Class: u8 = 7;
226 pub const CONSTANT_String: u8 = 8;
227 pub const CONSTANT_Fieldref: u8 = 9;
228 pub const CONSTANT_Methodref: u8 = 10;
229 pub const CONSTANT_InterfaceMethodref: u8 = 11;
230 pub const CONSTANT_NameAndType: u8 = 12;
231 pub const CONSTANT_MethodHandle: u8 = 15;
232 pub const CONSTANT_MethodType: u8 = 16;
233 pub const CONSTANT_Dynamic: u8 = 17;
234 pub const CONSTANT_InvokeDynamic: u8 = 18;
235 pub const CONSTANT_Module: u8 = 19;
236 pub const CONSTANT_Package: u8 = 20;
237
238 pub const OBJECT_INTERNAL_NAME: &'static str = "java/lang/Object";
239}