def Pvariable( id, # type: ID rhs, # type: SafeExpType type=None # type: MockObj ): # type: (...) -> MockObj """Declare a new pointer variable in the code generation. :param id: The ID used to declare the variable. :param rhs: The expression to place on the right hand side of the assignment. :param type: Manually define a type for the variable, only use this when it's not possible to do so during config validation phase (for example because of template arguments). :returns The new variable as a MockObj. """ rhs = safe_exp(rhs) obj = MockObj(id, '->') if type is not None: id.type = type decl = VariableDeclarationExpression(id.type, '*', id) CORE.add_global(decl) assignment = AssignmentExpression(None, None, id, rhs, obj) CORE.add(assignment) CORE.register_variable(id, obj) return obj
def Pvariable(id_: ID, rhs: SafeExpType, type_: "MockObj" = None) -> "MockObj": """Declare a new pointer variable in the code generation. :param id_: The ID used to declare the variable. :param rhs: The expression to place on the right hand side of the assignment. :param type_: Manually define a type for the variable, only use this when it's not possible to do so during config validation phase (for example because of template arguments). :returns The new variable as a MockObj. """ rhs = safe_exp(rhs) obj = MockObj(id_, "->") if type_ is not None: id_.type = type_ decl = VariableDeclarationExpression(id_.type, "*", id_) CORE.add_global(decl) assignment = AssignmentExpression(None, None, id_, rhs, obj) CORE.add(assignment) CORE.register_variable(id_, obj) return obj
def add_global(expression: Union[SafeExpType, Statement]): """Add an expression to the codegen global storage (above setup()).""" CORE.add_global(expression)