Skip to content

Commit c33dc81

Browse files
committed
Add DataInputStream::skipBytes
1 parent 0350eda commit c33dc81

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

java_runtime/src/classes/java/io/data_input.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ impl DataInput {
2626
JavaMethodProto::new_abstract("readShort", "()S", Default::default()),
2727
JavaMethodProto::new_abstract("readUnsignedShort", "()I", Default::default()),
2828
JavaMethodProto::new_abstract("readUTF", "()Ljava/lang/String;", Default::default()),
29+
JavaMethodProto::new_abstract("skipBytes", "(I)I", Default::default()),
2930
],
3031
fields: vec![],
3132
access_flags: ClassAccessFlags::INTERFACE,

java_runtime/src/classes/java/io/data_input_stream.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ impl DataInputStream {
3131
JavaMethodProto::new("readShort", "()S", Self::read_short, Default::default()),
3232
JavaMethodProto::new("readUnsignedShort", "()I", Self::read_unsigned_short, Default::default()),
3333
JavaMethodProto::new("readUTF", "()Ljava/lang/String;", Self::read_utf, Default::default()),
34+
JavaMethodProto::new("skipBytes", "(I)I", Self::skip_bytes, Default::default()),
3435
],
3536
fields: vec![],
3637
access_flags: Default::default(),
@@ -221,4 +222,13 @@ impl DataInputStream {
221222

222223
Ok(())
223224
}
225+
226+
async fn skip_bytes(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>, n: i32) -> Result<i32> {
227+
tracing::debug!("java.io.DataInputStream::skipBytes({:?}, {:?})", &this, n);
228+
229+
let r#in = jvm.get_field(&this, "in", "Ljava/io/InputStream;").await?;
230+
let skipped: i64 = jvm.invoke_virtual(&r#in, "skip", "(J)J", (n as i64,)).await?;
231+
232+
Ok(skipped as _)
233+
}
224234
}

java_runtime/tests/classes/java/io/test_data_input_stream.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ async fn test_data_input_stream_high_bit() -> Result<()> {
5959

6060
let data = cast_vec(vec![
6161
0x81u8, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
62-
0x98, 0x99, 0x9a, 0x9b, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
62+
0x98, 0x99, 0x9a, 0x9b, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
6363
]);
6464
let data_len = data.len();
6565

@@ -98,5 +98,14 @@ async fn test_data_input_stream_high_bit() -> Result<()> {
9898
jvm.array_raw_buffer(&array).await?.read(0, &mut buffer)?;
9999
assert_eq!(buffer, vec![0x10, 0x11, 0x12, 0x13, 0x14, 0x15]);
100100

101+
let skipped: i32 = jvm.invoke_virtual(&data_input_stream, "skipBytes", "(I)I", (2,)).await?;
102+
assert_eq!(skipped, 2);
103+
104+
let short: i16 = jvm.invoke_virtual(&data_input_stream, "readShort", "()S", ()).await?;
105+
assert_eq!(short, i16::from_be_bytes([0x18, 0x19]));
106+
107+
let available: i32 = jvm.invoke_virtual(&data_input_stream, "available", "()I", ()).await?;
108+
assert_eq!(available, 1);
109+
101110
Ok(())
102111
}

0 commit comments

Comments
 (0)