1- use alloc:: { vec, vec :: Vec } ;
1+ use alloc:: vec;
22
33use java_class_proto:: { JavaFieldProto , JavaMethodProto } ;
44use jvm:: { Array , ClassInstanceRef , Jvm , Result } ;
@@ -57,7 +57,7 @@ impl ByteArrayOutputStream {
5757 Self :: ensure_capacity ( jvm, & mut this, ( pos + 1 ) as _ ) . await ?;
5858
5959 let mut buf = jvm. get_field ( & this, "buf" , "[B" ) . await ?;
60- jvm. store_byte_array ( & mut buf, pos as _ , vec ! [ b as i8 ] ) . await ?;
60+ jvm. store_array ( & mut buf, pos as _ , vec ! [ b as i8 ] ) . await ?;
6161
6262 jvm. put_field ( & mut this, "pos" , "I" , pos + 1 ) . await ?;
6363
@@ -67,28 +67,41 @@ impl ByteArrayOutputStream {
6767 async fn to_byte_array ( jvm : & Jvm , _: & mut RuntimeContext , this : ClassInstanceRef < Self > ) -> Result < ClassInstanceRef < Array < i8 > > > {
6868 tracing:: debug!( "java.io.ByteArrayOutputStream::to_byte_array({:?})" , & this) ;
6969
70- let buf = jvm. get_field ( & this, "buf" , "[B" ) . await ?;
70+ let buf: ClassInstanceRef < Array < i8 > > = jvm. get_field ( & this, "buf" , "[B" ) . await ?;
7171 let pos: i32 = jvm. get_field ( & this, "pos" , "I" ) . await ?;
7272
73- let bytes = jvm. load_byte_array ( & buf, 0 , pos as _ ) . await ?;
74- let mut array = jvm. instantiate_array ( "B" , bytes. len ( ) ) . await ?;
75- jvm. store_byte_array ( & mut array, 0 , bytes) . await ?;
73+ let dest = jvm. instantiate_array ( "B" , pos as _ ) . await ?;
74+ let _: ( ) = jvm
75+ . invoke_static (
76+ "java/lang/System" ,
77+ "arraycopy" ,
78+ "(Ljava/lang/Object;ILjava/lang/Object;II)V" ,
79+ ( buf. clone ( ) , 0 , dest. clone ( ) , 0 , pos) ,
80+ )
81+ . await ?;
7682
77- Ok ( array . into ( ) )
83+ Ok ( dest . into ( ) )
7884 }
7985
8086 async fn ensure_capacity ( jvm : & Jvm , this : & mut ClassInstanceRef < Self > , capacity : usize ) -> Result < ( ) > {
8187 let old_buf = jvm. get_field ( this, "buf" , "[B" ) . await ?;
8288 let current_capacity = jvm. array_length ( & old_buf) . await ?;
8389
8490 if current_capacity < capacity {
85- let old_values: Vec < i8 > = jvm. load_byte_array ( & old_buf, 0 , current_capacity) . await ?;
8691 let new_capacity = capacity * 2 ;
92+ let new_buf = jvm. instantiate_array ( "B" , new_capacity) . await ?;
93+
94+ let _: ( ) = jvm
95+ . invoke_static (
96+ "java/lang/System" ,
97+ "arraycopy" ,
98+ "(Ljava/lang/Object;ILjava/lang/Object;II)V" ,
99+ ( old_buf. clone ( ) , 0 , new_buf. clone ( ) , 0 , current_capacity as i32 ) ,
100+ )
101+ . await ?;
87102
88- let mut new_buf = jvm. instantiate_array ( "B" , new_capacity) . await ?;
89103 jvm. put_field ( this, "buf" , "[B" , new_buf. clone ( ) ) . await ?;
90- jvm. store_byte_array ( & mut new_buf, 0 , old_values) . await ?;
91- jvm. destroy ( old_buf) ?;
104+ jvm. destroy ( old_buf) ?; // temporary before GC
92105 }
93106
94107 Ok ( ( ) )
@@ -97,6 +110,7 @@ impl ByteArrayOutputStream {
97110
98111#[ cfg( test) ]
99112mod test {
113+ use alloc:: vec;
100114
101115 use bytemuck:: cast_vec;
102116
@@ -117,7 +131,9 @@ mod test {
117131
118132 let buf = jvm. invoke_virtual ( & stream, "toByteArray" , "()[B" , ( ) ) . await ?;
119133
120- let bytes = jvm. load_byte_array ( & buf, 0 , 5 ) . await ?;
134+ let mut bytes = vec ! [ 0 ; 5 ] ;
135+ jvm. array_raw_buffer ( & buf) . await ?. read ( 0 , & mut bytes) ?;
136+
121137 assert_eq ! ( bytes, cast_vec( b"Hello" . to_vec( ) ) ) ;
122138
123139 Ok ( ( ) )
0 commit comments