Skip to content

Commit 88c3f32

Browse files
committed
Fixed support for single field structures in messages
1 parent a89d6d6 commit 88c3f32

5 files changed

Lines changed: 31 additions & 12 deletions

File tree

compiler/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ toml = { version = "0.5.11", optional = true }
1717
bp3d-util = { version = "1.4.0", features = ["simple-error", "path", "index-map"], optional = true }
1818
itertools = { version = "0.13.0", optional = true }
1919
regex = { version = "1.10.5", optional = true }
20-
bp3d-debug = { version = "1.0.0-rc.5.0.0", optional = true }
20+
bp3d-debug = { version = "1.0.0-rc.6.1.0", optional = true }
2121

2222
[features]
2323
model = ["serde"]

compiler/src/compiler/message.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use crate::compiler::Protocol;
3535
use crate::model::message::MessageFieldValue;
3636
use crate::model::protocol::{Description, Endianness};
3737
use crate::model::structure::StructFieldRaw;
38-
use bp3d_debug::error;
38+
use bp3d_debug::{error, trace};
3939
use std::cell::Cell;
4040
use std::fmt::{Display, Formatter};
4141
use std::rc::Rc;
@@ -421,12 +421,12 @@ impl Field {
421421
let r = Referenced::lookup(proto, &item_type).ok_or(Error::UndefinedReference(item_type))?;
422422
match r {
423423
Referenced::Struct(r) => {
424-
if !has_unions
425-
&& r.fields.len() == 1
426-
&& r.fields[0].ty.as_fixed().is_some()
427-
&& r.fields[0].ty.as_fixed().map(|v| v.raw.is_transmute()).unwrap_or_default()
428-
&& r.fields[0].loc.bit_size % 8 == 0
429-
{
424+
let is_single = r.fields.len() == 1;
425+
let is_fixed = r.fields[0].ty.as_fixed().is_some();
426+
let is_none = r.fields[0].ty.as_fixed().map(|v| v.raw.is_none()).unwrap_or_default();
427+
let is_byte_aligned = r.fields[0].loc.bit_size % 8 == 0;
428+
trace!({has_unions} {is_single} {is_fixed} {is_none} {is_byte_aligned}, "Found struct reference: {}", r.name);
429+
if !has_unions && is_single && is_fixed && is_none && is_byte_aligned {
430430
let fixed = unsafe { r.fields[0].ty.as_fixed().unwrap_unchecked() };
431431
Ok(Field {
432432
name: value.name,

compiler/src/compiler/structure.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ pub enum FieldRaw {
219219
}
220220

221221
impl FieldRaw {
222-
pub fn is_transmute(&self) -> bool {
223-
matches!(self, Self::Transmute)
222+
pub fn is_none(&self) -> bool {
223+
matches!(self, Self::None)
224224
}
225225

226226
fn from_model(ty: SimpleType, bit_size: usize) -> FieldRaw {

testprog/src/test.json5

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
{
22
name: "test",
3+
structs: [
4+
{
5+
name: "SingleValue",
6+
fields: [
7+
{
8+
name: "v",
9+
raw: {
10+
type: "unsigned",
11+
bits: 8
12+
}
13+
}
14+
]
15+
}
16+
],
317
messages: [
418
{
519
name: "Test1",
@@ -16,7 +30,8 @@
1630
type: "unsigned",
1731
bits: 32
1832
}
19-
}
33+
},
34+
{ name: "p3", item_type: "SingleValue" }
2035
]
2136
},
2237
{

testprog/tests/test_test.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ fn write_message<W: Write>(out: W) {
3535
p1: Some(Test1 {
3636
s1: "this is a test",
3737
p1: 42,
38+
p3: 42
3839
}),
3940
s1: "a test",
4041
s2: Some("hello world"),
@@ -48,6 +49,7 @@ fn test() {
4849
write_message(&mut v);
4950
let msg = Test::from_bytes(&v).unwrap().into_inner();
5051
assert_eq!(msg.p1.as_ref().unwrap().p1, 42);
52+
assert_eq!(msg.p1.as_ref().unwrap().p3, 42);
5153
assert_eq!(msg.p1.as_ref().unwrap().s1, "this is a test");
5254
assert_eq!(msg.s1, "a test");
5355
assert_eq!(msg.s2, Some("hello world"));
@@ -68,9 +70,11 @@ fn test_offsets() {
6870
assert_eq!(offsets.s2.start, 7);
6971
assert_eq!(offsets.s2.size(), 13);
7072
assert_eq!(offsets.p1.start, 20);
71-
assert_eq!(offsets.p1.size(), 20);
73+
assert_eq!(offsets.p1.size(), 21);
7274
assert_eq!(offsets.p1_offsets.unwrap().s1.start, 0);
7375
assert_eq!(offsets.p1_offsets.unwrap().s1.size(), 15);
7476
assert_eq!(offsets.p1_offsets.unwrap().p1.start, 15);
7577
assert_eq!(offsets.p1_offsets.unwrap().p1.size(), 4);
78+
assert_eq!(offsets.p1_offsets.unwrap().p3.start, 19);
79+
assert_eq!(offsets.p1_offsets.unwrap().p3.size(), 1);
7680
}

0 commit comments

Comments
 (0)