Skip to content

Commit 2230175

Browse files
Fix padding fields default value being ignored when using Msb (#57)
* Add tests * Calculate offset for all fields during member construction
1 parent 6dd0901 commit 2230175

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

src/lib.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,13 @@ impl Member {
341341

342342
let ignore = ignore || access == Access::None;
343343

344+
// compute the offset
345+
let offset = if order == Order::Lsb {
346+
offset
347+
} else {
348+
base_bits - offset - bits
349+
};
350+
344351
if bits > 0 && !ignore {
345352
// overflow check
346353
if offset + bits > base_bits {
@@ -358,13 +365,6 @@ impl Member {
358365
Access::None => (quote!(), quote!()),
359366
};
360367

361-
// compute the offset
362-
let offset = if order == Order::Lsb {
363-
offset
364-
} else {
365-
base_bits - offset - bits
366-
};
367-
368368
// auto-conversion from zero
369369
if default.is_empty() {
370370
if !from.is_empty() {
@@ -427,7 +427,8 @@ impl Member {
427427
let repr_into = &self.repr_into;
428428
let repr_from = &self.repr_from;
429429
let bits = self.bits as u32;
430-
quote!{
430+
431+
quote! {
431432
let mask = #base_ty::MAX >> (#base_ty::BITS - #bits);
432433
this.0 = #repr_from(#repr_into(this.0) | (((#default as #base_ty) & mask) << #offset));
433434
}

tests/test.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,3 +565,31 @@ fn default_without_setter() {
565565
reserved: bool
566566
}
567567
}
568+
569+
#[test]
570+
fn default_msb_padding_default_value() {
571+
#[bitfield(u8, order = Msb)]
572+
struct MyMsbByte {
573+
#[bits(4, default = 0b1111)]
574+
__padding: usize,
575+
#[bits(4, default = 0b1010)]
576+
kind: usize,
577+
}
578+
let my_byte_msb = MyMsbByte::new();
579+
let val: u8 = my_byte_msb.into();
580+
assert_eq!(val, 0b1111_1010);
581+
}
582+
583+
#[test]
584+
fn default_lsb_padding_default_value() {
585+
#[bitfield(u8, order = Lsb)]
586+
struct MyMsbByte {
587+
#[bits(4, default = 0b1111)]
588+
__padding: usize,
589+
#[bits(4, default = 0b1010)]
590+
kind: usize,
591+
}
592+
let my_byte_msb = MyMsbByte::new();
593+
let val: u8 = my_byte_msb.into();
594+
assert_eq!(val, 0b1010_1111);
595+
}

0 commit comments

Comments
 (0)