Commit e9e1e7e7 authored by Chuck Lever's avatar Chuck Lever
Browse files

xdrgen: Add generator code for XDR width macros



Introduce logic in the code generators to emit maxsize (XDR
width) definitions. In C, these are pre-processor macros.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent ce5a75d9
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -111,3 +111,7 @@ class SourceGenerator:
    def emit_encoder(self, node: _XdrAst) -> None:
        """Emit one encoder function for this XDR type"""
        raise NotImplementedError("Encoder generation not supported")

    def emit_maxsize(self, node: _XdrAst) -> None:
        """Emit one maxsize macro for this XDR type"""
        raise NotImplementedError("Maxsize macro generation not supported")
+12 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@
"""Generate code to handle XDR enum types"""

from generators import SourceGenerator, create_jinja2_environment
from xdr_ast import _XdrEnum, public_apis, big_endian
from xdr_ast import _XdrEnum, public_apis, big_endian, get_header_name


class XdrEnumGenerator(SourceGenerator):
@@ -51,3 +51,14 @@ class XdrEnumGenerator(SourceGenerator):
        else:
            template = self.environment.get_template("encoder/enum.j2")
        print(template.render(name=node.name))

    def emit_maxsize(self, node: _XdrEnum) -> None:
        """Emit one maxsize macro for an XDR enum type"""
        macro_name = get_header_name().upper() + "_" + node.name + "_sz"
        template = self.environment.get_template("maxsize/enum.j2")
        print(
            template.render(
                macro=macro_name,
                width=" + ".join(node.symbolic_width()),
            )
        )
+17 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ from xdr_ast import _XdrBasic, _XdrString
from xdr_ast import _XdrFixedLengthOpaque, _XdrVariableLengthOpaque
from xdr_ast import _XdrFixedLengthArray, _XdrVariableLengthArray
from xdr_ast import _XdrOptionalData, _XdrPointer, _XdrDeclaration
from xdr_ast import public_apis
from xdr_ast import public_apis, get_header_name


def emit_pointer_declaration(environment: Environment, node: _XdrPointer) -> None:
@@ -247,6 +247,18 @@ def emit_pointer_encoder(environment: Environment, node: _XdrPointer) -> None:
    print(template.render())


def emit_pointer_maxsize(environment: Environment, node: _XdrPointer) -> None:
    """Emit one maxsize macro for an XDR pointer type"""
    macro_name = get_header_name().upper() + "_" + node.name + "_sz"
    template = get_jinja2_template(environment, "maxsize", "pointer")
    print(
        template.render(
            macro=macro_name,
            width=" + ".join(node.symbolic_width()),
        )
    )


class XdrPointerGenerator(SourceGenerator):
    """Generate source code for XDR pointer"""

@@ -270,3 +282,7 @@ class XdrPointerGenerator(SourceGenerator):
    def emit_encoder(self, node: _XdrPointer) -> None:
        """Emit one encoder function for an XDR pointer type"""
        emit_pointer_encoder(self.environment, node)

    def emit_maxsize(self, node: _XdrPointer) -> None:
        """Emit one maxsize macro for an XDR pointer type"""
        emit_pointer_maxsize(self.environment, node)
+17 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ from xdr_ast import _XdrBasic, _XdrString
from xdr_ast import _XdrFixedLengthOpaque, _XdrVariableLengthOpaque
from xdr_ast import _XdrFixedLengthArray, _XdrVariableLengthArray
from xdr_ast import _XdrOptionalData, _XdrStruct, _XdrDeclaration
from xdr_ast import public_apis
from xdr_ast import public_apis, get_header_name


def emit_struct_declaration(environment: Environment, node: _XdrStruct) -> None:
@@ -247,6 +247,18 @@ def emit_struct_encoder(environment: Environment, node: _XdrStruct) -> None:
    print(template.render())


def emit_struct_maxsize(environment: Environment, node: _XdrStruct) -> None:
    """Emit one maxsize macro for an XDR struct type"""
    macro_name = get_header_name().upper() + "_" + node.name + "_sz"
    template = get_jinja2_template(environment, "maxsize", "struct")
    print(
        template.render(
            macro=macro_name,
            width=" + ".join(node.symbolic_width()),
        )
    )


class XdrStructGenerator(SourceGenerator):
    """Generate source code for XDR structs"""

@@ -270,3 +282,7 @@ class XdrStructGenerator(SourceGenerator):
    def emit_encoder(self, node: _XdrStruct) -> None:
        """Emit one encoder function for an XDR struct type"""
        emit_struct_encoder(self.environment, node)

    def emit_maxsize(self, node: _XdrStruct) -> None:
        """Emit one maxsize macro for an XDR struct type"""
        emit_struct_maxsize(self.environment, node)
+17 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ from xdr_ast import _XdrBasic, _XdrTypedef, _XdrString
from xdr_ast import _XdrFixedLengthOpaque, _XdrVariableLengthOpaque
from xdr_ast import _XdrFixedLengthArray, _XdrVariableLengthArray
from xdr_ast import _XdrOptionalData, _XdrVoid, _XdrDeclaration
from xdr_ast import public_apis
from xdr_ast import public_apis, get_header_name


def emit_typedef_declaration(environment: Environment, node: _XdrDeclaration) -> None:
@@ -230,6 +230,18 @@ def emit_typedef_encoder(environment: Environment, node: _XdrDeclaration) -> Non
        raise NotImplementedError("typedef: type not recognized")


def emit_typedef_maxsize(environment: Environment, node: _XdrDeclaration) -> None:
    """Emit a maxsize macro for an XDR typedef"""
    macro_name = get_header_name().upper() + "_" + node.name + "_sz"
    template = get_jinja2_template(environment, "maxsize", node.template)
    print(
        template.render(
            macro=macro_name,
            width=" + ".join(node.symbolic_width()),
        )
    )


class XdrTypedefGenerator(SourceGenerator):
    """Generate source code for XDR typedefs"""

@@ -253,3 +265,7 @@ class XdrTypedefGenerator(SourceGenerator):
    def emit_encoder(self, node: _XdrTypedef) -> None:
        """Emit one encoder function for an XDR typedef"""
        emit_typedef_encoder(self.environment, node.declaration)

    def emit_maxsize(self, node: _XdrTypedef) -> None:
        """Emit one maxsize macro for an XDR typedef"""
        emit_typedef_maxsize(self.environment, node.declaration)
Loading