@@ -839,12 +839,18 @@ impl fmt::Debug for Bytecode {
839
839
}
840
840
}
841
841
842
- /// A type for errors happening during compression .
842
+ /// A type for errors happening during decompression .
843
843
#[ derive( Error , Debug ) ]
844
- pub enum CompressionError {
844
+ pub enum DecompressionError {
845
845
/// Compressed bytecode is invalid, and could not be decompressed.
846
+ #[ cfg( not( target_arch = "wasm32" ) ) ]
846
847
#[ error( "Bytecode could not be decompressed" ) ]
847
848
InvalidCompressedBytecode ( #[ source] io:: Error ) ,
849
+
850
+ /// Compressed bytecode is invalid, and could not be decompressed.
851
+ #[ cfg( target_arch = "wasm32" ) ]
852
+ #[ error( "Bytecode could not be decompressed" ) ]
853
+ InvalidCompressedBytecode ( #[ from] ruzstd:: frame_decoder:: FrameDecoderError ) ,
848
854
}
849
855
850
856
/// A compressed WebAssembly module's bytecode.
@@ -874,19 +880,41 @@ impl From<Bytecode> for CompressedBytecode {
874
880
875
881
#[ cfg( not( target_arch = "wasm32" ) ) ]
876
882
impl TryFrom < & CompressedBytecode > for Bytecode {
877
- type Error = CompressionError ;
883
+ type Error = DecompressionError ;
878
884
879
885
fn try_from ( compressed_bytecode : & CompressedBytecode ) -> Result < Self , Self :: Error > {
880
886
let bytes = zstd:: stream:: decode_all ( & * compressed_bytecode. compressed_bytes )
881
- . map_err ( CompressionError :: InvalidCompressedBytecode ) ?;
887
+ . map_err ( DecompressionError :: InvalidCompressedBytecode ) ?;
888
+
889
+ Ok ( Bytecode { bytes } )
890
+ }
891
+ }
892
+
893
+ #[ cfg( target_arch = "wasm32" ) ]
894
+ impl TryFrom < & CompressedBytecode > for Bytecode {
895
+ type Error = DecompressionError ;
896
+
897
+ fn try_from ( compressed_bytecode : & CompressedBytecode ) -> Result < Self , Self :: Error > {
898
+ use ruzstd:: { io:: Read , streaming_decoder:: StreamingDecoder } ;
899
+
900
+ let compressed_bytes = & * compressed_bytecode. compressed_bytes ;
901
+ let mut bytes = Vec :: new ( ) ;
902
+ let mut decoder = StreamingDecoder :: new ( compressed_bytes) ?;
903
+
904
+ // Decode multiple frames, if present
905
+ // (https://github.com/KillingSpark/zstd-rs/issues/57)
906
+ while !decoder. get_ref ( ) . is_empty ( ) {
907
+ decoder
908
+ . read_to_end ( & mut bytes)
909
+ . expect ( "Reading from a slice in memory should not result in IO errors" ) ;
910
+ }
882
911
883
912
Ok ( Bytecode { bytes } )
884
913
}
885
914
}
886
915
887
- #[ cfg( not( target_arch = "wasm32" ) ) ]
888
916
impl TryFrom < CompressedBytecode > for Bytecode {
889
- type Error = CompressionError ;
917
+ type Error = DecompressionError ;
890
918
891
919
fn try_from ( compressed_bytecode : CompressedBytecode ) -> Result < Self , Self :: Error > {
892
920
Bytecode :: try_from ( & compressed_bytecode)
0 commit comments