11use core:: cmp:: min;
22
3- use alloc:: { sync :: Arc , vec} ;
3+ use alloc:: vec;
44
55use 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
98use java_class_proto:: { JavaFieldProto , JavaMethodProto } ;
10- use jvm:: { Array , ClassInstanceRef , JavaChar , Jvm , Result } ;
9+ use jvm:: { Array , ClassInstanceRef , JavaChar , Jvm , Result , runtime :: JavaLangString } ;
1110
1211use 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