From a38b24136b44618af5e2fff77d822c6d0ad25efc Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 9 Apr 2017 13:35:20 -0700 Subject: [PATCH 1/2] Rename deserialize_struct_field to deserialize_identifier Because it applies to both struct fields and discriminants of an enum. --- serde/src/de/impls.rs | 4 ++-- serde/src/de/mod.rs | 4 ++-- serde/src/de/value.rs | 22 +++++++++++----------- serde/src/macros.rs | 8 ++++---- serde/src/private/de.rs | 14 +++++++------- serde_derive/src/de.rs | 2 +- serde_test/src/de.rs | 4 ++-- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 59793812..ffe3291c 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -1232,7 +1232,7 @@ impl<'de> Deserialize<'de> for Duration { } } - deserializer.deserialize_struct_field(FieldVisitor) + deserializer.deserialize_identifier(FieldVisitor) } } @@ -1358,7 +1358,7 @@ impl<'de, Idx: Deserialize<'de>> Deserialize<'de> for std::ops::Range { } } - deserializer.deserialize_struct_field(FieldVisitor) + deserializer.deserialize_identifier(FieldVisitor) } } diff --git a/serde/src/de/mod.rs b/serde/src/de/mod.rs index 453a531b..754fa12e 100644 --- a/serde/src/de/mod.rs +++ b/serde/src/de/mod.rs @@ -911,8 +911,8 @@ pub trait Deserializer<'de>: Sized { where V: Visitor<'de>; /// Hint that the `Deserialize` type is expecting the name of a struct - /// field. - fn deserialize_struct_field(self, visitor: V) -> Result + /// field or the discriminant of an enum variant. + fn deserialize_identifier(self, visitor: V) -> Result where V: Visitor<'de>; /// Hint that the `Deserialize` type is expecting an enum value with a diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index 3b157b0c..1323450d 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -108,7 +108,7 @@ impl<'de, E> de::Deserializer<'de> for UnitDeserializer forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct struct - struct_field tuple enum ignored_any byte_buf + identifier tuple enum ignored_any byte_buf } fn deserialize(self, visitor: V) -> Result @@ -155,7 +155,7 @@ macro_rules! primitive_deserializer { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any byte_buf + tuple_struct struct identifier tuple enum ignored_any byte_buf } fn deserialize(self, visitor: V) -> Result @@ -208,7 +208,7 @@ impl<'de, E> de::Deserializer<'de> for U32Deserializer forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct - struct struct_field tuple ignored_any byte_buf + struct identifier tuple ignored_any byte_buf } fn deserialize(self, visitor: V) -> Result @@ -286,7 +286,7 @@ impl<'de, 'a, E> de::Deserializer<'de> for StrDeserializer<'a, E> forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct - struct struct_field tuple ignored_any byte_buf + struct identifier tuple ignored_any byte_buf } } @@ -351,7 +351,7 @@ impl<'de, E> de::Deserializer<'de> for StringDeserializer forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct - struct struct_field tuple ignored_any byte_buf + struct identifier tuple ignored_any byte_buf } } @@ -420,7 +420,7 @@ impl<'de, 'a, E> de::Deserializer<'de> for CowStrDeserializer<'a, E> forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct - struct struct_field tuple ignored_any byte_buf + struct identifier tuple ignored_any byte_buf } } @@ -495,7 +495,7 @@ impl<'de, I, T, E> de::Deserializer<'de> for SeqDeserializer forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct - struct struct_field tuple enum ignored_any byte_buf + struct identifier tuple enum ignored_any byte_buf } } @@ -603,7 +603,7 @@ impl<'de, V_> de::Deserializer<'de> for SeqVisitorDeserializer forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct - struct struct_field tuple enum ignored_any byte_buf + struct identifier tuple enum ignored_any byte_buf } } @@ -707,7 +707,7 @@ impl<'de, I, E> de::Deserializer<'de> for MapDeserializer<'de, I, E> forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option - bytes map unit_struct newtype_struct tuple_struct struct struct_field + bytes map unit_struct newtype_struct tuple_struct struct identifier tuple enum ignored_any byte_buf } } @@ -804,7 +804,7 @@ impl<'de, A, B, E> de::Deserializer<'de> for PairDeserializer forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option - bytes map unit_struct newtype_struct tuple_struct struct struct_field + bytes map unit_struct newtype_struct tuple_struct struct identifier tuple enum ignored_any byte_buf } @@ -945,7 +945,7 @@ impl<'de, V_> de::Deserializer<'de> for MapVisitorDeserializer forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct - struct struct_field tuple enum ignored_any byte_buf + struct identifier tuple enum ignored_any byte_buf } } diff --git a/serde/src/macros.rs b/serde/src/macros.rs index 5873e1a7..80ababfa 100644 --- a/serde/src/macros.rs +++ b/serde/src/macros.rs @@ -89,8 +89,8 @@ macro_rules! forward_to_deserialize_helper { (struct) => { forward_to_deserialize_method!{deserialize_struct(&'static str, &'static [&'static str])} }; - (struct_field) => { - forward_to_deserialize_method!{deserialize_struct_field()} + (identifier) => { + forward_to_deserialize_method!{deserialize_identifier()} }; (tuple) => { forward_to_deserialize_method!{deserialize_tuple(usize)} @@ -143,7 +143,7 @@ macro_rules! forward_to_deserialize_helper { /// # forward_to_deserialize! { /// # u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option /// # seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct -/// # tuple_struct struct struct_field tuple enum ignored_any +/// # tuple_struct struct identifier tuple enum ignored_any /// # } /// # } /// # @@ -176,7 +176,7 @@ macro_rules! forward_to_deserialize_helper { /// forward_to_deserialize! { /// bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option /// seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct -/// tuple_struct struct struct_field tuple enum ignored_any +/// tuple_struct struct identifier tuple enum ignored_any /// } /// } /// # diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index f4e95dc6..2d019b42 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -52,7 +52,7 @@ pub fn missing_field<'de, V, E>(field: &'static str) -> Result forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any + tuple_struct struct identifier tuple enum ignored_any } } @@ -855,7 +855,7 @@ mod content { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct - struct_field tuple ignored_any + identifier tuple ignored_any } } @@ -996,7 +996,7 @@ mod content { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any + tuple_struct struct identifier tuple enum ignored_any } } @@ -1085,7 +1085,7 @@ mod content { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any + tuple_struct struct identifier tuple enum ignored_any } } @@ -1202,7 +1202,7 @@ mod content { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct - struct_field tuple ignored_any + identifier tuple ignored_any } } @@ -1341,7 +1341,7 @@ mod content { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any + tuple_struct struct identifier tuple enum ignored_any } } @@ -1430,7 +1430,7 @@ mod content { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any + tuple_struct struct identifier tuple enum ignored_any } } diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 4c4ffe14..2335cce1 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1190,7 +1190,7 @@ fn deserialize_field_visitor(fields: Vec<(String, Ident)>, } } - _serde::Deserializer::deserialize_struct_field(__deserializer, __FieldVisitor) + _serde::Deserializer::deserialize_identifier(__deserializer, __FieldVisitor) } } } diff --git a/serde_test/src/de.rs b/serde_test/src/de.rs index fcbb762b..243c8eb6 100644 --- a/serde_test/src/de.rs +++ b/serde_test/src/de.rs @@ -78,7 +78,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit - seq bytes byte_buf map struct_field ignored_any + seq bytes byte_buf map identifier ignored_any } fn deserialize(self, visitor: V) -> Result @@ -645,6 +645,6 @@ impl<'de> de::Deserializer<'de> for BytesDeserializer { forward_to_deserialize! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct - struct struct_field tuple enum ignored_any byte_buf + struct identifier tuple enum ignored_any byte_buf } } From 52e93150e6b26b0fba0b27f3e175e9470ab0e4df Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 9 Apr 2017 13:50:38 -0700 Subject: [PATCH 2/2] Standardize on u32 as the type of a variant index --- serde/src/private/macros.rs | 8 ++++---- serde/src/private/ser.rs | 32 ++++++++++++++++---------------- serde/src/ser/mod.rs | 8 ++++---- serde_derive/src/ser.rs | 16 +++++++++++----- serde_test/src/ser.rs | 8 ++++---- 5 files changed, 39 insertions(+), 33 deletions(-) diff --git a/serde/src/private/macros.rs b/serde/src/private/macros.rs index 4d40c510..f0e0703a 100644 --- a/serde/src/private/macros.rs +++ b/serde/src/private/macros.rs @@ -66,13 +66,13 @@ macro_rules! __serialize_unimplemented_helper { __serialize_unimplemented_method!(serialize_unit_struct(&str) -> Ok); }; (unit_variant) => { - __serialize_unimplemented_method!(serialize_unit_variant(&str, usize, &str) -> Ok); + __serialize_unimplemented_method!(serialize_unit_variant(&str, u32, &str) -> Ok); }; (newtype_struct) => { __serialize_unimplemented_method!(serialize_newtype_struct(&str, &T) -> Ok); }; (newtype_variant) => { - __serialize_unimplemented_method!(serialize_newtype_variant(&str, usize, &str, &T) -> Ok); + __serialize_unimplemented_method!(serialize_newtype_variant(&str, u32, &str, &T) -> Ok); }; (seq) => { type SerializeSeq = $crate::ser::Impossible; @@ -91,7 +91,7 @@ macro_rules! __serialize_unimplemented_helper { }; (tuple_variant) => { type SerializeTupleVariant = $crate::ser::Impossible; - __serialize_unimplemented_method!(serialize_tuple_variant(&str, usize, &str, usize) -> SerializeTupleVariant); + __serialize_unimplemented_method!(serialize_tuple_variant(&str, u32, &str, usize) -> SerializeTupleVariant); }; (map) => { type SerializeMap = $crate::ser::Impossible; @@ -103,7 +103,7 @@ macro_rules! __serialize_unimplemented_helper { }; (struct_variant) => { type SerializeStructVariant = $crate::ser::Impossible; - __serialize_unimplemented_method!(serialize_struct_variant(&str, usize, &str, usize) -> SerializeStructVariant); + __serialize_unimplemented_method!(serialize_struct_variant(&str, u32, &str, usize) -> SerializeStructVariant); }; } diff --git a/serde/src/private/ser.rs b/serde/src/private/ser.rs index c8d09d0b..157d7656 100644 --- a/serde/src/private/ser.rs +++ b/serde/src/private/ser.rs @@ -184,7 +184,7 @@ impl Serializer for TaggedSerializer fn serialize_unit_variant(self, _: &'static str, - _: usize, + _: u32, inner_variant: &'static str) -> Result { let mut map = try!(self.delegate.serialize_map(Some(2))); @@ -204,7 +204,7 @@ impl Serializer for TaggedSerializer fn serialize_newtype_variant(self, _: &'static str, - _: usize, + _: u32, inner_variant: &'static str, inner_value: &T) -> Result @@ -238,7 +238,7 @@ impl Serializer for TaggedSerializer #[cfg(not(any(feature = "std", feature = "collections")))] fn serialize_tuple_variant(self, _: &'static str, - _: usize, + _: u32, _: &'static str, _: usize) -> Result { @@ -250,7 +250,7 @@ impl Serializer for TaggedSerializer #[cfg(any(feature = "std", feature = "collections"))] fn serialize_tuple_variant(self, _: &'static str, - _: usize, + _: u32, inner_variant: &'static str, len: usize) -> Result { @@ -278,7 +278,7 @@ impl Serializer for TaggedSerializer #[cfg(not(any(feature = "std", feature = "collections")))] fn serialize_struct_variant(self, _: &'static str, - _: usize, + _: u32, _: &'static str, _: usize) -> Result { @@ -290,7 +290,7 @@ impl Serializer for TaggedSerializer #[cfg(any(feature = "std", feature = "collections"))] fn serialize_struct_variant(self, _: &'static str, - _: usize, + _: u32, inner_variant: &'static str, len: usize) -> Result { @@ -444,18 +444,18 @@ mod content { Unit, UnitStruct(&'static str), - UnitVariant(&'static str, usize, &'static str), + UnitVariant(&'static str, u32, &'static str), NewtypeStruct(&'static str, Box), - NewtypeVariant(&'static str, usize, &'static str, Box), + NewtypeVariant(&'static str, u32, &'static str, Box), Seq(Vec), SeqFixedSize(Vec), Tuple(Vec), TupleStruct(&'static str, Vec), - TupleVariant(&'static str, usize, &'static str, Vec), + TupleVariant(&'static str, u32, &'static str, Vec), Map(Vec<(Content, Content)>), Struct(&'static str, Vec<(&'static str, Content)>), - StructVariant(&'static str, usize, &'static str, Vec<(&'static str, Content)>), + StructVariant(&'static str, u32, &'static str, Vec<(&'static str, Content)>), } impl Serialize for Content { @@ -645,7 +645,7 @@ mod content { fn serialize_unit_variant(self, name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str) -> Result { Ok(Content::UnitVariant(name, variant_index, variant)) @@ -660,7 +660,7 @@ mod content { fn serialize_newtype_variant(self, name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str, value: &T) -> Result { @@ -706,7 +706,7 @@ mod content { fn serialize_tuple_variant(self, name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str, len: usize) -> Result { @@ -737,7 +737,7 @@ mod content { fn serialize_struct_variant(self, name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str, len: usize) -> Result { @@ -825,7 +825,7 @@ mod content { struct SerializeTupleVariant { name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str, fields: Vec, error: PhantomData, @@ -916,7 +916,7 @@ mod content { struct SerializeStructVariant { name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str, fields: Vec<(&'static str, Content)>, error: PhantomData, diff --git a/serde/src/ser/mod.rs b/serde/src/ser/mod.rs index 332bdfab..1a20646a 100644 --- a/serde/src/ser/mod.rs +++ b/serde/src/ser/mod.rs @@ -449,7 +449,7 @@ pub trait Serializer: Sized { /// ``` fn serialize_unit_variant(self, name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str) -> Result; @@ -504,7 +504,7 @@ pub trait Serializer: Sized { /// ``` fn serialize_newtype_variant(self, name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str, value: &T) -> Result; @@ -686,7 +686,7 @@ pub trait Serializer: Sized { /// ``` fn serialize_tuple_variant(self, name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str, len: usize) -> Result; @@ -806,7 +806,7 @@ pub trait Serializer: Sized { /// ``` fn serialize_struct_variant(self, name: &'static str, - variant_index: usize, + variant_index: u32, variant: &'static str, len: usize) -> Result; diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index 51826928..d7d05dc4 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -6,6 +6,8 @@ use fragment::{Fragment, Stmts, Match}; use internals::ast::{Body, Field, Item, Style, Variant}; use internals::{self, attr}; +use std::u32; + pub fn expand_derive_serialize(item: &syn::DeriveInput) -> Result { let ctxt = internals::Ctxt::new(); let item = Item::from_ast(&ctxt, item); @@ -149,6 +151,8 @@ fn serialize_struct(ident: &syn::Ident, fields: &[Field], item_attrs: &attr::Item) -> Fragment { + assert!(fields.len() as u64 <= u32::MAX as u64); + let serialize_fields = serialize_struct_visitor(ident, fields, @@ -187,13 +191,15 @@ fn serialize_item_enum(ident: &syn::Ident, variants: &[Variant], item_attrs: &attr::Item) -> Fragment { + assert!(variants.len() as u64 <= u32::MAX as u64); + let arms: Vec<_> = variants.iter() .enumerate() .map(|(variant_index, variant)| { serialize_variant(ident, generics, variant, - variant_index, + variant_index as u32, item_attrs) }) .collect(); @@ -208,7 +214,7 @@ fn serialize_item_enum(ident: &syn::Ident, fn serialize_variant(ident: &syn::Ident, generics: &syn::Generics, variant: &Variant, - variant_index: usize, + variant_index: u32, item_attrs: &attr::Item) -> Tokens { let variant_ident = variant.ident.clone(); @@ -292,7 +298,7 @@ fn serialize_variant(ident: &syn::Ident, fn serialize_externally_tagged_variant(ident: &syn::Ident, generics: &syn::Generics, variant: &Variant, - variant_index: usize, + variant_index: u32, item_attrs: &attr::Item) -> Fragment { let type_name = item_attrs.name().serialize_name(); @@ -538,7 +544,7 @@ fn serialize_untagged_variant(ident: &syn::Ident, enum TupleVariant { ExternallyTagged { type_name: String, - variant_index: usize, + variant_index: u32, variant_name: String, }, Untagged, @@ -589,7 +595,7 @@ fn serialize_tuple_variant(context: TupleVariant, enum StructVariant<'a> { ExternallyTagged { - variant_index: usize, + variant_index: u32, variant_name: String, }, InternallyTagged { tag: &'a str, variant_name: String }, diff --git a/serde_test/src/ser.rs b/serde_test/src/ser.rs index 2a82970f..f6c401ee 100644 --- a/serde_test/src/ser.rs +++ b/serde_test/src/ser.rs @@ -146,7 +146,7 @@ impl<'s, 'a> ser::Serializer for &'s mut Serializer<'a> { fn serialize_unit_variant(self, name: &'static str, - _variant_index: usize, + _variant_index: u32, variant: &'static str) -> Result<(), Error> { if self.tokens.first() == Some(&Token::Enum(name)) { @@ -168,7 +168,7 @@ impl<'s, 'a> ser::Serializer for &'s mut Serializer<'a> { fn serialize_newtype_variant(self, name: &'static str, - _variant_index: usize, + _variant_index: u32, variant: &'static str, value: &T) -> Result<(), Error> @@ -217,7 +217,7 @@ impl<'s, 'a> ser::Serializer for &'s mut Serializer<'a> { fn serialize_tuple_variant(self, name: &'static str, - _variant_index: usize, + _variant_index: u32, variant: &'static str, len: usize) -> Result { @@ -237,7 +237,7 @@ impl<'s, 'a> ser::Serializer for &'s mut Serializer<'a> { fn serialize_struct_variant(self, name: &'static str, - _variant_index: usize, + _variant_index: u32, variant: &'static str, len: usize) -> Result {