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

Commit 8f8ae682 authored by Henri Chataing's avatar Henri Chataing Committed by Gerrit Code Review
Browse files

Merge "pdl: Generate additional canonical test vectors"

parents 0919635b 9f4ada81
Loading
Loading
Loading
Loading
+3 −17
Original line number Original line Diff line number Diff line
@@ -155,7 +155,7 @@ class FieldParser:
    def parse_array_element_dynamic_(self, field: ast.ArrayField, span: str):
    def parse_array_element_dynamic_(self, field: ast.ArrayField, span: str):
        """Parse a single array field element of variable size."""
        """Parse a single array field element of variable size."""
        if isinstance(field.type, ast.StructDeclaration):
        if isinstance(field.type, ast.StructDeclaration):
            self.append_(f"    element, span = {field.type_id}.parse({span})")
            self.append_(f"    element, {span} = {field.type_id}.parse({span})")
            self.append_(f"    {field.id}.append(element)")
            self.append_(f"    {field.id}.append(element)")
        else:
        else:
            raise Exception(f'Unexpected array element type {field.type_id} {field.width}')
            raise Exception(f'Unexpected array element type {field.type_id} {field.width}')
@@ -353,13 +353,6 @@ class FieldParser:
                self.unchecked_append_(f"fields['{field.id}'] = {field.type_id}.parse_all({span})")
                self.unchecked_append_(f"fields['{field.id}'] = {field.type_id}.parse_all({span})")
            self.offset = end_offset
            self.offset = end_offset


    def parse_padding_field_(self, field: ast.PaddingField):
        """Parse a padding field. The value is ignored."""

        if self.shift != 0:
            raise Exception('Padding field does not start on an octet boundary')
        self.offset += field.size

    def parse_payload_field_(self, field: Union[ast.BodyField, ast.PayloadField]):
    def parse_payload_field_(self, field: Union[ast.BodyField, ast.PayloadField]):
        """Parse body and payload fields."""
        """Parse body and payload fields."""


@@ -483,7 +476,7 @@ class FieldParser:


        # Padding fields.
        # Padding fields.
        elif isinstance(field, ast.PaddingField):
        elif isinstance(field, ast.PaddingField):
            self.parse_padding_field_(field)
            pass


        # Array fields.
        # Array fields.
        elif isinstance(field, ast.ArrayField):
        elif isinstance(field, ast.ArrayField):
@@ -666,13 +659,6 @@ class FieldSerializer:
        else:
        else:
            self.append_(f"_span.extend(self.{field.id}.serialize())")
            self.append_(f"_span.extend(self.{field.id}.serialize())")


    def serialize_padding_field_(self, field: ast.PaddingField):
        """Serialize a padding field. The value is zero."""

        if self.shift != 0:
            raise Exception('Padding field does not start on an octet boundary')
        self.append_(f"_span.extend([0] * {field.width})")

    def serialize_payload_field_(self, field: Union[ast.BodyField, ast.PayloadField]):
    def serialize_payload_field_(self, field: Union[ast.BodyField, ast.PayloadField]):
        """Serialize body and payload fields."""
        """Serialize body and payload fields."""


@@ -714,7 +700,7 @@ class FieldSerializer:


        # Padding fields.
        # Padding fields.
        elif isinstance(field, ast.PaddingField):
        elif isinstance(field, ast.PaddingField):
            self.serialize_padding_field_(field)
            pass


        # Array fields.
        # Array fields.
        elif isinstance(field, ast.ArrayField):
        elif isinstance(field, ast.ArrayField):
+10 −3
Original line number Original line Diff line number Diff line
@@ -15,7 +15,8 @@ def desugar_field_(field: Field, previous: Field, constraints: Dict[str, Constra


    elif isinstance(field, PaddingField):
    elif isinstance(field, PaddingField):
        previous.padded_size = field.size
        previous.padded_size = field.size
        return []
        field.padded_field = previous
        return [field]


    elif isinstance(field, TypedefField) and field.id in constraints:
    elif isinstance(field, TypedefField) and field.id in constraints:
        tag_id = constraints[field.id].tag_id
        tag_id = constraints[field.id].tag_id
@@ -124,7 +125,7 @@ def get_packet_ancestor(
    if decl.parent_id is None:
    if decl.parent_id is None:
        return decl
        return decl
    else:
    else:
        return get_packet_ancestor(decl.grammar.packet_scope[decl.parent_id])
        return get_packet_ancestor(decl.file.packet_scope[decl.parent_id])




def get_derived_packets(decl: Union[PacketDeclaration, StructDeclaration]
def get_derived_packets(decl: Union[PacketDeclaration, StructDeclaration]
@@ -158,7 +159,11 @@ def get_field_size(field: Field, skip_payload: bool = False) -> Optional[int]:
        return field.width or field.type.width
        return field.width or field.type.width


    elif isinstance(field, PaddingField):
    elif isinstance(field, PaddingField):
        return field.width * 8
        # Padding field width is added to the padded field size.
        return 0

    elif isinstance(field, ArrayField) and field.padded_size is not None:
        return field.padded_size * 8


    elif isinstance(field, ArrayField) and field.size is not None:
    elif isinstance(field, ArrayField) and field.size is not None:
        element_width = field.width or get_declaration_size(field.type)
        element_width = field.width or get_declaration_size(field.type)
@@ -189,6 +194,8 @@ def get_declaration_size(decl: Declaration, skip_payload: bool = False) -> Optio
    elif isinstance(decl, (PacketDeclaration, StructDeclaration)):
    elif isinstance(decl, (PacketDeclaration, StructDeclaration)):
        parent = decl.parent
        parent = decl.parent
        packet_size = get_declaration_size(parent, skip_payload=True) if parent else 0
        packet_size = get_declaration_size(parent, skip_payload=True) if parent else 0
        if packet_size is None:
            return None
        for f in decl.fields:
        for f in decl.fields:
            field_size = get_field_size(f, skip_payload=skip_payload)
            field_size = get_field_size(f, skip_payload=skip_payload)
            if field_size is None:
            if field_size is None:
+2347 −453

File changed.

Preview size limit exceeded, changes collapsed.

+2509 −551

File changed.

Preview size limit exceeded, changes collapsed.