Skip to content

Commit 12ef6c7

Browse files
committed
refactor!: refactor VM invoke interfaces to combine method name and method descriptor argument into a single method signature argument
1 parent d3034c6 commit 12ef6c7

File tree

13 files changed

+162
-146
lines changed

13 files changed

+162
-146
lines changed

ristretto_classloader/src/class.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ impl Class {
139139
let mut methods = HashMap::new();
140140
for class_file_method in &class_file.methods {
141141
let method = Method::from(&class_file, class_file_method)?;
142-
let method_identifier = method.identifier();
143-
methods.insert(method_identifier, Arc::new(method));
142+
let signature = method.signature();
143+
methods.insert(signature, Arc::new(method));
144144
}
145145

146146
if class_file.class_name()? == "java/lang/invoke/DirectMethodHandle$Holder" {
@@ -354,7 +354,7 @@ impl Class {
354354
attributes: vec![],
355355
};
356356
let method = Method::from(class_file, &method)?;
357-
methods.insert(method.identifier(), Arc::new(method));
357+
methods.insert(method.signature(), Arc::new(method));
358358
}
359359
Ok(())
360360
}
@@ -518,8 +518,8 @@ impl Class {
518518
{
519519
let name = name.as_ref();
520520
let descriptor = descriptor.as_ref();
521-
let method_identifier = format!("{name}:{descriptor}");
522-
if let Some(method) = self.methods.get(&method_identifier) {
521+
let signature = format!("{name}{descriptor}");
522+
if let Some(method) = self.methods.get(&signature) {
523523
return Some(method.clone());
524524
}
525525

@@ -533,8 +533,8 @@ impl Class {
533533
if class_name != *polymorphic_class_name || name != *polymorphic_method_name {
534534
continue;
535535
}
536-
let method_identifier = format!("{name}:{polymorphic_method_descriptor}");
537-
return self.methods.get(&method_identifier).cloned();
536+
let signature = format!("{name}:{polymorphic_method_descriptor}");
537+
return self.methods.get(&signature).cloned();
538538
}
539539

540540
None

ristretto_classloader/src/method.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,10 @@ impl Method {
128128
self.return_type.as_ref()
129129
}
130130

131-
/// Get the method identifier.
131+
/// Get the method signature.
132132
#[must_use]
133-
pub fn identifier(&self) -> String {
134-
format!("{}:{}", self.name, self.descriptor)
133+
pub fn signature(&self) -> String {
134+
format!("{}{}", self.name, self.descriptor)
135135
}
136136

137137
/// Get the maximum stack size.
@@ -233,7 +233,7 @@ mod tests {
233233
assert_eq!(method.access_flags(), &MethodAccessFlags::empty());
234234
assert_eq!(method.name(), "test");
235235
assert_eq!(method.descriptor(), "()V");
236-
assert_eq!(method.identifier(), "test:()V");
236+
assert_eq!(method.signature(), "test()V");
237237
assert!(method.parameters().is_empty());
238238
assert_eq!(method.return_type(), None);
239239
assert_eq!(method.max_stack, 1);

ristretto_vm/src/instruction/exception.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ mod test {
9898
let result = vm
9999
.invoke(
100100
"java.lang.Integer",
101-
"parseInt",
102-
"(Ljava/lang/String;)I",
101+
"parseInt(Ljava/lang/String;)I",
103102
&[value],
104103
)
105104
.await;

ristretto_vm/src/intrinsic_methods/java/lang/class.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,8 +1225,7 @@ mod tests {
12251225
let result = vm
12261226
.invoke(
12271227
"java.lang.reflect.Field",
1228-
"toString",
1229-
"()Ljava/lang/String;",
1228+
"toString()Ljava/lang/String;",
12301229
&[Value::from(reference.clone())],
12311230
)
12321231
.await?;
@@ -1266,8 +1265,7 @@ mod tests {
12661265
let result = vm
12671266
.invoke(
12681267
"java.lang.reflect.Method",
1269-
"getName",
1270-
"()Ljava/lang/String;",
1268+
"getName()Ljava/lang/String;",
12711269
&[Value::from(reference.clone())],
12721270
)
12731271
.await?;

ristretto_vm/src/intrinsic_methods/java/lang/system.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -271,12 +271,10 @@ pub(crate) async fn register_natives(
271271
thread: Arc<Thread>,
272272
_parameters: Parameters,
273273
) -> Result<Option<Value>> {
274-
let system_class = thread.class("java.lang.System").await?;
275274
let vm = thread.vm()?;
276275
if vm.java_major_version() <= JAVA_8.java() {
277-
let method = system_class.try_get_method("setJavaLangAccess", "()V")?;
278276
thread
279-
.execute(&system_class, &method, &[] as &[Value])
277+
.invoke("java.lang.System", "setJavaLangAccess()V", &[] as &[Value])
280278
.await?;
281279
return Ok(None);
282280
}
@@ -294,9 +292,12 @@ pub(crate) async fn register_natives(
294292
// System::getProperties()
295293
//
296294
// will eventually call System::getProperty() which fails if this is not initialized.
297-
let method = system_class.try_get_method("setProperties", "(Ljava/util/Properties;)V")?;
298295
thread
299-
.execute(&system_class, &method, &[Value::Object(None)])
296+
.invoke(
297+
"java.lang.System",
298+
"setProperties(Ljava/util/Properties;)V",
299+
&[Value::Object(None)],
300+
)
300301
.await?;
301302
}
302303

@@ -311,15 +312,13 @@ pub(crate) async fn register_natives(
311312
let java_lang_ref_access = java_lang_ref_access_class(&thread, package_name).await?;
312313
let java_lang_ref_access =
313314
Value::Object(Some(Reference::Object(Object::new(java_lang_ref_access)?)));
314-
let shared_secrets_class = thread
315-
.class(format!("{package_name}/SharedSecrets"))
316-
.await?;
317-
let method = shared_secrets_class.try_get_method(
318-
"setJavaLangRefAccess",
319-
format!("(L{package_name}/JavaLangRefAccess;)V"),
320-
)?;
315+
let shared_secrets_class = format!("{package_name}/SharedSecrets");
321316
thread
322-
.execute(&shared_secrets_class, &method, &[java_lang_ref_access])
317+
.invoke(
318+
&shared_secrets_class,
319+
format!("setJavaLangRefAccess(L{package_name}/JavaLangRefAccess;)V"),
320+
&[java_lang_ref_access],
321+
)
323322
.await?;
324323

325324
Ok(None)

ristretto_vm/src/intrinsic_methods/java/security/accesscontroller.rs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::thread::Thread;
44
use async_recursion::async_recursion;
55
use ristretto_classfile::VersionSpecification::{Between, LessThanOrEqual};
66
use ristretto_classfile::{JAVA_11, JAVA_21};
7-
use ristretto_classloader::{Class, Value};
7+
use ristretto_classloader::Value;
88
use ristretto_macros::intrinsic_method;
99
use std::sync::Arc;
1010

@@ -18,10 +18,13 @@ pub(crate) async fn do_privileged_1(
1818
mut parameters: Parameters,
1919
) -> Result<Option<Value>> {
2020
let object = parameters.pop_object()?;
21-
let class: Arc<Class> = object.class().clone();
22-
let method = class.try_get_method("run", "()Ljava/lang/Object;")?;
21+
let class_name = object.class().name().to_string();
2322
thread
24-
.execute(&class, &method, &[Value::from(object)])
23+
.invoke(
24+
&class_name,
25+
"run()Ljava/lang/Object;",
26+
&[Value::from(object)],
27+
)
2528
.await
2629
}
2730

@@ -36,10 +39,13 @@ pub(crate) async fn do_privileged_2(
3639
) -> Result<Option<Value>> {
3740
let _context = parameters.pop_object()?;
3841
let object = parameters.pop_object()?;
39-
let class: Arc<Class> = object.class().clone();
40-
let method = class.try_get_method("run", "()Ljava/lang/Object;")?;
42+
let class_name = object.class().name().to_string();
4143
thread
42-
.execute(&class, &method, &[Value::from(object)])
44+
.invoke(
45+
&class_name,
46+
"run()Ljava/lang/Object;",
47+
&[Value::from(object)],
48+
)
4349
.await
4450
}
4551

@@ -53,10 +59,13 @@ pub(crate) async fn do_privileged_3(
5359
mut parameters: Parameters,
5460
) -> Result<Option<Value>> {
5561
let object = parameters.pop_object()?;
56-
let class: Arc<Class> = object.class().clone();
57-
let method = class.try_get_method("run", "()Ljava/lang/Object;")?;
62+
let class_name = object.class().name().to_string();
5863
thread
59-
.execute(&class, &method, &[Value::from(object)])
64+
.invoke(
65+
&class_name,
66+
"run()Ljava/lang/Object;",
67+
&[Value::from(object)],
68+
)
6069
.await
6170
}
6271

@@ -71,10 +80,13 @@ pub(crate) async fn do_privileged_4(
7180
) -> Result<Option<Value>> {
7281
let _context = parameters.pop_object()?;
7382
let object = parameters.pop_object()?;
74-
let class: Arc<Class> = object.class().clone();
75-
let method = class.try_get_method("run", "()Ljava/lang/Object;")?;
83+
let class_name = object.class().name().to_string();
7684
thread
77-
.execute(&class, &method, &[Value::from(object)])
85+
.invoke(
86+
&class_name,
87+
"run()Ljava/lang/Object;",
88+
&[Value::from(object)],
89+
)
7890
.await
7991
}
8092

ristretto_vm/src/intrinsic_methods/jdk/internal/reflect/constantpool.rs

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,12 @@ pub(crate) async fn get_field_at_0(
117117
let field_name = constant_pool.try_get_utf8(*name_index)?;
118118
let field_name = field_name.to_object(&vm).await?;
119119

120-
let class = thread.class("java.lang.Class").await?;
121-
let method = class.try_get_method(
122-
"getDeclaredField",
123-
"(Ljava/lang/String;)Ljava/lang/reflect/Field;",
124-
)?;
125120
let field = thread
126-
.execute(&class, &method, &[class_object, field_name])
121+
.invoke(
122+
"java.lang.Class",
123+
"getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;",
124+
&[class_object, field_name],
125+
)
127126
.await?;
128127
Ok(field)
129128
}
@@ -268,27 +267,23 @@ pub(crate) async fn get_method_at_0(
268267
let parameter_type = parameter_type.to_object(&vm).await?;
269268
parameters_classes.push(parameter_type);
270269
}
271-
let class = thread.class("java/lang/Class").await?;
272-
let class_parameters = Value::try_from((class.clone(), parameters_classes))?;
270+
let class = thread.class("java.lang.Class").await?;
271+
let class_parameters = Value::try_from((class, parameters_classes))?;
273272

274273
let method = if method_name == "<init>" {
275-
let method = class.try_get_method(
276-
"getDeclaredConstructor",
277-
"([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",
278-
)?;
279274
thread
280-
.execute(&class, &method, &[class_object, class_parameters])
275+
.invoke(
276+
"java.lang.Class",
277+
"getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",
278+
&[class_object, class_parameters],
279+
)
281280
.await?
282281
} else {
283282
let method_name = method_name.to_object(&vm).await?;
284-
let method = class.try_get_method(
285-
"getDeclaredMethod",
286-
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;",
287-
)?;
288283
thread
289-
.execute(
290-
&class,
291-
&method,
284+
.invoke(
285+
"java.lang.Class",
286+
"getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;",
292287
&[class_object, method_name, class_parameters],
293288
)
294289
.await?
@@ -454,13 +449,13 @@ pub(crate) async fn get_tag_at_0(
454449
let class = class::get_class(&thread, &object).await?;
455450
let constant_pool = class.constant_pool();
456451
let constant = constant_pool.try_get(index)?;
457-
458-
let class = thread
459-
.class("jdk/internal/reflect/ConstantPool$Tag")
460-
.await?;
461-
let method = class.try_get_method("valueOf", "(B)Ljdk/internal/reflect/ConstantPool$Tag;")?;
462-
let tag = thread.execute(&class, &method, &[constant.tag()]).await?;
463-
Ok(tag)
452+
thread
453+
.invoke(
454+
"jdk.internal.reflect.ConstantPool$Tag",
455+
"valueOf(B)Ljdk/internal/reflect/ConstantPool$Tag;",
456+
&[constant.tag()],
457+
)
458+
.await
464459
}
465460

466461
#[intrinsic_method(

ristretto_vm/src/intrinsic_methods/jdk/internal/reflect/nativeconstructoraccessorimpl.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ pub(crate) mod tests {
6060
let constructor = vm
6161
.invoke(
6262
"java.lang.Class",
63-
"getDeclaredConstructor",
64-
"([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",
63+
"getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",
6564
&[integer_class_object, arguments],
6665
)
6766
.await?

ristretto_vm/src/intrinsic_methods/jdk/internal/reflect/nativemethodaccessorimpl.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ pub(crate) async fn invoke_0(
5151
let descriptor = format!("({parameters}){return_type_class}");
5252

5353
let method = class.try_get_method(name, descriptor)?;
54-
let result = thread.execute(&class, &method, &arguments).await?;
55-
Ok(result)
54+
thread.execute(&class, &method, &arguments).await
5655
}
5756

5857
#[cfg(test)]
@@ -75,8 +74,7 @@ pub(crate) mod tests {
7574
let method = vm
7675
.invoke(
7776
"java.lang.Class",
78-
"getDeclaredMethod",
79-
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;",
77+
"getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;",
8078
&[integer_class_object, method_name, arguments],
8179
)
8280
.await?

0 commit comments

Comments
 (0)