Skip to content

Commit 93d9642

Browse files
committed
Simplify helpers::blob
Thanks @fitzgen for the detailed instructions. Fixes #928.
1 parent 978b531 commit 93d9642

File tree

3 files changed

+32
-44
lines changed

3 files changed

+32
-44
lines changed

src/codegen/helpers.rs

+19-31
Original file line numberDiff line numberDiff line change
@@ -60,40 +60,28 @@ pub mod attributes {
6060

6161
/// Generates a proper type for a field or type with a given `Layout`, that is,
6262
/// a type with the correct size and alignment restrictions.
63-
pub struct BlobTyBuilder {
64-
layout: Layout,
65-
}
66-
67-
impl BlobTyBuilder {
68-
pub fn new(layout: Layout) -> Self {
69-
BlobTyBuilder {
70-
layout: layout,
63+
pub fn blob(layout: Layout) -> P<ast::Ty> {
64+
let opaque = layout.opaque();
65+
66+
// FIXME(emilio, #412): We fall back to byte alignment, but there are
67+
// some things that legitimately are more than 8-byte aligned.
68+
//
69+
// Eventually we should be able to `unwrap` here, but...
70+
let ty_name = match opaque.known_rust_type_for_array() {
71+
Some(ty) => ty,
72+
None => {
73+
warn!("Found unknown alignment on code generation!");
74+
"u8"
7175
}
72-
}
76+
};
7377

74-
pub fn build(self) -> P<ast::Ty> {
75-
let opaque = self.layout.opaque();
78+
let data_len = opaque.array_size().unwrap_or(layout.size);
7679

77-
// FIXME(emilio, #412): We fall back to byte alignment, but there are
78-
// some things that legitimately are more than 8-byte aligned.
79-
//
80-
// Eventually we should be able to `unwrap` here, but...
81-
let ty_name = match opaque.known_rust_type_for_array() {
82-
Some(ty) => ty,
83-
None => {
84-
warn!("Found unknown alignment on code generation!");
85-
"u8"
86-
}
87-
};
88-
89-
let data_len = opaque.array_size().unwrap_or(self.layout.size);
90-
91-
let inner_ty = aster::AstBuilder::new().ty().path().id(ty_name).build();
92-
if data_len == 1 {
93-
inner_ty
94-
} else {
95-
aster::ty::TyBuilder::new().array(data_len).build(inner_ty)
96-
}
80+
let inner_ty = aster::AstBuilder::new().ty().path().id(ty_name).build();
81+
if data_len == 1 {
82+
inner_ty
83+
} else {
84+
aster::ty::TyBuilder::new().array(data_len).build(inner_ty)
9785
}
9886
}
9987

src/codegen/mod.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ mod error;
33
mod helpers;
44
pub mod struct_layout;
55

6-
use self::helpers::{BlobTyBuilder, attributes};
6+
use self::helpers::attributes;
77
use self::struct_layout::StructLayoutTracker;
88

99
use aster;
@@ -1155,7 +1155,7 @@ impl Bitfield {
11551155
let bitfield_ty_layout = bitfield_ty.layout(ctx).expect(
11561156
"Bitfield without layout? Gah!",
11571157
);
1158-
let bitfield_int_ty = BlobTyBuilder::new(bitfield_ty_layout).build();
1158+
let bitfield_int_ty = helpers::blob(bitfield_ty_layout);
11591159
let bitfield_ty =
11601160
bitfield_ty.to_rust_ty_or_opaque(ctx, bitfield_ty_item);
11611161

@@ -1205,7 +1205,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
12051205
F: Extend<ast::StructField>,
12061206
M: Extend<ast::ImplItem>,
12071207
{
1208-
let field_ty = BlobTyBuilder::new(self.layout()).build();
1208+
let field_ty = helpers::blob(self.layout());
12091209
let unit_field_name = format!("_bitfield_{}", self.nth());
12101210

12111211
let field = StructFieldBuilder::named(&unit_field_name)
@@ -1355,7 +1355,7 @@ impl<'a> FieldCodegen<'a> for Bitfield {
13551355
let bitfield_ty_layout = bitfield_ty.layout(ctx).expect(
13561356
"Bitfield without layout? Gah!",
13571357
);
1358-
let bitfield_int_ty = BlobTyBuilder::new(bitfield_ty_layout).build();
1358+
let bitfield_int_ty = helpers::blob(bitfield_ty_layout);
13591359

13601360
let bitfield_ty =
13611361
bitfield_ty.to_rust_ty_or_opaque(ctx, bitfield_ty_item);
@@ -1639,7 +1639,7 @@ impl CodeGenerator for CompInfo {
16391639

16401640
if is_union {
16411641
let layout = layout.expect("Unable to get layout information?");
1642-
let ty = BlobTyBuilder::new(layout).build();
1642+
let ty = helpers::blob(layout);
16431643

16441644
let field = if self.can_be_rust_union(ctx) {
16451645
StructFieldBuilder::named("_bindgen_union_align").build_ty(ty)
@@ -1662,7 +1662,7 @@ impl CodeGenerator for CompInfo {
16621662

16631663
match layout {
16641664
Some(l) => {
1665-
let ty = BlobTyBuilder::new(l).build();
1665+
let ty = helpers::blob(l);
16661666
let field = StructFieldBuilder::named(
16671667
"_bindgen_opaque_blob",
16681668
).pub_()
@@ -1707,7 +1707,7 @@ impl CodeGenerator for CompInfo {
17071707
};
17081708

17091709
if has_address {
1710-
let ty = BlobTyBuilder::new(Layout::new(1, 1)).build();
1710+
let ty = helpers::blob(Layout::new(1, 1));
17111711
let field =
17121712
StructFieldBuilder::named("_address").pub_().build_ty(ty);
17131713
fields.push(field);
@@ -2728,7 +2728,7 @@ trait TryToOpaque {
27282728
extra: &Self::Extra,
27292729
) -> error::Result<P<ast::Ty>> {
27302730
self.try_get_layout(ctx, extra).map(|layout| {
2731-
BlobTyBuilder::new(layout).build()
2731+
helpers::blob(layout)
27322732
})
27332733
}
27342734
}
@@ -2756,7 +2756,7 @@ trait ToOpaque: TryToOpaque {
27562756
extra: &Self::Extra,
27572757
) -> P<ast::Ty> {
27582758
let layout = self.get_layout(ctx, extra);
2759-
BlobTyBuilder::new(layout).build()
2759+
helpers::blob(layout)
27602760
}
27612761
}
27622762

@@ -2814,7 +2814,7 @@ where
28142814
|_| if let Ok(layout) =
28152815
self.try_get_layout(ctx, extra)
28162816
{
2817-
Ok(BlobTyBuilder::new(layout).build())
2817+
Ok(helpers::blob(layout))
28182818
} else {
28192819
Err(error::Error::NoLayoutForOpaqueBlob)
28202820
},

src/codegen/struct_layout.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Helpers for code generation that need struct layout
22
3-
use super::helpers::BlobTyBuilder;
3+
use super::helpers;
44

55
use aster::struct_field::StructFieldBuilder;
66

@@ -295,7 +295,7 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> {
295295
if self.max_field_align < layout.align &&
296296
layout.align <= mem::size_of::<*mut ()>()
297297
{
298-
let ty = BlobTyBuilder::new(Layout::new(0, layout.align)).build();
298+
let ty = helpers::blob(Layout::new(0, layout.align));
299299

300300
Some(
301301
StructFieldBuilder::named("__bindgen_align")
@@ -312,7 +312,7 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> {
312312
}
313313

314314
fn padding_field(&mut self, layout: Layout) -> ast::StructField {
315-
let ty = BlobTyBuilder::new(layout).build();
315+
let ty = helpers::blob(layout);
316316
let padding_count = self.padding_count;
317317

318318
self.padding_count += 1;

0 commit comments

Comments
 (0)