Skip to content

Commit 6b64acc

Browse files
Merge pull request #424 from theseus-rs/fix-class-lookups
fix: lookup classes using existing thread context instead of vm
2 parents 3c7ca27 + 97ea0d8 commit 6b64acc

File tree

9 files changed

+28
-27
lines changed

9 files changed

+28
-27
lines changed

ristretto_vm/src/instruction/array.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,9 @@ pub(crate) async fn multianewarray(
8181
dimensions: u8,
8282
) -> Result<ExecutionResult> {
8383
let thread = frame.thread()?;
84-
let vm = thread.vm()?;
8584
let constant_pool = frame.class().constant_pool();
8685
let class_name = constant_pool.try_get_class(index)?;
87-
let class = vm.class(class_name).await?;
86+
let class = thread.class(class_name).await?;
8887
let count = stack.pop_int()?;
8988
let count = usize::try_from(count)?;
9089

@@ -112,7 +111,7 @@ pub(crate) async fn multianewarray(
112111
let count = stack.pop_int()?;
113112
let count = usize::try_from(count)?;
114113
type_class_name = format!("[{type_class_name}");
115-
let type_class = vm.class(type_class_name.as_str()).await?;
114+
let type_class = thread.class(type_class_name.as_str()).await?;
116115
let mut array_values = Vec::new();
117116
for _ in 0..count {
118117
array_values.push(Some(array.clone()));

ristretto_vm/src/instruction/exception.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ pub(crate) async fn process_throwable(
2626
throwable: Object,
2727
) -> Result<usize> {
2828
let thread = frame.thread()?;
29-
let vm = thread.vm()?;
3029
let throwable_class = throwable.class();
3130
let class = frame.class();
3231
let constant_pool = class.constant_pool();
@@ -48,7 +47,7 @@ pub(crate) async fn process_throwable(
4847
} else {
4948
let exception_class_name =
5049
constant_pool.try_get_class(exception_table_entry.catch_type)?;
51-
let exception_class = vm.class(exception_class_name).await?;
50+
let exception_class = thread.class(exception_class_name).await?;
5251
exception_class.is_assignable_from(throwable_class)?
5352
};
5453

ristretto_vm/src/instruction/invokedynamic.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,13 +291,17 @@ async fn resolve_method_handles_lookup(thread: &Thread) -> Result<Value> {
291291
/// that represents that type in the JVM. For primitive types and arrays, this returns the
292292
/// corresponding class objects (like `java.lang.Integer.TYPE` for `int`). For reference types, it
293293
/// loads the class for the specified type.
294-
async fn get_field_type_class(vm: &VM, field_type: Option<FieldType>) -> Result<Value> {
294+
async fn get_field_type_class(
295+
vm: &VM,
296+
thread: &Thread,
297+
field_type: Option<FieldType>,
298+
) -> Result<Value> {
295299
let class_name = if let Some(field_type) = field_type {
296300
field_type.class_name()
297301
} else {
298302
"void".to_string()
299303
};
300-
let class = vm.class(class_name).await?;
304+
let class = thread.class(class_name).await?;
301305
class.to_object(vm).await
302306
}
303307

@@ -313,7 +317,7 @@ async fn get_field_type_class(vm: &VM, field_type: Option<FieldType>) -> Result<
313317
/// `MethodType.methodType()` factory method to create a `MethodType` instance.
314318
async fn get_method_type(vm: &VM, thread: &Thread, method_descriptor: &str) -> Result<Value> {
315319
let (argument_types, return_type) = FieldType::parse_method_descriptor(method_descriptor)?;
316-
let return_class = get_field_type_class(vm, return_type).await?;
320+
let return_class = get_field_type_class(vm, thread, return_type).await?;
317321

318322
let method_type_class = thread.class("java.lang.invoke.MethodType").await?;
319323
if argument_types.is_empty() {
@@ -326,14 +330,14 @@ async fn get_method_type(vm: &VM, thread: &Thread, method_descriptor: &str) -> R
326330
.await;
327331
}
328332

329-
let first_argument = get_field_type_class(vm, argument_types.first().cloned()).await?;
333+
let first_argument = get_field_type_class(vm, thread, argument_types.first().cloned()).await?;
330334
let argument_classes = ConcurrentVec::from(Vec::with_capacity(argument_types.len() - 1));
331335
for argument_type in argument_types.iter().skip(1) {
332-
let argument_class = get_field_type_class(vm, Some(argument_type.clone())).await?;
336+
let argument_class = get_field_type_class(vm, thread, Some(argument_type.clone())).await?;
333337
let argument_reference: Reference = argument_class.try_into()?;
334338
argument_classes.push(Some(argument_reference))?;
335339
}
336-
let class_array = vm.class("[Ljava/lang/Class;").await?;
340+
let class_array = thread.class("[Ljava/lang/Class;").await?;
337341
let reference_array = Reference::Array(ObjectArray {
338342
class: class_array,
339343
elements: argument_classes,

ristretto_vm/src/intrinsic_methods/java/io/unixfilesystem.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ pub(crate) async fn list_0(
531531
entries = path_entries;
532532
}
533533

534-
let class = vm.class("java.lang.String").await?;
534+
let class = thread.class("java.lang.String").await?;
535535
let paths = Value::try_from((class, entries))?;
536536
Ok(Some(paths))
537537
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,7 +1139,7 @@ mod tests {
11391139
#[tokio::test]
11401140
async fn test_get_constant_pool_1() -> Result<()> {
11411141
let (vm, thread) = crate::test::thread().await.expect("thread");
1142-
let class = vm.class("java.lang.String").await?;
1142+
let class = thread.class("java.lang.String").await?;
11431143
let class_object = class.to_object(&vm).await?;
11441144
let parameters = Parameters::new(vec![class_object]);
11451145
let constant_pool: Object = get_constant_pool_1(thread, parameters)
@@ -1493,7 +1493,7 @@ mod tests {
14931493
#[tokio::test]
14941494
async fn test_get_raw_annotations() -> Result<()> {
14951495
let (vm, thread) = crate::test::thread().await.expect("thread");
1496-
let class = vm.class("java.lang.String").await?;
1496+
let class = thread.class("java.lang.String").await?;
14971497
let class_object = class.to_object(&vm).await?;
14981498
let parameters = Parameters::new(vec![class_object]);
14991499
let value = get_raw_annotations(thread, parameters)
@@ -1507,7 +1507,7 @@ mod tests {
15071507
#[tokio::test]
15081508
async fn test_get_raw_type_annotations() -> Result<()> {
15091509
let (vm, thread) = crate::test::thread().await.expect("thread");
1510-
let class = vm.class("java.lang.String").await?;
1510+
let class = thread.class("java.lang.String").await?;
15111511
let class_object = class.to_object(&vm).await?;
15121512
let parameters = Parameters::new(vec![class_object]);
15131513
let value = get_raw_type_annotations(thread, parameters)

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,10 @@ pub(crate) async fn find_bootstrap_class(
214214
mut parameters: Parameters,
215215
) -> Result<Option<Value>> {
216216
let class_name: String = parameters.pop()?.try_into()?;
217-
let vm = thread.vm()?;
218-
let Ok(class) = vm.class(class_name).await else {
217+
let Ok(class) = thread.class(class_name).await else {
219218
return Ok(Some(Value::Object(None)));
220219
};
220+
let vm = thread.vm()?;
221221
let class = class.to_object(&vm).await?;
222222
Ok(Some(class))
223223
}
@@ -245,10 +245,10 @@ pub(crate) async fn find_loaded_class_0(
245245
mut parameters: Parameters,
246246
) -> Result<Option<Value>> {
247247
let class_name: String = parameters.pop()?.try_into()?;
248-
let vm = thread.vm()?;
249-
let Ok(class) = vm.class(class_name).await else {
248+
let Ok(class) = thread.class(class_name).await else {
250249
return Ok(Some(Value::Object(None)));
251250
};
251+
let vm = thread.vm()?;
252252
let class = class.to_object(&vm).await?;
253253
Ok(Some(class))
254254
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ pub(crate) async fn environ(thread: Arc<Thread>, _parameters: Parameters) -> Res
1818
let value = Some(Reference::from(mutf8::to_bytes(value)?));
1919
values.push(value);
2020
}
21-
let vm = thread.vm()?;
22-
let class = vm.class("[[B").await?;
21+
let class = thread.class("[[B").await?;
2322
let result = Reference::from((class, values));
2423
Ok(Some(Value::Object(Some(result))))
2524
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ pub(crate) mod tests {
4949

5050
pub(crate) async fn new_instance_test(new_instance: IntrinsicMethod) -> Result<()> {
5151
let (vm, thread) = crate::test::thread().await.expect("thread");
52-
let integer_class = vm.class("java/lang/Integer").await?;
52+
let integer_class = thread.class("java/lang/Integer").await?;
5353
let integer_class_object = integer_class.to_object(&vm).await?;
5454

55-
let class = vm.class("java/lang/Class").await?;
56-
let string_class = vm.class("java/lang/String").await?;
55+
let class = thread.class("java/lang/Class").await?;
56+
let string_class = thread.class("java/lang/String").await?;
5757
let string_class_object = string_class.to_object(&vm).await?;
5858
let arguments = Value::try_from((class.clone(), vec![string_class_object]))?;
5959

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ pub(crate) mod tests {
6363

6464
pub(crate) async fn invoke_test(invoke: IntrinsicMethod) -> Result<()> {
6565
let (vm, thread) = crate::test::thread().await.expect("thread");
66-
let integer_class = vm.class("java/lang/Integer").await?;
66+
let integer_class = thread.class("java/lang/Integer").await?;
6767
let integer_class_object = integer_class.to_object(&vm).await?;
6868

6969
let method_name = "valueOf".to_object(&vm).await?;
70-
let class = vm.class("java/lang/Class").await?;
71-
let string_class = vm.class("java/lang/String").await?;
70+
let class = thread.class("java/lang/Class").await?;
71+
let string_class = thread.class("java/lang/String").await?;
7272
let string_class_object = string_class.to_object(&vm).await?;
7373
let arguments = Value::try_from((class.clone(), vec![string_class_object]))?;
7474

0 commit comments

Comments
 (0)