@@ -687,184 +687,15 @@ pub enum WasmHeapBottomType {
687687}
688688
689689/// WebAssembly function type -- equivalent of `wasmparser`'s FuncType.
690- #[ derive( Debug , Eq , PartialEq , Hash ) ]
690+ #[ derive( Debug , Eq , PartialEq , Hash , Serialize , Deserialize ) ]
691691pub struct WasmFuncType {
692+ #[ serde( deserialize_with = "WasmFuncType::deserialize_params_results" ) ]
692693 params_results : Box < [ WasmValType ] > ,
693694 params_len : u32 ,
694695 non_i31_gc_ref_params_count : u32 ,
695696 non_i31_gc_ref_results_count : u32 ,
696697}
697698
698- impl serde:: Serialize for WasmFuncType {
699- fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
700- where
701- S : serde:: Serializer ,
702- {
703- use serde:: ser:: SerializeStruct as _;
704- let mut s = serializer. serialize_struct ( "WasmFuncType" , 2 ) ?;
705- s. serialize_field ( "params_results" , & self . params_results ) ?;
706- s. serialize_field ( "params_len" , & self . params_len ) ?;
707- s. end ( )
708- }
709- }
710-
711- impl < ' de > serde:: Deserialize < ' de > for WasmFuncType {
712- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
713- where
714- D : serde:: Deserializer < ' de > ,
715- {
716- enum Field {
717- ParamsResults ,
718- ParamsLen ,
719- }
720-
721- const FIELDS : & [ & str ] = & [ "params_results" , "params_len" ] ;
722-
723- impl < ' de > serde:: Deserialize < ' de > for Field {
724- fn deserialize < D > ( deserializer : D ) -> core:: result:: Result < Self , D :: Error >
725- where
726- D : serde:: Deserializer < ' de > ,
727- {
728- struct FieldVisitor ;
729-
730- impl < ' de > serde:: de:: Visitor < ' de > for FieldVisitor {
731- type Value = Field ;
732-
733- fn expecting ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
734- f. write_str ( "`params_results` or `params_len`" )
735- }
736-
737- fn visit_str < E > ( self , value : & str ) -> Result < Self :: Value , E >
738- where
739- E : serde:: de:: Error ,
740- {
741- match value {
742- "params_results" => Ok ( Field :: ParamsResults ) ,
743- "params_len" => Ok ( Field :: ParamsLen ) ,
744- _ => Err ( serde:: de:: Error :: unknown_field ( value, FIELDS ) ) ,
745- }
746- }
747- }
748-
749- deserializer. deserialize_identifier ( FieldVisitor )
750- }
751- }
752-
753- struct Visitor ;
754-
755- fn from_params_results_and_params_len < E > (
756- params_results : crate :: collections:: Vec < WasmValType > ,
757- params_len : u64 ,
758- ) -> Result < WasmFuncType , E >
759- where
760- E : serde:: de:: Error ,
761- {
762- let params_results = params_results
763- . into_boxed_slice ( )
764- . map_err ( |oom| serde:: de:: Error :: custom ( oom) ) ?;
765-
766- struct ExpectedLen ( usize ) ;
767- impl serde:: de:: Expected for ExpectedLen {
768- fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
769- write ! ( f, "<= {}" , self . 0 )
770- }
771- }
772-
773- let params_len = u32:: try_from ( params_len) . map_err ( |_| {
774- serde:: de:: Error :: invalid_value (
775- serde:: de:: Unexpected :: Unsigned ( params_len) ,
776- & ExpectedLen ( params_results. len ( ) ) ,
777- )
778- } ) ?;
779-
780- let ( non_i31_gc_ref_params_count, non_i31_gc_ref_results_count) = {
781- let params_len = usize:: try_from ( params_len) . unwrap ( ) ;
782- if params_len > params_results. len ( ) {
783- return Err ( serde:: de:: Error :: invalid_length (
784- params_len,
785- & ExpectedLen ( params_results. len ( ) ) ,
786- ) ) ;
787- }
788- (
789- u32:: try_from (
790- params_results[ ..params_len]
791- . iter ( )
792- . filter ( |p| p. is_vmgcref_type_and_not_i31 ( ) )
793- . count ( ) ,
794- )
795- . unwrap ( ) ,
796- u32:: try_from (
797- params_results[ params_len..]
798- . iter ( )
799- . filter ( |p| p. is_vmgcref_type_and_not_i31 ( ) )
800- . count ( ) ,
801- )
802- . unwrap ( ) ,
803- )
804- } ;
805-
806- Ok ( WasmFuncType {
807- params_results,
808- params_len,
809- non_i31_gc_ref_params_count,
810- non_i31_gc_ref_results_count,
811- } )
812- }
813-
814- impl < ' de > serde:: de:: Visitor < ' de > for Visitor {
815- type Value = WasmFuncType ;
816-
817- fn expecting ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
818- f. write_str ( "struct WasmFuncType" )
819- }
820-
821- fn visit_seq < V > ( self , mut seq : V ) -> Result < Self :: Value , V :: Error >
822- where
823- V : serde:: de:: SeqAccess < ' de > ,
824- {
825- let params_results: crate :: collections:: Vec < WasmValType > = seq
826- . next_element ( ) ?
827- . ok_or_else ( || serde:: de:: Error :: invalid_length ( 0 , & self ) ) ?;
828- let params_len: u64 = seq
829- . next_element ( ) ?
830- . ok_or_else ( || serde:: de:: Error :: invalid_length ( 1 , & self ) ) ?;
831- from_params_results_and_params_len ( params_results, params_len)
832- }
833-
834- fn visit_map < V > ( self , mut map : V ) -> Result < Self :: Value , V :: Error >
835- where
836- V : serde:: de:: MapAccess < ' de > ,
837- {
838- let mut params_results: Option < crate :: collections:: Vec < WasmValType > > = None ;
839- let mut params_len: Option < u64 > = None ;
840- while let Some ( key) = map. next_key ( ) ? {
841- match key {
842- Field :: ParamsResults => {
843- if params_results. is_some ( ) {
844- return Err ( serde:: de:: Error :: duplicate_field ( "params_results" ) ) ;
845- }
846- params_results = Some ( map. next_value ( ) ?) ;
847- }
848- Field :: ParamsLen => {
849- if params_len. is_some ( ) {
850- return Err ( serde:: de:: Error :: duplicate_field ( "params_len" ) ) ;
851- }
852- params_len = Some ( map. next_value ( ) ?) ;
853- }
854- }
855- }
856- let params_results = params_results
857- . ok_or_else ( || serde:: de:: Error :: missing_field ( "params_results" ) ) ?;
858- let params_len =
859- params_len. ok_or_else ( || serde:: de:: Error :: missing_field ( "params_len" ) ) ?;
860- from_params_results_and_params_len ( params_results, params_len)
861- }
862- }
863-
864- deserializer. deserialize_struct ( "WasmFuncType" , FIELDS , Visitor )
865- }
866- }
867-
868699impl TryClone for WasmFuncType {
869700 fn try_clone ( & self ) -> Result < Self , OutOfMemory > {
870701 Ok ( Self {
@@ -920,6 +751,18 @@ impl TypeTrace for WasmFuncType {
920751}
921752
922753impl WasmFuncType {
754+ fn deserialize_params_results < ' de , D > ( deserializer : D ) -> Result < Box < [ WasmValType ] > , D :: Error >
755+ where
756+ D : serde:: de:: Deserializer < ' de > ,
757+ {
758+ let tys: crate :: collections:: Vec < WasmValType > =
759+ serde:: Deserialize :: deserialize ( deserializer) ?;
760+ let tys = tys
761+ . into_boxed_slice ( )
762+ . map_err ( |oom| serde:: de:: Error :: custom ( oom) ) ?;
763+ Ok ( tys)
764+ }
765+
923766 /// Creates a new function type from the provided `params` and `returns`.
924767 #[ inline]
925768 pub fn new (
0 commit comments