Skip to content

Commit e7b5675

Browse files
Merge pull request #425 from theseus-rs/fix-invokes
fix: use thread execute for internal vm calls
2 parents 6b64acc + 583e8fc commit e7b5675

File tree

2 files changed

+45
-45
lines changed

2 files changed

+45
-45
lines changed

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

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -271,15 +271,13 @@ 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?;
274275
let vm = thread.vm()?;
275276
if vm.java_major_version() <= JAVA_8.java() {
276-
vm.invoke(
277-
"java.lang.System",
278-
"setJavaLangAccess",
279-
"()V",
280-
&[] as &[Value],
281-
)
282-
.await?;
277+
let method = system_class.try_get_method("setJavaLangAccess", "()V")?;
278+
thread
279+
.execute(&system_class, &method, &[] as &[Value])
280+
.await?;
283281
return Ok(None);
284282
}
285283

@@ -296,13 +294,10 @@ pub(crate) async fn register_natives(
296294
// System::getProperties()
297295
//
298296
// will eventually call System::getProperty() which fails if this is not initialized.
299-
vm.invoke(
300-
"java.lang.System",
301-
"setProperties",
302-
"(Ljava/util/Properties;)V",
303-
&[Value::Object(None)],
304-
)
305-
.await?;
297+
let method = system_class.try_get_method("setProperties", "(Ljava/util/Properties;)V")?;
298+
thread
299+
.execute(&system_class, &method, &[Value::Object(None)])
300+
.await?;
306301
}
307302

308303
let java_major_version = vm.java_major_version();
@@ -316,13 +311,16 @@ pub(crate) async fn register_natives(
316311
let java_lang_ref_access = java_lang_ref_access_class(&thread, package_name).await?;
317312
let java_lang_ref_access =
318313
Value::Object(Some(Reference::Object(Object::new(java_lang_ref_access)?)));
319-
vm.invoke(
320-
format!("{package_name}/SharedSecrets"),
314+
let shared_secrets_class = thread
315+
.class(format!("{package_name}/SharedSecrets"))
316+
.await?;
317+
let method = shared_secrets_class.try_get_method(
321318
"setJavaLangRefAccess",
322319
format!("(L{package_name}/JavaLangRefAccess;)V"),
323-
&[java_lang_ref_access],
324-
)
325-
.await?;
320+
)?;
321+
thread
322+
.execute(&shared_secrets_class, &method, &[java_lang_ref_access])
323+
.await?;
326324

327325
Ok(None)
328326
}

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

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,14 @@ pub(crate) async fn get_field_at_0(
116116
constant_pool.try_get_name_and_type(*name_and_type_index)?;
117117
let field_name = constant_pool.try_get_utf8(*name_index)?;
118118
let field_name = field_name.to_object(&vm).await?;
119-
let field = vm
120-
.invoke(
121-
"java.lang.Class",
122-
"getDeclaredField",
123-
"(Ljava/lang/String;)Ljava/lang/reflect/Field;",
124-
&[class_object, field_name],
125-
)
119+
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+
)?;
125+
let field = thread
126+
.execute(&class, &method, &[class_object, field_name])
126127
.await?;
127128
Ok(field)
128129
}
@@ -268,25 +269,29 @@ pub(crate) async fn get_method_at_0(
268269
parameters_classes.push(parameter_type);
269270
}
270271
let class = thread.class("java/lang/Class").await?;
271-
let class_parameters = Value::try_from((class, parameters_classes))?;
272+
let class_parameters = Value::try_from((class.clone(), parameters_classes))?;
272273

273274
let method = if method_name == "<init>" {
274-
vm.invoke(
275-
"java.lang.Class",
275+
let method = class.try_get_method(
276276
"getDeclaredConstructor",
277277
"([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",
278-
&[class_object, class_parameters],
279-
)
280-
.await?
278+
)?;
279+
thread
280+
.execute(&class, &method, &[class_object, class_parameters])
281+
.await?
281282
} else {
282283
let method_name = method_name.to_object(&vm).await?;
283-
vm.invoke(
284-
"java.lang.Class",
284+
let method = class.try_get_method(
285285
"getDeclaredMethod",
286286
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;",
287-
&[class_object, method_name, class_parameters],
288-
)
289-
.await?
287+
)?;
288+
thread
289+
.execute(
290+
&class,
291+
&method,
292+
&[class_object, method_name, class_parameters],
293+
)
294+
.await?
290295
};
291296

292297
Ok(method)
@@ -449,15 +454,12 @@ pub(crate) async fn get_tag_at_0(
449454
let class = class::get_class(&thread, &object).await?;
450455
let constant_pool = class.constant_pool();
451456
let constant = constant_pool.try_get(index)?;
452-
let vm = thread.vm()?;
453-
let tag = vm
454-
.invoke(
455-
"jdk.internal.reflect.ConstantPool$Tag",
456-
"valueOf",
457-
"(B)Ljdk/internal/reflect/ConstantPool$Tag;",
458-
&[constant.tag()],
459-
)
457+
458+
let class = thread
459+
.class("jdk/internal/reflect/ConstantPool$Tag")
460460
.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?;
461463
Ok(tag)
462464
}
463465

0 commit comments

Comments
 (0)