diff options
| -rw-r--r-- | compiler/rustc_macros/src/serialize.rs | 23 | ||||
| -rw-r--r-- | compiler/rustc_serialize/src/serialize.rs | 12 |
2 files changed, 14 insertions, 21 deletions
diff --git a/compiler/rustc_macros/src/serialize.rs b/compiler/rustc_macros/src/serialize.rs index 8d898291e58..2c4b794ffa1 100644 --- a/compiler/rustc_macros/src/serialize.rs +++ b/compiler/rustc_macros/src/serialize.rs @@ -96,19 +96,20 @@ fn decode_field(field: &syn::Field, index: usize, is_struct: bool) -> proc_macro } else { quote! { ::rustc_serialize::Decodable::decode } }; - let (decode_method, opt_field_name) = if is_struct { + let __decoder = quote! { __decoder }; + let decode_call = if is_struct { let field_name = field.ident.as_ref().map_or_else(|| index.to_string(), |i| i.to_string()); - (proc_macro2::Ident::new("read_struct_field", field_span), quote! { #field_name, }) + let decode_method = proc_macro2::Ident::new("read_struct_field", field_span); + // Use the span of the field for the method call, so + // that backtraces will point to the field. + quote_spanned! {field_span=> + ::rustc_serialize::Decoder::#decode_method( + #__decoder, #field_name, #decode_inner_method) + } } else { - (proc_macro2::Ident::new("read_enum_variant_arg", field_span), quote! {}) - }; - - let __decoder = quote! { __decoder }; - // Use the span of the field for the method call, so - // that backtraces will point to the field. - let decode_call = quote_spanned! {field_span=> - ::rustc_serialize::Decoder::#decode_method( - #__decoder, #opt_field_name #decode_inner_method) + // Use the span of the field for the method call, so + // that backtraces will point to the field. + quote_spanned! {field_span=> #decode_inner_method(#__decoder) } }; quote! { #decode_call } diff --git a/compiler/rustc_serialize/src/serialize.rs b/compiler/rustc_serialize/src/serialize.rs index b1a75309ccd..5e62a0f1eb2 100644 --- a/compiler/rustc_serialize/src/serialize.rs +++ b/compiler/rustc_serialize/src/serialize.rs @@ -211,14 +211,6 @@ pub trait Decoder { } #[inline] - fn read_enum_variant_arg<T, F>(&mut self, f: F) -> T - where - F: FnOnce(&mut Self) -> T, - { - f(self) - } - - #[inline] fn read_struct<T, F>(&mut self, f: F) -> T where F: FnOnce(&mut Self) -> T, @@ -572,8 +564,8 @@ impl<S: Encoder, T1: Encodable<S>, T2: Encodable<S>> Encodable<S> for Result<T1, impl<D: Decoder, T1: Decodable<D>, T2: Decodable<D>> Decodable<D> for Result<T1, T2> { fn decode(d: &mut D) -> Result<T1, T2> { d.read_enum_variant(|d, disr| match disr { - 0 => Ok(d.read_enum_variant_arg(|d| T1::decode(d))), - 1 => Err(d.read_enum_variant_arg(|d| T2::decode(d))), + 0 => Ok(T1::decode(d)), + 1 => Err(T2::decode(d)), _ => panic!("Encountered invalid discriminant while decoding `Result`."), }) } |
