From d99de71f1f6b28252592cd51267eb18bb7714181 Mon Sep 17 00:00:00 2001 From: Pierre Avital Date: Sat, 6 Jul 2024 09:36:23 +0200 Subject: [PATCH] Refine repr support --- CHANGELOG.md | 3 +++ Cargo.toml | 8 ++++---- stabby-macros/src/structs.rs | 28 +++++++++++++--------------- stabby/src/tests/layouts.rs | 8 ++++++++ 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71e8834..678414a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# 36.1.1-rc5 (api=2.0.0, abi=2.0.0) +- Refine support for `#[repr(transparent)]` and `#[repr(align(n))]` in `#[stabby::stabby]` structs up to n=64kiB. + # 36.1.1-rc4 (api=2.0.0, abi=2.0.0) - Add support for `#[repr(transparent)]` and `#[repr(align(n))]` in `#[stabby::stabby]` structs up to n=64kiB. diff --git a/Cargo.toml b/Cargo.toml index 5b1673f..8a260b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,12 +33,12 @@ license = " EPL-2.0 OR Apache-2.0" categories = ["development-tools::ffi", "no-std::no-alloc"] repository = "https://github.com/ZettaScaleLabs/stabby" readme = "stabby/README.md" -version = "36.1.1-rc4" # Track +version = "36.1.1-rc5" # Track [workspace.dependencies] -stabby-macros = { path = "./stabby-macros/", version = "36.1.1-rc4", default-features = false } # Track -stabby-abi = { path = "./stabby-abi/", version = "36.1.1-rc4", default-features = false } # Track -stabby = { path = "./stabby/", version = "36.1.1-rc4", default-features = false } # Track +stabby-macros = { path = "./stabby-macros/", version = "36.1.1-rc5", default-features = false } # Track +stabby-abi = { path = "./stabby-abi/", version = "36.1.1-rc5", default-features = false } # Track +stabby = { path = "./stabby/", version = "36.1.1-rc5", default-features = false } # Track abi_stable = "0.11.0" libc = "0.2" diff --git a/stabby-macros/src/structs.rs b/stabby-macros/src/structs.rs index 2510268..9fa9fd6 100644 --- a/stabby-macros/src/structs.rs +++ b/stabby-macros/src/structs.rs @@ -122,17 +122,15 @@ pub fn stabby( let clauses = where_clause.as_ref().map(|w| &w.predicates); let mut layout = None; let mut report = crate::Report::r#struct(ident.to_string(), version, module); - let repr = attrs - .iter() - .find_map(|attr| { - if attr.path.is_ident("repr") { - syn::parse2::(attr.tokens.clone()).ok() - } else { - None - } - }) - .unwrap_or(AllowedRepr::C); - optimize &= !matches!(repr, AllowedRepr::Align(_)); + let repr = attrs.iter().find_map(|attr| { + if attr.path.is_ident("repr") { + syn::parse2::(attr.tokens.clone()).ok() + } else { + None + } + }); + let repr_attr = repr.is_none().then(|| quote! {#[repr(C)]}); + optimize &= !matches!(repr, Some(AllowedRepr::Align(_))); let struct_code = match &fields { syn::Fields::Named(fields) => { let fields = &fields.named; @@ -146,7 +144,7 @@ pub fn stabby( } quote! { #(#attrs)* - #repr + #repr_attr #vis struct #ident #generics #where_clause { #fields } @@ -164,14 +162,14 @@ pub fn stabby( } quote! { #(#attrs)* - #repr + #repr_attr #vis struct #ident #generics #where_clause (#fields); } } syn::Fields::Unit => { quote! { #(#attrs)* - #repr + #repr_attr #vis struct #ident #generics #where_clause; } } @@ -179,7 +177,7 @@ pub fn stabby( let layout = layout.map_or_else( || quote!(()), |layout| { - if let AllowedRepr::Align(mut n) = repr { + if let Some(AllowedRepr::Align(mut n)) = repr { let mut align = quote!(#st::U1); while n > 1 { n /= 2; diff --git a/stabby/src/tests/layouts.rs b/stabby/src/tests/layouts.rs index 9ef6e48..3e28b79 100644 --- a/stabby/src/tests/layouts.rs +++ b/stabby/src/tests/layouts.rs @@ -127,6 +127,12 @@ pub struct EndPadding { a: usize, b: u8, } +#[allow(dead_code)] +#[stabby::stabby] +#[repr(transparent)] +pub struct Transparent { + a: usize, +} #[test] fn layouts() { @@ -255,6 +261,8 @@ fn layouts() { 3 * 16 ); let _ = Align1024::ID; + let _: U1024 = ::Align::default(); + let _: U1024 = ::Size::default(); } #[allow(dead_code)]