Skip to content

Commit 497438b

Browse files
Merge pull request #555 from theseus-rs/add-membername-vmindex
feat: add java/lang/invoke/MemberName.vmindex
2 parents 55c7ffa + 216c321 commit 497438b

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

ristretto_classloader/src/class.rs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

ristretto_vm/src/intrinsic_methods/java/lang/invoke/methodhandlenatives.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,10 @@ async fn resolve_method(
334334
member_handles
335335
.insert(method_signature, method.into())
336336
.await?;
337-
let _vmindex = method_descriptor.to_object(thread).await?;
337+
let vmindex = method_descriptor.to_object(thread).await?;
338338
let mut member_self = member_self.as_object_mut()?;
339339
member_self.set_value("flags", Value::from(flags))?;
340-
// member_self.set_value("vmindex", vmindex)?;
340+
member_self.set_value("vmindex", vmindex)?;
341341
}
342342
Ok(Some(member_self))
343343
}
@@ -386,10 +386,10 @@ async fn resolve_field(
386386
member_handles
387387
.insert(field_signature.clone(), field_offset.into())
388388
.await?;
389-
let _vmindex = field_signature.to_object(thread).await?;
389+
let vmindex = field_signature.to_object(thread).await?;
390390
let mut member_self = member_self.as_object_mut()?;
391391
member_self.set_value("flags", Value::from(flags))?;
392-
// member_self.set_value("vmindex", vmindex)?;
392+
member_self.set_value("vmindex", vmindex)?;
393393
}
394394
Ok(Some(member_self))
395395
}

0 commit comments

Comments
 (0)