diff options
Diffstat (limited to 'rust/pin-init/internal/src')
| -rw-r--r-- | rust/pin-init/internal/src/lib.rs | 6 | ||||
| -rw-r--r-- | rust/pin-init/internal/src/pinned_drop.rs | 3 | ||||
| -rw-r--r-- | rust/pin-init/internal/src/zeroable.rs | 27 | 
3 files changed, 33 insertions, 3 deletions
| diff --git a/rust/pin-init/internal/src/lib.rs b/rust/pin-init/internal/src/lib.rs index babe5e878550..297b0129a5bf 100644 --- a/rust/pin-init/internal/src/lib.rs +++ b/rust/pin-init/internal/src/lib.rs @@ -22,6 +22,7 @@ use proc_macro::TokenStream;  #[cfg(kernel)]  #[path = "../../../macros/quote.rs"]  #[macro_use] +#[cfg_attr(not(kernel), rustfmt::skip)]  mod quote;  #[cfg(not(kernel))]  #[macro_use] @@ -46,3 +47,8 @@ pub fn pinned_drop(args: TokenStream, input: TokenStream) -> TokenStream {  pub fn derive_zeroable(input: TokenStream) -> TokenStream {      zeroable::derive(input.into()).into()  } + +#[proc_macro_derive(MaybeZeroable)] +pub fn maybe_derive_zeroable(input: TokenStream) -> TokenStream { +    zeroable::maybe_derive(input.into()).into() +} diff --git a/rust/pin-init/internal/src/pinned_drop.rs b/rust/pin-init/internal/src/pinned_drop.rs index c824dd8b436d..c4ca7a70b726 100644 --- a/rust/pin-init/internal/src/pinned_drop.rs +++ b/rust/pin-init/internal/src/pinned_drop.rs @@ -28,8 +28,7 @@ pub(crate) fn pinned_drop(_args: TokenStream, input: TokenStream) -> TokenStream              // Found the end of the generics, this should be `PinnedDrop`.              assert!(                  matches!(tt, TokenTree::Ident(i) if i.to_string() == "PinnedDrop"), -                "expected 'PinnedDrop', found: '{:?}'", -                tt +                "expected 'PinnedDrop', found: '{tt:?}'"              );              pinned_drop_idx = Some(i);              break; diff --git a/rust/pin-init/internal/src/zeroable.rs b/rust/pin-init/internal/src/zeroable.rs index acc94008c152..e0ed3998445c 100644 --- a/rust/pin-init/internal/src/zeroable.rs +++ b/rust/pin-init/internal/src/zeroable.rs @@ -6,7 +6,14 @@ use proc_macro2 as proc_macro;  use crate::helpers::{parse_generics, Generics};  use proc_macro::{TokenStream, TokenTree}; -pub(crate) fn derive(input: TokenStream) -> TokenStream { +pub(crate) fn parse_zeroable_derive_input( +    input: TokenStream, +) -> ( +    Vec<TokenTree>, +    Vec<TokenTree>, +    Vec<TokenTree>, +    Option<TokenTree>, +) {      let (          Generics {              impl_generics, @@ -64,6 +71,11 @@ pub(crate) fn derive(input: TokenStream) -> TokenStream {      if in_generic && !inserted {          new_impl_generics.extend(quote! { : ::pin_init::Zeroable });      } +    (rest, new_impl_generics, ty_generics, last) +} + +pub(crate) fn derive(input: TokenStream) -> TokenStream { +    let (rest, new_impl_generics, ty_generics, last) = parse_zeroable_derive_input(input);      quote! {          ::pin_init::__derive_zeroable!(              parse_input: @@ -74,3 +86,16 @@ pub(crate) fn derive(input: TokenStream) -> TokenStream {          );      }  } + +pub(crate) fn maybe_derive(input: TokenStream) -> TokenStream { +    let (rest, new_impl_generics, ty_generics, last) = parse_zeroable_derive_input(input); +    quote! { +        ::pin_init::__maybe_derive_zeroable!( +            parse_input: +                @sig(#(#rest)*), +                @impl_generics(#(#new_impl_generics)*), +                @ty_generics(#(#ty_generics)*), +                @body(#last), +        ); +    } +} | 
