From 855acaf1123df519c71592bba77ecfaf3d920002 Mon Sep 17 00:00:00 2001 From: Mingun Date: Fri, 19 May 2023 22:32:07 +0500 Subject: [PATCH] Eliminate additional allocations for flattening aliases --- serde_derive/src/de.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 81b0802f..6474fca0 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -2216,17 +2216,16 @@ fn deserialize_identifier( collect_other_fields: bool, expecting: Option<&str>, ) -> Fragment { - let mut flat_fields = Vec::new(); - for (_, ident, aliases) in fields { - flat_fields.extend(aliases.iter().map(|alias| (alias, ident))); - } - - let str_mapping = flat_fields.iter().map(|(name, ident)| { - quote!(#name => _serde::__private::Ok(#this_value::#ident)) + let str_mapping = fields.iter().map(|(_, ident, aliases)| { + // `aliases` also contains a main name + quote!(#(#aliases)|* => _serde::__private::Ok(#this_value::#ident)) }); - let bytes_mapping = flat_fields.iter().map(|(name, ident)| { - let name = Literal::byte_string(name.as_bytes()); - quote!(#name => _serde::__private::Ok(#this_value::#ident)) + let bytes_mapping = fields.iter().map(|(_, ident, aliases)| { + // `aliases` also contains a main name + let aliases = aliases + .iter() + .map(|alias| Literal::byte_string(alias.as_bytes())); + quote!(#(#aliases)|* => _serde::__private::Ok(#this_value::#ident)) }); let main_constructors: &Vec<_> = &fields