Skip to content

Commit 973379e

Browse files
committed
Store InputStreamReader charset name and recreate Decoder per call
1 parent 8e83314 commit 973379e

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

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

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
use core::cmp::min;
22

3-
use alloc::{sync::Arc, vec};
3+
use alloc::vec;
44

55
use bytemuck::{cast_slice, cast_vec};
6-
use encoding_rs::{Decoder, EUC_KR, UTF_8};
7-
use parking_lot::Mutex;
6+
use encoding_rs::{EUC_KR, UTF_8};
87

98
use java_class_proto::{JavaFieldProto, JavaMethodProto};
10-
use jvm::{Array, ClassInstanceRef, JavaChar, Jvm, Result};
9+
use jvm::{Array, ClassInstanceRef, JavaChar, Jvm, Result, runtime::JavaLangString};
1110

1211
use crate::{
1312
RuntimeClassProto, RuntimeContext,
@@ -36,7 +35,7 @@ impl InputStreamReader {
3635
JavaFieldProto::new("readBufSize", "I", Default::default()),
3736
JavaFieldProto::new("writeBuf", "[C", Default::default()),
3837
JavaFieldProto::new("writeBufSize", "I", Default::default()),
39-
JavaFieldProto::new("decoder", "[B", Default::default()),
38+
JavaFieldProto::new("charset", "Ljava/lang/String;", Default::default()),
4039
],
4140
access_flags: Default::default(),
4241
}
@@ -48,16 +47,8 @@ impl InputStreamReader {
4847
let _: () = jvm.invoke_special(&this, "java/io/Reader", "<init>", "()V", ()).await?;
4948

5049
let charset = System::get_charset(jvm).await?;
51-
52-
let decoder = if charset == "UTF-8" {
53-
UTF_8.new_decoder()
54-
} else if charset == "EUC-KR" {
55-
EUC_KR.new_decoder()
56-
} else {
57-
unimplemented!("unsupported charset: {}", charset)
58-
};
59-
60-
jvm.put_rust_object_field(&mut this, "decoder", Arc::new(Mutex::new(decoder))).await?;
50+
let charset_java = JavaLangString::from_rust_string(jvm, &charset).await?;
51+
jvm.put_field(&mut this, "charset", "Ljava/lang/String;", charset_java).await?;
6152

6253
let read_buf = jvm.instantiate_array("B", BUF_SIZE).await?;
6354
jvm.put_field(&mut this, "readBuf", "[B", read_buf).await?;
@@ -114,10 +105,18 @@ impl InputStreamReader {
114105
let mut read_buf_data = vec![0; read_buf_size as _];
115106
jvm.array_raw_buffer(&read_buf).await?.read(0, &mut read_buf_data).unwrap();
116107

117-
let decoder: Arc<Mutex<Decoder>> = jvm.get_rust_object_field(&this, "decoder").await?;
108+
let charset_ref = jvm.get_field(&this, "charset", "Ljava/lang/String;").await?;
109+
let charset = JavaLangString::to_rust_string(jvm, &charset_ref).await?;
110+
let mut decoder = if charset == "UTF-8" {
111+
UTF_8.new_decoder_without_bom_handling()
112+
} else if charset == "EUC-KR" {
113+
EUC_KR.new_decoder_without_bom_handling()
114+
} else {
115+
unimplemented!("unsupported charset: {}", charset)
116+
};
118117

119118
let mut decoded = vec![0; BUF_SIZE * 3];
120-
let (_, read, wrote, _) = decoder.lock().decode_to_utf16(&cast_vec(read_buf_data), &mut decoded, false);
119+
let (_, read, wrote, _) = decoder.decode_to_utf16(&cast_vec(read_buf_data), &mut decoded, false);
121120

122121
// advance readBuf
123122
let _: () = jvm

0 commit comments

Comments
 (0)