Skip to content

Commit 0c08cda

Browse files
authored
Reduce compile time contribution of next_key_seed and next_value_seed (#436)
* factor out common code * changelog entry
1 parent 10999ba commit 0c08cda

File tree

2 files changed

+31
-13
lines changed

2 files changed

+31
-13
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
- Removed `UserData` impl for Rc/Arc types ("any" userdata functions can be used instead)
77
- `Lua::replace_registry_value` takes `&mut RegistryKey`
88
- `Lua::scope` temporary disabled (will be re-added in the next release)
9+
- Reduced the compile time contribution of `next_key_seed` and `next_value_seed`.
910

1011
## v0.9.9
1112

src/serde/de.rs

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -504,13 +504,8 @@ struct MapDeserializer<'a> {
504504
processed: usize,
505505
}
506506

507-
impl<'de> de::MapAccess<'de> for MapDeserializer<'_> {
508-
type Error = Error;
509-
510-
fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
511-
where
512-
T: de::DeserializeSeed<'de>,
513-
{
507+
impl<'a> MapDeserializer<'a> {
508+
fn next_key_deserializer(&mut self) -> Result<Option<Deserializer>> {
514509
loop {
515510
match self.pairs.next() {
516511
Some(item) => {
@@ -526,25 +521,47 @@ impl<'de> de::MapAccess<'de> for MapDeserializer<'_> {
526521
self.value = Some(value);
527522
let visited = Rc::clone(&self.visited);
528523
let key_de = Deserializer::from_parts(key, self.options, visited);
529-
return seed.deserialize(key_de).map(Some);
524+
return Ok(Some(key_de));
530525
}
531526
None => return Ok(None),
532527
}
533528
}
534529
}
535530

536-
fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value>
537-
where
538-
T: de::DeserializeSeed<'de>,
539-
{
531+
fn next_value_deserializer(&mut self) -> Result<Deserializer> {
540532
match self.value.take() {
541533
Some(value) => {
542534
let visited = Rc::clone(&self.visited);
543-
seed.deserialize(Deserializer::from_parts(value, self.options, visited))
535+
Ok(Deserializer::from_parts(value, self.options, visited))
544536
}
545537
None => Err(de::Error::custom("value is missing")),
546538
}
547539
}
540+
}
541+
542+
impl<'de> de::MapAccess<'de> for MapDeserializer<'_> {
543+
type Error = Error;
544+
545+
fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
546+
where
547+
T: de::DeserializeSeed<'de>,
548+
{
549+
match self.next_key_deserializer() {
550+
Ok(Some(key_de)) => seed.deserialize(key_de).map(Some),
551+
Ok(None) => Ok(None),
552+
Err(error) => Err(error),
553+
}
554+
}
555+
556+
fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value>
557+
where
558+
T: de::DeserializeSeed<'de>,
559+
{
560+
match self.next_value_deserializer() {
561+
Ok(value_de) => seed.deserialize(value_de),
562+
Err(error) => Err(error),
563+
}
564+
}
548565

549566
fn size_hint(&self) -> Option<usize> {
550567
match self.pairs.size_hint() {

0 commit comments

Comments
 (0)