Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
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
41 changes: 26 additions & 15 deletions java_runtime/src/classes/java/io/byte_array_input_stream.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use alloc::vec;

use java_class_proto::{JavaFieldProto, JavaMethodProto};
use java_constants::{ClassAccessFlags, FieldAccessFlags, MethodAccessFlags};
use jvm::{Array, ClassInstanceRef, Jvm, Result};

use crate::{RuntimeClassProto, RuntimeContext};
Expand All @@ -15,24 +16,34 @@ impl ByteArrayInputStream {
parent_class: Some("java/io/InputStream"),
interfaces: vec![],
methods: vec![
JavaMethodProto::new("<init>", "([B)V", Self::init, Default::default()),
JavaMethodProto::new("<init>", "([BII)V", Self::init_with_offset_length, Default::default()),
JavaMethodProto::new("available", "()I", Self::available, Default::default()),
JavaMethodProto::new("read", "([BII)I", Self::read, Default::default()),
JavaMethodProto::new("read", "()I", Self::read_byte, Default::default()),
JavaMethodProto::new("close", "()V", Self::close, Default::default()),
JavaMethodProto::new("skip", "(J)J", Self::skip, Default::default()),
JavaMethodProto::new("mark", "(I)V", Self::mark, Default::default()),
JavaMethodProto::new("reset", "()V", Self::reset, Default::default()),
JavaMethodProto::new("markSupported", "()Z", Self::mark_supported, Default::default()),
JavaMethodProto::new("<init>", "([B)V", Self::init, MethodAccessFlags::PUBLIC),
JavaMethodProto::new("<init>", "([BII)V", Self::init_with_offset_length, MethodAccessFlags::PUBLIC),
JavaMethodProto::new(
"available",
"()I",
Self::available,
MethodAccessFlags::PUBLIC | MethodAccessFlags::SYNCHRONIZED,
),
JavaMethodProto::new("read", "([BII)I", Self::read, MethodAccessFlags::PUBLIC | MethodAccessFlags::SYNCHRONIZED),
JavaMethodProto::new(
"read",
"()I",
Self::read_byte,
MethodAccessFlags::PUBLIC | MethodAccessFlags::SYNCHRONIZED,
),
JavaMethodProto::new("close", "()V", Self::close, MethodAccessFlags::PUBLIC),
JavaMethodProto::new("skip", "(J)J", Self::skip, MethodAccessFlags::PUBLIC | MethodAccessFlags::SYNCHRONIZED),
JavaMethodProto::new("mark", "(I)V", Self::mark, MethodAccessFlags::PUBLIC),
JavaMethodProto::new("reset", "()V", Self::reset, MethodAccessFlags::PUBLIC | MethodAccessFlags::SYNCHRONIZED),
JavaMethodProto::new("markSupported", "()Z", Self::mark_supported, MethodAccessFlags::PUBLIC),
],
fields: vec![
JavaFieldProto::new("buf", "[B", Default::default()),
JavaFieldProto::new("pos", "I", Default::default()),
JavaFieldProto::new("count", "I", Default::default()),
JavaFieldProto::new("mark", "I", Default::default()),
JavaFieldProto::new("buf", "[B", FieldAccessFlags::PROTECTED),
JavaFieldProto::new("pos", "I", FieldAccessFlags::PROTECTED),
JavaFieldProto::new("count", "I", FieldAccessFlags::PROTECTED),
JavaFieldProto::new("mark", "I", FieldAccessFlags::PROTECTED),
],
access_flags: Default::default(),
access_flags: ClassAccessFlags::PUBLIC,
}
}

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
30 changes: 15 additions & 15 deletions java_runtime/src/classes/java/io/data_input.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use alloc::vec;

use java_class_proto::JavaMethodProto;
use java_constants::ClassAccessFlags;
use java_constants::{ClassAccessFlags, MethodAccessFlags};

use crate::RuntimeClassProto;
// interface java.io.DataInput
Expand All @@ -14,20 +14,20 @@ impl DataInput {
parent_class: None,
interfaces: vec![],
methods: vec![
JavaMethodProto::new_abstract("readBoolean", "()Z", Default::default()),
JavaMethodProto::new_abstract("readByte", "()B", Default::default()),
JavaMethodProto::new_abstract("readChar", "()C", Default::default()),
JavaMethodProto::new_abstract("readDouble", "()D", Default::default()),
JavaMethodProto::new_abstract("readFloat", "()F", Default::default()),
JavaMethodProto::new_abstract("readFully", "([B)V", Default::default()),
JavaMethodProto::new_abstract("readFully", "([BII)V", Default::default()),
JavaMethodProto::new_abstract("readInt", "()I", Default::default()),
JavaMethodProto::new_abstract("readLong", "()J", Default::default()),
JavaMethodProto::new_abstract("readShort", "()S", Default::default()),
JavaMethodProto::new_abstract("readUnsignedByte", "()I", Default::default()),
JavaMethodProto::new_abstract("readUnsignedShort", "()I", Default::default()),
JavaMethodProto::new_abstract("readUTF", "()Ljava/lang/String;", Default::default()),
JavaMethodProto::new_abstract("skipBytes", "(I)I", Default::default()),
JavaMethodProto::new_abstract("readBoolean", "()Z", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readByte", "()B", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readChar", "()C", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readDouble", "()D", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readFloat", "()F", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readFully", "([B)V", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readFully", "([BII)V", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readInt", "()I", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readLong", "()J", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readShort", "()S", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readUnsignedByte", "()I", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readUnsignedShort", "()I", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("readUTF", "()Ljava/lang/String;", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
JavaMethodProto::new_abstract("skipBytes", "(I)I", MethodAccessFlags::PUBLIC | MethodAccessFlags::ABSTRACT),
],
fields: vec![],
access_flags: ClassAccessFlags::INTERFACE,
Expand Down
Loading
Loading