@@ -104,6 +104,14 @@ impl Class {
104104 }
105105 }
106106
107+ #[ expect( clippy:: single_match) ]
108+ match class_file. class_name ( ) ? {
109+ "java/lang/invoke/MemberName" => {
110+ Self :: add_synthetic_fields ( & mut class_file, & [ ( "vmindex" , "Ljava/lang/Object;" ) ] ) ?;
111+ }
112+ _ => { }
113+ }
114+
107115 let mut static_fields = Vec :: new ( ) ;
108116 let mut static_values = Vec :: new ( ) ;
109117 let mut object_fields = Vec :: new ( ) ;
@@ -177,6 +185,28 @@ impl Class {
177185 Ok ( class)
178186 }
179187
188+ /// Add synthetic fields for the class. Ensures no duplicates are added.
189+ fn add_synthetic_fields (
190+ class_file : & mut ClassFile ,
191+ field_signatures : & [ ( & str , & str ) ] ,
192+ ) -> Result < ( ) > {
193+ for ( name, descriptor) in field_signatures {
194+ let constant_pool = & mut class_file. constant_pool ;
195+ let name_index = constant_pool. add_utf8 ( name) ?;
196+ let descriptor_index = constant_pool. add_utf8 ( descriptor) ?;
197+ let field_type = ristretto_classfile:: FieldType :: parse ( descriptor) ?;
198+ let field = ristretto_classfile:: Field {
199+ access_flags : FieldAccessFlags :: PRIVATE | FieldAccessFlags :: SYNTHETIC ,
200+ name_index,
201+ descriptor_index,
202+ field_type,
203+ attributes : vec ! [ ] ,
204+ } ;
205+ class_file. fields . push ( field) ;
206+ }
207+ Ok ( ( ) )
208+ }
209+
180210 /// Add synthetic methods for the class. This is used to add methods that are not present in
181211 /// the class file, but are required for the class to function correctly.
182212 fn add_synthetic_methods (
@@ -192,8 +222,10 @@ impl Class {
192222 constant_pool. try_get_method_ref ( method_index) ?;
193223 let ( name_index, descriptor_index) =
194224 constant_pool. try_get_name_and_type ( * name_and_type_index) ?;
195- let access_flags =
196- MethodAccessFlags :: PRIVATE | MethodAccessFlags :: STATIC | MethodAccessFlags :: NATIVE ;
225+ let access_flags = MethodAccessFlags :: PRIVATE
226+ | MethodAccessFlags :: STATIC
227+ | MethodAccessFlags :: NATIVE
228+ | MethodAccessFlags :: SYNTHETIC ;
197229 let method = ristretto_classfile:: Method {
198230 name_index : * name_index,
199231 descriptor_index : * descriptor_index,
0 commit comments