@@ -195,14 +195,14 @@ pub struct Deserializer<R, C = DefaultConfig> {
195
195
}
196
196
197
197
impl < R : Read , C > Deserializer < R , C > {
198
- #[ inline]
198
+ #[ inline( never ) ]
199
199
fn take_or_read_marker ( & mut self ) -> Result < Marker , MarkerReadError > {
200
200
self . marker
201
- . take ( )
202
- . map_or_else ( || rmp:: decode:: read_marker ( & mut self . rd ) , Ok )
201
+ . take ( )
202
+ . map_or_else ( || rmp:: decode:: read_marker ( & mut self . rd ) , Ok )
203
203
}
204
-
205
- #[ inline]
204
+
205
+ #[ inline( never ) ]
206
206
fn peek_or_read_marker ( & mut self ) -> Result < Marker , MarkerReadError > {
207
207
if let Some ( m) = self . marker {
208
208
Ok ( m)
@@ -659,32 +659,58 @@ fn any_num<'de, R: ReadSlice<'de>, V: Visitor<'de>>(rd: &mut R, visitor: V, mark
659
659
}
660
660
}
661
661
662
+ enum MarkerClass {
663
+ AnyNumber ,
664
+ Array ,
665
+ String ,
666
+ Map ,
667
+ Bin ,
668
+ Ext ,
669
+ Reserved ,
670
+ }
671
+
672
+ #[ inline( never) ]
673
+ fn classify_any_marker ( marker : Marker ) -> MarkerClass {
674
+ match marker {
675
+ Marker :: Null
676
+ | Marker :: True
677
+ | Marker :: False
678
+ | Marker :: FixPos ( _)
679
+ | Marker :: FixNeg ( _)
680
+ | Marker :: U8
681
+ | Marker :: U16
682
+ | Marker :: U32
683
+ | Marker :: U64
684
+ | Marker :: I8
685
+ | Marker :: I16
686
+ | Marker :: I32
687
+ | Marker :: I64
688
+ | Marker :: F32
689
+ | Marker :: F64 => MarkerClass :: AnyNumber ,
690
+ Marker :: FixStr ( _) | Marker :: Str8 | Marker :: Str16 | Marker :: Str32 => {
691
+ MarkerClass :: String
692
+ }
693
+ Marker :: FixArray ( _) | Marker :: Array16 | Marker :: Array32 => MarkerClass :: Array ,
694
+ Marker :: FixMap ( _) | Marker :: Map16 | Marker :: Map32 => MarkerClass :: Map ,
695
+ Marker :: Bin8 | Marker :: Bin16 | Marker :: Bin32 => MarkerClass :: Bin ,
696
+ Marker :: FixExt1
697
+ | Marker :: FixExt2
698
+ | Marker :: FixExt4
699
+ | Marker :: FixExt8
700
+ | Marker :: FixExt16
701
+ | Marker :: Ext8
702
+ | Marker :: Ext16
703
+ | Marker :: Ext32 => MarkerClass :: Ext ,
704
+ Marker :: Reserved => MarkerClass :: Reserved ,
705
+ }
706
+ }
707
+
662
708
impl < ' de , R : ReadSlice < ' de > , C : SerializerConfig > Deserializer < R , C > {
663
709
fn any_inner < V : Visitor < ' de > > ( & mut self , visitor : V , allow_bytes : bool ) -> Result < V :: Value , Error > {
664
710
let marker = tri ! ( self . take_or_read_marker( ) ) ;
665
- match marker {
666
- Marker :: Null |
667
- Marker :: True |
668
- Marker :: False |
669
- Marker :: FixPos ( _) |
670
- Marker :: FixNeg ( _) |
671
- Marker :: U8 |
672
- Marker :: U16 |
673
- Marker :: U32 |
674
- Marker :: U64 |
675
- Marker :: I8 |
676
- Marker :: I16 |
677
- Marker :: I32 |
678
- Marker :: I64 |
679
- Marker :: F32 |
680
- Marker :: F64 => any_num ( & mut self . rd , visitor, marker) ,
681
- Marker :: FixStr ( _) | Marker :: Str8 | Marker :: Str16 | Marker :: Str32 => {
682
- let data = tri ! ( read_str_data( & mut self . rd, marker) ) ;
683
- visit_str_data ( visitor, data)
684
- }
685
- Marker :: FixArray ( _) |
686
- Marker :: Array16 |
687
- Marker :: Array32 => {
711
+ match classify_any_marker ( marker) {
712
+ MarkerClass :: AnyNumber => any_num ( & mut self . rd , visitor, marker) ,
713
+ MarkerClass :: Array => {
688
714
let len = tri ! ( read_array_len( & mut self . rd, marker) ) ;
689
715
depth_count ! ( self . depth, {
690
716
let mut seq = SeqAccess :: new( self , len) ;
@@ -694,10 +720,12 @@ impl<'de, R: ReadSlice<'de>, C: SerializerConfig> Deserializer<R, C> {
694
720
excess => Err ( Error :: LengthMismatch ( len - excess) ) ,
695
721
}
696
722
} )
697
- }
698
- Marker :: FixMap ( _) |
699
- Marker :: Map16 |
700
- Marker :: Map32 => {
723
+ } ,
724
+ MarkerClass :: String => {
725
+ let data = tri ! ( read_str_data( & mut self . rd, marker) ) ;
726
+ visit_str_data ( visitor, data)
727
+ } ,
728
+ MarkerClass :: Map => {
701
729
let len = tri ! ( read_map_len( & mut self . rd, marker) ) ;
702
730
depth_count ! ( self . depth, {
703
731
let mut seq = MapAccess :: new( self , len) ;
@@ -707,28 +735,21 @@ impl<'de, R: ReadSlice<'de>, C: SerializerConfig> Deserializer<R, C> {
707
735
excess => Err ( Error :: LengthMismatch ( len - excess) ) ,
708
736
}
709
737
} )
710
- }
711
- Marker :: Bin8 | Marker :: Bin16 | Marker :: Bin32 => {
738
+ } ,
739
+ MarkerClass :: Bin => {
712
740
match tri ! ( read_bin_data( & mut self . rd, marker) ) {
713
741
Reference :: Borrowed ( buf) if allow_bytes => visitor. visit_borrowed_bytes ( buf) ,
714
742
Reference :: Copied ( buf) if allow_bytes => visitor. visit_bytes ( buf) ,
715
743
Reference :: Borrowed ( buf) | Reference :: Copied ( buf) => {
716
744
visitor. visit_seq ( SeqDeserializer :: new ( buf. iter ( ) . copied ( ) ) )
717
745
} ,
718
746
}
719
- }
720
- Marker :: FixExt1 |
721
- Marker :: FixExt2 |
722
- Marker :: FixExt4 |
723
- Marker :: FixExt8 |
724
- Marker :: FixExt16 |
725
- Marker :: Ext8 |
726
- Marker :: Ext16 |
727
- Marker :: Ext32 => {
747
+ } ,
748
+ MarkerClass :: Ext => {
728
749
let len = tri ! ( ext_len( & mut self . rd, marker) ) ;
729
750
depth_count ! ( self . depth, visitor. visit_newtype_struct( ExtDeserializer :: new( self , len) ) )
730
- }
731
- Marker :: Reserved => Err ( Error :: TypeMismatch ( Marker :: Reserved ) ) ,
751
+ } ,
752
+ MarkerClass :: Reserved => Err ( Error :: TypeMismatch ( Marker :: Reserved ) ) ,
732
753
}
733
754
}
734
755
}
0 commit comments