Skip to content

Commit 66f0424

Browse files
committed
try to break it down more
1 parent 85903b8 commit 66f0424

File tree

1 file changed

+66
-45
lines changed

1 file changed

+66
-45
lines changed

rmp-serde/src/decode.rs

Lines changed: 66 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -195,14 +195,14 @@ pub struct Deserializer<R, C = DefaultConfig> {
195195
}
196196

197197
impl<R: Read, C> Deserializer<R, C> {
198-
#[inline]
198+
#[inline(never)]
199199
fn take_or_read_marker(&mut self) -> Result<Marker, MarkerReadError> {
200200
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)
203203
}
204-
205-
#[inline]
204+
205+
#[inline(never)]
206206
fn peek_or_read_marker(&mut self) -> Result<Marker, MarkerReadError> {
207207
if let Some(m) = self.marker {
208208
Ok(m)
@@ -659,32 +659,58 @@ fn any_num<'de, R: ReadSlice<'de>, V: Visitor<'de>>(rd: &mut R, visitor: V, mark
659659
}
660660
}
661661

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+
662708
impl<'de, R: ReadSlice<'de>, C: SerializerConfig> Deserializer<R, C> {
663709
fn any_inner<V: Visitor<'de>>(&mut self, visitor: V, allow_bytes: bool) -> Result<V::Value, Error> {
664710
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 => {
688714
let len = tri!(read_array_len(&mut self.rd, marker));
689715
depth_count!(self.depth, {
690716
let mut seq = SeqAccess::new(self, len);
@@ -694,10 +720,12 @@ impl<'de, R: ReadSlice<'de>, C: SerializerConfig> Deserializer<R, C> {
694720
excess => Err(Error::LengthMismatch(len - excess)),
695721
}
696722
})
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 => {
701729
let len = tri!(read_map_len(&mut self.rd, marker));
702730
depth_count!(self.depth, {
703731
let mut seq = MapAccess::new(self, len);
@@ -707,28 +735,21 @@ impl<'de, R: ReadSlice<'de>, C: SerializerConfig> Deserializer<R, C> {
707735
excess => Err(Error::LengthMismatch(len - excess)),
708736
}
709737
})
710-
}
711-
Marker::Bin8 | Marker::Bin16 | Marker::Bin32 => {
738+
},
739+
MarkerClass::Bin => {
712740
match tri!(read_bin_data(&mut self.rd, marker)) {
713741
Reference::Borrowed(buf) if allow_bytes => visitor.visit_borrowed_bytes(buf),
714742
Reference::Copied(buf) if allow_bytes => visitor.visit_bytes(buf),
715743
Reference::Borrowed(buf) | Reference::Copied(buf) => {
716744
visitor.visit_seq(SeqDeserializer::new(buf.iter().copied()))
717745
},
718746
}
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 => {
728749
let len = tri!(ext_len(&mut self.rd, marker));
729750
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)),
732753
}
733754
}
734755
}

0 commit comments

Comments
 (0)