Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac5c368e authored by Martin Geisler's avatar Martin Geisler
Browse files

pdl: Add support for fixed fields

Both scalars and enums are supported and tested.

Test: atest pdl_tests pdl_rust_generator_tests_{le,be}
Change-Id: I2e3252f3a4756dc5339517d5287f5b7b7a28f285
parent 77a9a277
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -86,6 +86,10 @@ rust_test_host {
        "tests/generated/packet_decl_complex_scalars_little_endian.rs",
        "tests/generated/packet_decl_empty_big_endian.rs",
        "tests/generated/packet_decl_empty_little_endian.rs",
        "tests/generated/packet_decl_fixed_enum_field_big_endian.rs",
        "tests/generated/packet_decl_fixed_enum_field_little_endian.rs",
        "tests/generated/packet_decl_fixed_scalar_field_big_endian.rs",
        "tests/generated/packet_decl_fixed_scalar_field_little_endian.rs",
        "tests/generated/packet_decl_mask_scalar_value_big_endian.rs",
        "tests/generated/packet_decl_mask_scalar_value_little_endian.rs",
        "tests/generated/packet_decl_mixed_scalars_enums_big_endian.rs",
+4 −1
Original line number Diff line number Diff line
@@ -350,7 +350,10 @@ impl<A: Annotation> Field<A> {
            | FieldDesc::Size { width, .. }
            | FieldDesc::Count { width, .. }
            | FieldDesc::ElementSize { width, .. }
            | FieldDesc::Reserved { width, .. } => Some(*width),
            | FieldDesc::Reserved { width, .. }
            | FieldDesc::FixedScalar { width, .. } => Some(*width),
            FieldDesc::FixedEnum { .. } => self.declaration(scope)?.width(scope, false),
            FieldDesc::Padding { .. } => todo!(),
            FieldDesc::Array { size: Some(size), width, .. } => {
                let width = width.or_else(|| self.declaration(scope)?.width(scope, false))?;
                Some(width * size)
+25 −0
Original line number Diff line number Diff line
@@ -583,4 +583,29 @@ mod tests {
          }
        "
    );

    test_pdl!(
        packet_decl_fixed_scalar_field,
        "
          packet Foo {
            _fixed_ = 7 : 7,
            b: 57,
          }
        "
    );

    test_pdl!(
        packet_decl_fixed_enum_field,
        "
          enum Enum7 : 7 {
            A = 1,
            B = 2,
          }

          packet Foo {
              _fixed_ = A : Enum7,
              b: 57,
          }
        "
    );
}
+23 −0
Original line number Diff line number Diff line
@@ -116,6 +116,29 @@ impl<'a> FieldParser<'a> {
                        let #id = #v;
                    }
                }
                ast::FieldDesc::FixedEnum { enum_id, tag_id, .. } => {
                    let enum_id = format_ident!("{enum_id}");
                    let tag_id = format_ident!("{tag_id}");
                    quote! {
                        if #v != #enum_id::#tag_id as #value_type {
                            return Err(Error::InvalidFixedValue {
                                expected: #enum_id::#tag_id as u64,
                                actual: #v as u64,
                            });
                        }
                    }
                }
                ast::FieldDesc::FixedScalar { value, .. } => {
                    let value = proc_macro2::Literal::usize_unsuffixed(*value);
                    quote! {
                        if #v != #value {
                            return Err(Error::InvalidFixedValue {
                                expected: #value,
                                actual: #v as u64,
                            });
                        }
                    }
                }
                ast::FieldDesc::Typedef { id, type_id } => {
                    let id = format_ident!("{id}");
                    let type_id = format_ident!("{type_id}");
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ pub fn generate(path: &Path) -> String {
            InvalidPacketError,
            #[error("{field} was {value:x}, which is not known")]
            ConstraintOutOfBounds { field: String, value: u64 },
            #[error("Got {actual:x}, expected {expected:x}")]
            InvalidFixedValue { expected: u64, actual: u64 },
            #[error("when parsing {obj} needed length of {wanted} but got {got}")]
            InvalidLengthError { obj: String, wanted: usize, got: usize },
            #[error("array size ({array} bytes) is not a multiple of the element size ({element} bytes)")]
Loading