From 52e93150e6b26b0fba0b27f3e175e9470ab0e4df Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 9 Apr 2017 13:50:38 -0700 Subject: [PATCH] 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 {