summaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authoronalante-msft <89409054+onalante-msft@users.noreply.github.com>2022-06-27 12:10:07 -0700
committerEmilio Cobos Álvarez <emilio@crisal.io>2022-07-16 14:33:01 +0200
commitdf57bd97910c1261842f3645c64113d6fa199c73 (patch)
treebbd946f7b13e0feb4ccb6c0a7a81b3e4b2731397 /src/codegen
parent83d0fd56a73a642956fc642a4bd5a4596ab44ac7 (diff)
Remove functions, use same uninit for all field tests
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/mod.rs70
1 files changed, 34 insertions, 36 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index 2b285766..607f57ac 100644
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -2172,56 +2172,54 @@ impl CodeGenerator for CompInfo {
let should_skip_field_offset_checks =
is_opaque || too_many_base_vtables;
- let (check_field_offset_decls, check_field_offset_invocs) = if should_skip_field_offset_checks
+ let (uninit_decl, check_field_offset) = if should_skip_field_offset_checks
{
- (vec![], vec![])
+ (None, vec![])
} else {
- self.fields()
- .iter()
- .filter_map(|field| match *field {
- Field::DataMember(ref f) if f.name().is_some() => Some(f),
- _ => None,
- })
- .flat_map(|field| {
- let name = field.name().unwrap();
- field.offset().map(|offset| {
- let field_offset = offset / 8;
- let field_name = ctx.rust_ident(name);
- // Put each check in its own function, so
- // that rustc with opt-level=0 doesn't take
- // too much stack space, see #2218.
- let test_fn = Ident::new(&format!("test_field_{}", name), Span::call_site());
- (
+ (
+ Some(quote! {
+ // Use a shared MaybeUninit so that rustc with
+ // opt-level=0 doesn't take too much stack
+ // space, see #2218.
+ const UNINIT: ::#prefix::mem::MaybeUninit<#canonical_ident> = ::#prefix::mem::MaybeUninit::uninit();
+ }),
+ self.fields()
+ .iter()
+ .filter_map(|field| match *field {
+ Field::DataMember(ref f) if f.name().is_some() => Some(f),
+ _ => None,
+ })
+ .flat_map(|field| {
+ let name = field.name().unwrap();
+ field.offset().map(|offset| {
+ let field_offset = offset / 8;
+ let field_name = ctx.rust_ident(name);
quote! {
- fn #test_fn() {
- assert_eq!(
- unsafe {
- let uninit = ::#prefix::mem::MaybeUninit::<#canonical_ident>::uninit();
- let ptr = uninit.as_ptr();
- ::#prefix::ptr::addr_of!((*ptr).#field_name) as usize - ptr as usize
- },
- #field_offset,
- concat!("Offset of field: ", stringify!(#canonical_ident), "::", stringify!(#field_name))
- );
- }
- },
- quote! { #test_fn(); }
- )
+ assert_eq!(
+ unsafe {
+ let ptr = UNINIT.as_ptr();
+ ::#prefix::ptr::addr_of!((*ptr).#field_name) as usize - ptr as usize
+ },
+ #field_offset,
+ concat!("Offset of field: ", stringify!(#canonical_ident), "::", stringify!(#field_name))
+ );
+ }
+ })
})
- })
- .unzip()
+ .collect()
+ )
};
let item = quote! {
#[test]
fn #fn_name() {
- #( #check_field_offset_decls )*
+ #uninit_decl
assert_eq!(#size_of_expr,
#size,
concat!("Size of: ", stringify!(#canonical_ident)));
#check_struct_align
- #( #check_field_offset_invocs )*
+ #( #check_field_offset )*
}
};
result.push(item);