Skip to content

Commit 7e13a53

Browse files
committed
Require explicit class names in instance field APIs
1 parent 4d00f21 commit 7e13a53

183 files changed

Lines changed: 5320 additions & 3109 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎jvm-bytecode/src/interpreter.rs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ impl Interpreter {
445445
return Err(jvm.exception("java/lang/NullPointerException", "null").await);
446446
}
447447

448-
let value = jvm.get_field_from_class(&instance.unwrap(), &x.class, &x.name, &x.descriptor).await?;
448+
let value = jvm.get_field(&instance.unwrap(), &x.class, &x.name, &x.descriptor).await?;
449449

450450
stack_frame.operand_stack.push(Self::to_stack_frame_type(value));
451451
}
@@ -921,8 +921,7 @@ impl Interpreter {
921921

922922
let value = Self::to_field_type(&x.descriptor, value);
923923

924-
jvm.put_field_from_class(instance.as_mut().unwrap(), &x.class, &x.name, &x.descriptor, value)
925-
.await?;
924+
jvm.put_field(instance.as_mut().unwrap(), &x.class, &x.name, &x.descriptor, value).await?;
926925
}
927926
Opcode::Putstatic(x) => {
928927
let x = x.as_field_ref();

‎jvm/src/jvm.rs‎

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -261,15 +261,7 @@ impl Jvm {
261261
}
262262
}
263263

264-
pub async fn get_field<T>(&self, instance: &Box<dyn ClassInstance>, name: &str, descriptor: &str) -> Result<T>
265-
where
266-
T: From<JavaValue>,
267-
{
268-
self.get_field_from_class(instance, &instance.class_definition().name(), name, descriptor)
269-
.await
270-
}
271-
272-
pub async fn get_field_from_class<T>(&self, instance: &Box<dyn ClassInstance>, class_name: &str, name: &str, descriptor: &str) -> Result<T>
264+
pub async fn get_field<T>(&self, instance: &Box<dyn ClassInstance>, class_name: &str, name: &str, descriptor: &str) -> Result<T>
273265
where
274266
T: From<JavaValue>,
275267
{
@@ -302,22 +294,7 @@ impl Jvm {
302294
}
303295
}
304296

