java_asm/
constants.rs

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    // Java ClassFile versions (the minor version is stored in the 16 most significant bits, and the
34    // major version in the 16 least significant bits).
35    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    /**
60     * Version flag indicating that the class is using 'preview' features.
61     *
62     * <p>{@code version & V_PREVIEW == V_PREVIEW} tests if a version is flagged with {@code
63     * V_PREVIEW}.
64    */
65    pub const V_PREVIEW: u32 = 0xFFFF0000;
66}
67
68// Access flags values, defined in
69// - https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.1-200-E.1
70// - https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.5-200-A.1
71// - https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.6-200-A.1
72// - https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.25
73#[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    // Possible values for the type operand of the NEWARRAY instruction.
156    // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-6.html#jvms-6.5.newarray.
157    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    // Possible values for the reference_kind field of CONSTANT_MethodHandle_info structures.
170    // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.4.8.
171    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    // The ClassFile attribute names, in the order they are defined in
185    // https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html#jvms-4.7-300.
186
187    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    // CP const
219    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}