Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions java_runtime/src/classes/java/io/buffered_input_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,13 @@ impl BufferedInputStream {
jvm.put_field(this, "count", "I", position).await?;

let read: i32 = jvm
.invoke_virtual(&r#in, "read", "([BII)I", (buffer, position, buffer_length - position))
.invoke_virtual(
&r#in,
"java/io/InputStream",
"read",
"([BII)I",
(buffer, position, buffer_length - position),
)
.await?;
if read > 0 {
jvm.put_field(this, "count", "I", position + read).await?;
Expand Down Expand Up @@ -233,7 +239,7 @@ impl BufferedInputStream {
total += copied;

if total < length {
let available: i32 = jvm.invoke_virtual(&r#in, "available", "()I", ()).await?;
let available: i32 = jvm.invoke_virtual(&r#in, "java/io/InputStream", "available", "()I", ()).await?;
if available == 0 {
break;
}
Expand All @@ -260,7 +266,7 @@ impl BufferedInputStream {
if position >= count {
let mark_position: i32 = jvm.get_field(&this, "markpos", "I").await?;
if mark_position < 0 {
return jvm.invoke_virtual(&r#in, "skip", "(J)J", (amount,)).await;
return jvm.invoke_virtual(&r#in, "java/io/InputStream", "skip", "(J)J", (amount,)).await;
}
if Self::fill(jvm, &mut this).await? == -1 {
return Ok(0);
Expand All @@ -284,7 +290,7 @@ impl BufferedInputStream {
}
let position: i32 = jvm.get_field(&this, "pos", "I").await?;
let count: i32 = jvm.get_field(&this, "count", "I").await?;
let underlying: i32 = jvm.invoke_virtual(&r#in, "available", "()I", ()).await?;
let underlying: i32 = jvm.invoke_virtual(&r#in, "java/io/InputStream", "available", "()I", ()).await?;
Ok((count - position).saturating_add(underlying))
}

Expand Down Expand Up @@ -327,6 +333,6 @@ impl BufferedInputStream {
let null_buffer: ClassInstanceRef<Array<i8>> = None.into();
jvm.put_field(&mut this, "in", "Ljava/io/InputStream;", null_input).await?;
jvm.put_field(&mut this, "buf", "[B", null_buffer).await?;
jvm.invoke_virtual(&r#in, "close", "()V", ()).await
jvm.invoke_virtual(&r#in, "java/io/InputStream", "close", "()V", ()).await
}
}
10 changes: 7 additions & 3 deletions java_runtime/src/classes/java/io/buffered_output_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ impl BufferedOutputStream {
}
let count: i32 = jvm.get_field(this, "count", "I").await?;
if count > 0 {
let _: () = jvm.invoke_virtual(&out, "write", "([BII)V", (buffer, 0, count)).await?;
let _: () = jvm
.invoke_virtual(&out, "java/io/OutputStream", "write", "([BII)V", (buffer, 0, count))
.await?;
jvm.put_field(this, "count", "I", 0).await?;
}
Ok(())
Expand Down Expand Up @@ -131,7 +133,9 @@ impl BufferedOutputStream {
let buffer_length = jvm.array_length(&buffer).await? as i32;
if length >= buffer_length {
Self::flush_buffer(jvm, &mut this).await?;
return jvm.invoke_virtual(&out, "write", "([BII)V", (bytes, offset, length)).await;
return jvm
.invoke_virtual(&out, "java/io/OutputStream", "write", "([BII)V", (bytes, offset, length))
.await;
}

let mut count: i32 = jvm.get_field(&this, "count", "I").await?;
Expand All @@ -156,6 +160,6 @@ impl BufferedOutputStream {

Self::flush_buffer(jvm, &mut this).await?;
let out: ClassInstanceRef<OutputStream> = jvm.get_field(&this, "out", "Ljava/io/OutputStream;").await?;
jvm.invoke_virtual(&out, "flush", "()V", ()).await
jvm.invoke_virtual(&out, "java/io/OutputStream", "flush", "()V", ()).await
}
}
16 changes: 11 additions & 5 deletions java_runtime/src/classes/java/io/buffered_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,13 @@ impl BufferedReader {
let mut read;
loop {
read = jvm
.invoke_virtual(&r#in, "read", "([CII)I", (cb.clone(), destination, capacity - destination))
.invoke_virtual(
&r#in,
"java/io/Reader",
"read",
"([CII)I",
(cb.clone(), destination, capacity - destination),
)
.await?;
if read != 0 {
break;
Expand Down Expand Up @@ -271,7 +277,7 @@ impl BufferedReader {
let mut next_char: i32 = jvm.get_field(&this, "nextChar", "I").await?;
let mut n_chars: i32 = jvm.get_field(&this, "nChars", "I").await?;
if next_char >= n_chars {
if total > 0 && !jvm.invoke_virtual::<_, bool>(&r#in, "ready", "()Z", ()).await? {
if total > 0 && !jvm.invoke_virtual::<_, bool>(&r#in, "java/io/Reader", "ready", "()Z", ()).await? {
break;
}
if Self::fill(jvm, &mut this).await? <= 0 {
Expand Down Expand Up @@ -435,7 +441,7 @@ impl BufferedReader {
let mut next_char: i32 = jvm.get_field(&this, "nextChar", "I").await?;
let mut n_chars: i32 = jvm.get_field(&this, "nChars", "I").await?;
if jvm.get_field::<bool>(&this, "skipLF", "Z").await? {
if next_char >= n_chars && jvm.invoke_virtual::<_, bool>(&r#in, "ready", "()Z", ()).await? {
if next_char >= n_chars && jvm.invoke_virtual::<_, bool>(&r#in, "java/io/Reader", "ready", "()Z", ()).await? {
let _ = Self::fill(jvm, &mut this).await?;
next_char = jvm.get_field(&this, "nextChar", "I").await?;
n_chars = jvm.get_field(&this, "nChars", "I").await?;
Expand All @@ -454,7 +460,7 @@ impl BufferedReader {
if next_char < n_chars {
return Ok(true);
}
jvm.invoke_virtual(&r#in, "ready", "()Z", ()).await
jvm.invoke_virtual(&r#in, "java/io/Reader", "ready", "()Z", ()).await
}

async fn mark_supported(_: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<bool> {
Expand Down Expand Up @@ -528,7 +534,7 @@ impl BufferedReader {
return Ok(());
}

let result = jvm.invoke_virtual(&r#in, "close", "()V", ()).await;
let result = jvm.invoke_virtual(&r#in, "java/io/Reader", "close", "()V", ()).await;
let closed: ClassInstanceRef<Reader> = None.into();
jvm.put_field(&mut this, "in", "Ljava/io/Reader;", closed).await?;
let released: ClassInstanceRef<Array<JavaChar>> = None.into();
Expand Down
17 changes: 11 additions & 6 deletions java_runtime/src/classes/java/io/buffered_writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,9 @@ impl BufferedWriter {
}
let next_char: i32 = jvm.get_field(this, "nextChar", "I").await?;
if next_char > 0 {
let _: () = jvm.invoke_virtual(&out, "write", "([CII)V", (buffer, 0, next_char)).await?;
let _: () = jvm
.invoke_virtual(&out, "java/io/Writer", "write", "([CII)V", (buffer, 0, next_char))
.await?;
jvm.put_field(this, "nextChar", "I", 0).await?;
}
Ok(())
Expand Down Expand Up @@ -189,7 +191,9 @@ impl BufferedWriter {
let n_chars: i32 = jvm.get_field(&this, "nChars", "I").await?;
if length >= n_chars {
Self::flush_buffer(jvm, &mut this).await?;
return jvm.invoke_virtual(&out, "write", "([CII)V", (chars, offset, length)).await;
return jvm
.invoke_virtual(&out, "java/io/Writer", "write", "([CII)V", (chars, offset, length))
.await;
}

let mut source_position = offset;
Expand Down Expand Up @@ -245,7 +249,7 @@ impl BufferedWriter {
if value.is_null() {
return Err(jvm.exception("java/lang/NullPointerException", "string is null").await);
}
let string_length: i32 = jvm.invoke_virtual(&value, "length", "()I", ()).await?;
let string_length: i32 = jvm.invoke_virtual(&value, "java/lang/String", "length", "()I", ()).await?;
if offset < 0 || length < 0 || offset > string_length - length {
return Err(jvm.exception("java/lang/IndexOutOfBoundsException", "Invalid offset or length").await);
}
Expand All @@ -259,6 +263,7 @@ impl BufferedWriter {
let _: () = jvm
.invoke_virtual(
&value,
"java/lang/String",
"getChars",
"(II[CI)V",
(source_position, source_position + copied, buffer, next_char),
Expand All @@ -283,7 +288,7 @@ impl BufferedWriter {
tracing::debug!("java.io.BufferedWriter::newLine({this:?})");

let line_separator: ClassInstanceRef<String> = jvm.get_field(&this, "lineSeparator", "Ljava/lang/String;").await?;
let length: i32 = jvm.invoke_virtual(&line_separator, "length", "()I", ()).await?;
let length: i32 = jvm.invoke_virtual(&line_separator, "java/lang/String", "length", "()I", ()).await?;
Self::write_string_locked(jvm, this, line_separator, 0, length).await
}

Expand All @@ -297,7 +302,7 @@ impl BufferedWriter {

Self::flush_buffer(jvm, &mut this).await?;
let out: ClassInstanceRef<Writer> = jvm.get_field(&this, "out", "Ljava/io/Writer;").await?;
jvm.invoke_virtual(&out, "flush", "()V", ()).await
jvm.invoke_virtual(&out, "java/io/Writer", "flush", "()V", ()).await
}

async fn close(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<()> {
Expand All @@ -313,7 +318,7 @@ impl BufferedWriter {
return Ok(());
}
let flush_result = Self::flush_buffer(jvm, &mut this).await;
let close_result: Result<()> = jvm.invoke_virtual(&out, "close", "()V", ()).await;
let close_result: Result<()> = jvm.invoke_virtual(&out, "java/io/Writer", "close", "()V", ()).await;
let null_writer: ClassInstanceRef<Writer> = None.into();
let null_buffer: ClassInstanceRef<Array<JavaChar>> = None.into();
let clear_out_result = jvm.put_field(&mut this, "out", "Ljava/io/Writer;", null_writer).await;
Expand Down
3 changes: 2 additions & 1 deletion java_runtime/src/classes/java/io/byte_array_output_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ impl ByteArrayOutputStream {

let buf: ClassInstanceRef<Array<i8>> = jvm.get_field(&this, "buf", "[B").await?;
let count: i32 = jvm.get_field(&this, "count", "I").await?;
jvm.invoke_virtual(&out, "write", "([BII)V", (buf, 0, count)).await
jvm.invoke_virtual(&out, "java/io/OutputStream", "write", "([BII)V", (buf, 0, count))
.await
}

async fn to_byte_array(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<ClassInstanceRef<Array<i8>>> {
Expand Down
12 changes: 9 additions & 3 deletions java_runtime/src/classes/java/io/char_array_writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,15 +185,21 @@ impl CharArrayWriter {
if value.is_null() {
return Err(jvm.exception("java/lang/NullPointerException", "string is null").await);
}
let source_length: i32 = jvm.invoke_virtual(&value, "length", "()I", ()).await?;
let source_length: i32 = jvm.invoke_virtual(&value, "java/lang/String", "length", "()I", ()).await?;
if offset < 0 || length < 0 || offset > source_length - length {
return Err(jvm.exception("java/lang/IndexOutOfBoundsException", "Invalid offset or length").await);
}
let count: i32 = jvm.get_field(&this, "count", "I").await?;
Self::ensure_capacity(jvm, &mut this, count + length).await?;
let buffer: ClassInstanceRef<Array<JavaChar>> = jvm.get_field(&this, "buf", "[C").await?;
let _: () = jvm
.invoke_virtual(&value, "getChars", "(II[CI)V", (offset, offset + length, buffer, count))
.invoke_virtual(
&value,
"java/lang/String",
"getChars",
"(II[CI)V",
(offset, offset + length, buffer, count),
)
.await?;
jvm.put_field(&mut this, "count", "I", count + length).await
}
Expand All @@ -211,7 +217,7 @@ impl CharArrayWriter {
}
let buffer: ClassInstanceRef<Array<JavaChar>> = jvm.get_field(&this, "buf", "[C").await?;
let count: i32 = jvm.get_field(&this, "count", "I").await?;
jvm.invoke_virtual(&out, "write", "([CII)V", (buffer, 0, count)).await
jvm.invoke_virtual(&out, "java/io/Writer", "write", "([CII)V", (buffer, 0, count)).await
}

async fn reset(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<()> {
Expand Down
23 changes: 16 additions & 7 deletions java_runtime/src/classes/java/io/data_input_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,13 @@ impl DataInputStream {
async fn read_utf(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<ClassInstanceRef<String>> {
tracing::debug!("java.io.DataInputStream::readUTF({this:?})");

let length: i32 = jvm.invoke_virtual(&this, "readUnsignedShort", "()I", ()).await?;
let length: i32 = jvm
.invoke_virtual(&this, "java/io/DataInputStream", "readUnsignedShort", "()I", ())
.await?;
let java_array = jvm.instantiate_array("B", length as usize).await?;
let _: () = jvm.invoke_virtual(&this, "readFully", "([BII)V", (java_array.clone(), 0, length)).await?;
let _: () = jvm
.invoke_virtual(&this, "java/io/DataInputStream", "readFully", "([BII)V", (java_array.clone(), 0, length))
.await?;
let bytes: Vec<i8> = jvm.load_array(&java_array, 0, length as usize).await?;
let bytes: Vec<u8> = bytes.into_iter().map(|value| value as u8).collect();

Expand Down Expand Up @@ -197,15 +201,18 @@ impl DataInputStream {

async fn read_utf_from_input(jvm: &Jvm, _: &mut RuntimeContext, input: ClassInstanceRef<DataInput>) -> Result<ClassInstanceRef<String>> {
tracing::debug!("java.io.DataInputStream::readUTF({input:?})");
jvm.invoke_virtual(&input, "readUTF", "()Ljava/lang/String;", ()).await
jvm.invoke_virtual(&input, &input.class_definition().name(), "readUTF", "()Ljava/lang/String;", ())
.await
}

async fn read_fully(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>, b: ClassInstanceRef<Array<i8>>) -> Result<()> {
tracing::debug!("java.io.DataInputStream::readFully({this:?}, {b:?})");

let length = jvm.array_length(&b).await?;

let _: () = jvm.invoke_virtual(&this, "readFully", "([BII)V", (b.clone(), 0, length as i32)).await?;
let _: () = jvm
.invoke_virtual(&this, "java/io/DataInputStream", "readFully", "([BII)V", (b.clone(), 0, length as i32))
.await?;

Ok(())
}
Expand All @@ -222,7 +229,9 @@ impl DataInputStream {

let mut read = 0;
while read < len {
let r: i32 = jvm.invoke_virtual(&this, "read", "([BII)I", (b.clone(), off + read, len - read)).await?;
let r: i32 = jvm
.invoke_virtual(&this, "java/io/DataInputStream", "read", "([BII)I", (b.clone(), off + read, len - read))
.await?;
if r == -1 {
return Err(jvm.exception("java/io/EOFException", "End of stream reached before reading fully").await);
}
Expand All @@ -236,14 +245,14 @@ impl DataInputStream {
tracing::debug!("java.io.DataInputStream::skipBytes({this:?}, {n:?})");

let r#in = jvm.get_field(&this, "in", "Ljava/io/InputStream;").await?;
let skipped: i64 = jvm.invoke_virtual(&r#in, "skip", "(J)J", (n as i64,)).await?;
let skipped: i64 = jvm.invoke_virtual(&r#in, "java/io/InputStream", "skip", "(J)J", (n as i64,)).await?;

Ok(skipped as _)
}

async fn read_required_byte(jvm: &Jvm, this: &ClassInstanceRef<Self>) -> Result<u8> {
let r#in = jvm.get_field(this, "in", "Ljava/io/InputStream;").await?;
let value: i32 = jvm.invoke_virtual(&r#in, "read", "()I", ()).await?;
let value: i32 = jvm.invoke_virtual(&r#in, "java/io/InputStream", "read", "()I", ()).await?;
if value == -1 {
return Err(jvm.exception("java/io/EOFException", "End of stream").await);
}
Expand Down
Loading