305-
pub async fn put_field<T>(&self, instance: &mut Box<dyn ClassInstance>, name: &str, descriptor: &str, value: T) -> Result<()>
306-
where
307-
T: Into<JavaValue> + Debug,
308-
{
309-
self.put_field_from_class(instance, &instance.class_definition().name(), name, descriptor, value)
310-
.await
311-
}
312-
313-
pub async fn put_field_from_class<T>(
314-
&self,
315-
instance: &mut Box<dyn ClassInstance>,
316-
class_name: &str,
317-
name: &str,
318-
descriptor: &str,
319-
value: T,
320-
) -> Result<()>
297+
pub async fn put_field<T>(&self, instance: &mut Box<dyn ClassInstance>, class_name: &str, name: &str, descriptor: &str, value: T) -> Result<()>
321298
where
322299
T: Into<JavaValue> + Debug,
323300
{
@@ -1124,7 +1101,7 @@ impl Jvm {
11241101
.get_mut(&thread_id)
11251102
.unwrap()
11261103
.set_java_thread(java_thread.clone());
1127-
let interrupted: bool = self.get_field(&java_thread, "interrupted", "Z").await?;
1104+
let interrupted: bool = self.get_field(&java_thread, "java/lang/Thread", "interrupted", "Z").await?;
11281105
self.inner.threads.write().get_mut(&thread_id).unwrap().interrupted |= interrupted;
11291106

11301107
Ok(())

‎jvm/src/runtime/java_lang_class.rs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ impl JavaLangClass {
1212
let mut name_bytes = jvm.instantiate_array("B", name.len()).await?;
1313
let bytes: Vec<i8> = cast_vec(name.as_bytes().to_vec());
1414
jvm.store_array(&mut name_bytes, 0, bytes).await?;
15-
jvm.put_field(&mut java_class, "nameBytes", "[B", name_bytes).await?;
15+
jvm.put_field(&mut java_class, "java/lang/Class", "nameBytes", "[B", name_bytes).await?;
1616

1717
Ok(java_class)
1818
}
1919

2020
#[allow(clippy::borrowed_box)]
2121
pub async fn name(jvm: &Jvm, this: &Box<dyn ClassInstance>) -> Result<String> {
22-
let name_bytes: ClassInstanceRef<Array<i8>> = jvm.get_field(this, "nameBytes", "[B").await?;
22+
let name_bytes: ClassInstanceRef<Array<i8>> = jvm.get_field(this, "java/lang/Class", "nameBytes", "[B").await?;
2323
let len = jvm.array_length(&name_bytes).await?;
2424
let name_bytes_vec: Vec<i8> = jvm.load_array(&name_bytes, 0, len).await?;
2525
match String::from_utf8(cast_vec(name_bytes_vec)) {
@@ -49,16 +49,16 @@ impl JavaLangClass {
4949
let mut name_bytes = jvm.instantiate_array("B", class_name.len()).await?;
5050
let bytes: Vec<i8> = cast_vec(class_name.into_owned().into_bytes());
5151
jvm.store_array(&mut name_bytes, 0, bytes).await?;
52-
jvm.put_field(&mut java_class, "nameBytes", "[B", name_bytes).await?;
52+
jvm.put_field(&mut java_class, "java/lang/Class", "nameBytes", "[B", name_bytes).await?;
5353

54-
jvm.put_field(&mut java_class, "classLoader", "Ljava/lang/ClassLoader;", class_loader)
54+
jvm.put_field(&mut java_class, "java/lang/Class", "classLoader", "Ljava/lang/ClassLoader;", class_loader)
5555
.await?;
5656

5757
Ok(java_class)
5858
}
5959

6060
#[allow(clippy::borrowed_box)]
6161
pub async fn class_loader(jvm: &Jvm, this: &Box<dyn ClassInstance>) -> Result<Option<Box<dyn ClassInstance>>> {
62-
jvm.get_field(this, "classLoader", "Ljava/lang/ClassLoader;").await
62+
jvm.get_field(this, "java/lang/Class", "classLoader", "Ljava/lang/ClassLoader;").await
6363
}
6464
}

‎jvm/src/runtime/java_lang_string.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ pub struct JavaLangString;
77
impl JavaLangString {
88
#[allow(clippy::borrowed_box)]
99
pub async fn to_utf16(jvm: &Jvm, this: &Box<dyn ClassInstance>) -> Result<Vec<JavaChar>> {
10-
let value = jvm.get_field(this, "value", "[C").await?;
11-
let offset: i32 = jvm.get_field(this, "offset", "I").await?;
12-
let count: i32 = jvm.get_field(this, "count", "I").await?;
10+
let value = jvm.get_field(this, "java/lang/String", "value", "[C").await?;
11+
let offset: i32 = jvm.get_field(this, "java/lang/String", "offset", "I").await?;
12+
let count: i32 = jvm.get_field(this, "java/lang/String", "count", "I").await?;
1313

1414
// access flags are not enforced, so bytecode can leave a negative here, which would widen into a huge usize
1515
if offset < 0 || count < 0 {

‎jvm/tests/test_garbage_collection.rs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,11 @@ async fn field_and_method_results_are_local_references() -> JvmResult<()> {
230230
assert_eq!(jvm.collect_garbage()?, 0);
231231

232232
jvm.push_native_frame();
233-
let _: ClassInstanceRef<Array<Object>> = jvm.get_field(&vector, "elementData", "[Ljava/lang/Object;").await?;
233+
let _: ClassInstanceRef<Array<Object>> = jvm.get_field(&vector, "java/util/Vector", "elementData", "[Ljava/lang/Object;").await?;
234234
let mut mutable_vector = (*vector).clone();
235235
jvm.put_field(
236236
&mut mutable_vector,
237+
"java/util/Vector",
237238
"elementData",
238239
"[Ljava/lang/Object;",
239240
ClassInstanceRef::<Array<Object>>::new(None),

0 commit comments

Comments
 (0)