Path: blob/master/tools/net/sunrpc/xdrgen/generators/pointer.py
26292 views
#!/usr/bin/env python31# ex: set filetype=python:23"""Generate code to handle XDR pointer types"""45from jinja2 import Environment67from generators import SourceGenerator, kernel_c_type8from generators import create_jinja2_environment, get_jinja2_template910from xdr_ast import _XdrBasic, _XdrString11from xdr_ast import _XdrFixedLengthOpaque, _XdrVariableLengthOpaque12from xdr_ast import _XdrFixedLengthArray, _XdrVariableLengthArray13from xdr_ast import _XdrOptionalData, _XdrPointer, _XdrDeclaration14from xdr_ast import public_apis, get_header_name151617def emit_pointer_declaration(environment: Environment, node: _XdrPointer) -> None:18"""Emit a declaration pair for an XDR pointer type"""19if node.name in public_apis:20template = get_jinja2_template(environment, "declaration", "close")21print(template.render(name=node.name))222324def emit_pointer_member_definition(25environment: Environment, field: _XdrDeclaration26) -> None:27"""Emit a definition for one field in an XDR struct"""28if isinstance(field, _XdrBasic):29template = get_jinja2_template(environment, "definition", field.template)30print(31template.render(32name=field.name,33type=kernel_c_type(field.spec),34classifier=field.spec.c_classifier,35)36)37elif isinstance(field, _XdrFixedLengthOpaque):38template = get_jinja2_template(environment, "definition", field.template)39print(40template.render(41name=field.name,42size=field.size,43)44)45elif isinstance(field, _XdrVariableLengthOpaque):46template = get_jinja2_template(environment, "definition", field.template)47print(template.render(name=field.name))48elif isinstance(field, _XdrString):49template = get_jinja2_template(environment, "definition", field.template)50print(template.render(name=field.name))51elif isinstance(field, _XdrFixedLengthArray):52template = get_jinja2_template(environment, "definition", field.template)53print(54template.render(55name=field.name,56type=kernel_c_type(field.spec),57size=field.size,58)59)60elif isinstance(field, _XdrVariableLengthArray):61template = get_jinja2_template(environment, "definition", field.template)62print(63template.render(64name=field.name,65type=kernel_c_type(field.spec),66classifier=field.spec.c_classifier,67)68)69elif isinstance(field, _XdrOptionalData):70template = get_jinja2_template(environment, "definition", field.template)71print(72template.render(73name=field.name,74type=kernel_c_type(field.spec),75classifier=field.spec.c_classifier,76)77)787980def emit_pointer_definition(environment: Environment, node: _XdrPointer) -> None:81"""Emit a definition for an XDR pointer type"""82template = get_jinja2_template(environment, "definition", "open")83print(template.render(name=node.name))8485for field in node.fields[0:-1]:86emit_pointer_member_definition(environment, field)8788template = get_jinja2_template(environment, "definition", "close")89print(template.render(name=node.name))909192def emit_pointer_member_decoder(93environment: Environment, field: _XdrDeclaration94) -> None:95"""Emit a decoder for one field in an XDR pointer"""96if isinstance(field, _XdrBasic):97template = get_jinja2_template(environment, "decoder", field.template)98print(99template.render(100name=field.name,101type=field.spec.type_name,102classifier=field.spec.c_classifier,103)104)105elif isinstance(field, _XdrFixedLengthOpaque):106template = get_jinja2_template(environment, "decoder", field.template)107print(108template.render(109name=field.name,110size=field.size,111)112)113elif isinstance(field, _XdrVariableLengthOpaque):114template = get_jinja2_template(environment, "decoder", field.template)115print(116template.render(117name=field.name,118maxsize=field.maxsize,119)120)121elif isinstance(field, _XdrString):122template = get_jinja2_template(environment, "decoder", field.template)123print(124template.render(125name=field.name,126maxsize=field.maxsize,127)128)129elif isinstance(field, _XdrFixedLengthArray):130template = get_jinja2_template(environment, "decoder", field.template)131print(132template.render(133name=field.name,134type=field.spec.type_name,135size=field.size,136classifier=field.spec.c_classifier,137)138)139elif isinstance(field, _XdrVariableLengthArray):140template = get_jinja2_template(environment, "decoder", field.template)141print(142template.render(143name=field.name,144type=field.spec.type_name,145maxsize=field.maxsize,146classifier=field.spec.c_classifier,147)148)149elif isinstance(field, _XdrOptionalData):150template = get_jinja2_template(environment, "decoder", field.template)151print(152template.render(153name=field.name,154type=field.spec.type_name,155classifier=field.spec.c_classifier,156)157)158159160def emit_pointer_decoder(environment: Environment, node: _XdrPointer) -> None:161"""Emit one decoder function for an XDR pointer type"""162template = get_jinja2_template(environment, "decoder", "open")163print(template.render(name=node.name))164165for field in node.fields[0:-1]:166emit_pointer_member_decoder(environment, field)167168template = get_jinja2_template(environment, "decoder", "close")169print(template.render())170171172def emit_pointer_member_encoder(173environment: Environment, field: _XdrDeclaration174) -> None:175"""Emit an encoder for one field in a XDR pointer"""176if isinstance(field, _XdrBasic):177template = get_jinja2_template(environment, "encoder", field.template)178print(179template.render(180name=field.name,181type=field.spec.type_name,182)183)184elif isinstance(field, _XdrFixedLengthOpaque):185template = get_jinja2_template(environment, "encoder", field.template)186print(187template.render(188name=field.name,189size=field.size,190)191)192elif isinstance(field, _XdrVariableLengthOpaque):193template = get_jinja2_template(environment, "encoder", field.template)194print(195template.render(196name=field.name,197maxsize=field.maxsize,198)199)200elif isinstance(field, _XdrString):201template = get_jinja2_template(environment, "encoder", field.template)202print(203template.render(204name=field.name,205maxsize=field.maxsize,206)207)208elif isinstance(field, _XdrFixedLengthArray):209template = get_jinja2_template(environment, "encoder", field.template)210print(211template.render(212name=field.name,213type=field.spec.type_name,214size=field.size,215)216)217elif isinstance(field, _XdrVariableLengthArray):218template = get_jinja2_template(environment, "encoder", field.template)219print(220template.render(221name=field.name,222type=field.spec.type_name,223maxsize=field.maxsize,224)225)226elif isinstance(field, _XdrOptionalData):227template = get_jinja2_template(environment, "encoder", field.template)228print(229template.render(230name=field.name,231type=field.spec.type_name,232classifier=field.spec.c_classifier,233)234)235236237def emit_pointer_encoder(environment: Environment, node: _XdrPointer) -> None:238"""Emit one encoder function for an XDR pointer type"""239template = get_jinja2_template(environment, "encoder", "open")240print(template.render(name=node.name))241242for field in node.fields[0:-1]:243emit_pointer_member_encoder(environment, field)244245template = get_jinja2_template(environment, "encoder", "close")246print(template.render())247248249def emit_pointer_maxsize(environment: Environment, node: _XdrPointer) -> None:250"""Emit one maxsize macro for an XDR pointer type"""251macro_name = get_header_name().upper() + "_" + node.name + "_sz"252template = get_jinja2_template(environment, "maxsize", "pointer")253print(254template.render(255macro=macro_name,256width=" + ".join(node.symbolic_width()),257)258)259260261class XdrPointerGenerator(SourceGenerator):262"""Generate source code for XDR pointer"""263264def __init__(self, language: str, peer: str):265"""Initialize an instance of this class"""266self.environment = create_jinja2_environment(language, "pointer")267self.peer = peer268269def emit_declaration(self, node: _XdrPointer) -> None:270"""Emit one declaration pair for an XDR pointer type"""271emit_pointer_declaration(self.environment, node)272273def emit_definition(self, node: _XdrPointer) -> None:274"""Emit one declaration for an XDR pointer type"""275emit_pointer_definition(self.environment, node)276277def emit_decoder(self, node: _XdrPointer) -> None:278"""Emit one decoder function for an XDR pointer type"""279emit_pointer_decoder(self.environment, node)280281def emit_encoder(self, node: _XdrPointer) -> None:282"""Emit one encoder function for an XDR pointer type"""283emit_pointer_encoder(self.environment, node)284285def emit_maxsize(self, node: _XdrPointer) -> None:286"""Emit one maxsize macro for an XDR pointer type"""287emit_pointer_maxsize(self.environment, node)288289290