From bf05cfc77981deebed6ef168a87e428b1cc22b18 Mon Sep 17 00:00:00 2001 From: kevstone Date: Fri, 9 Feb 2024 08:13:33 +0000 Subject: [PATCH] Moved creation of default constructor to ccode object to ensure correct conversion --- .../default/default_ast_code_converter.py | 5 +++++ .../grib_accessor_ast_code_converter.py | 18 ++++++++++++++++++ .../grib_accessor_ccode_converter.py | 19 ------------------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/clang_convert/default/default_ast_code_converter.py b/src/clang_convert/default/default_ast_code_converter.py index c1674cad0..d093e1f7c 100755 --- a/src/clang_convert/default/default_ast_code_converter.py +++ b/src/clang_convert/default/default_ast_code_converter.py @@ -22,6 +22,7 @@ class DefaultAstCodeConverter: self.convert_global_function_nodes() self.convert_function_nodes() self.convert_macro_details() + self.validate_ccode() return self._ccode @@ -41,3 +42,7 @@ class DefaultAstCodeConverter: def convert_macro_details(self): # For now, just set the AST Node... self._ccode.macro_details = self._ast_code.macro_details + + # Override to provide any validation + def validate_ccode(self): + pass \ No newline at end of file diff --git a/src/clang_convert/grib_accessor/grib_accessor_ast_code_converter.py b/src/clang_convert/grib_accessor/grib_accessor_ast_code_converter.py index 634e80dc7..586ba149b 100755 --- a/src/clang_convert/grib_accessor/grib_accessor_ast_code_converter.py +++ b/src/clang_convert/grib_accessor/grib_accessor_ast_code_converter.py @@ -6,6 +6,8 @@ import clang.cindex import code_object.data_member as data_member import utils.debug as debug import ast_object.ast_utils as ast_utils +from grib_accessor.supporting.member_functions import grib_accessor_member_funcsig_mapping +import code_object.compound_statement as compound_statement class GribAccessorAstCodeConverter(default_ast_code_converter.DefaultAstCodeConverter): def __init__(self, ast_code) -> None: @@ -71,3 +73,19 @@ class GribAccessorAstCodeConverter(default_ast_code_converter.DefaultAstCodeConv self._ccode._super_class_name = super_entry_child.spelling name_entry = next(init_list_iter) self._ccode._accessor_class_short_name = name_entry.spelling.replace("\"", "") + + def validate_ccode(self): + if not self._ccode.constructor: + # We need to create a default constructor to ensure init code is correctly created in C++ classes! + cconstructor_funcsig = None + for mapping in grib_accessor_member_funcsig_mapping: + if mapping.cfuncsig.name == "init": + cconstructor_funcsig = mapping.cfuncsig + break + assert cconstructor_funcsig + cconstructor_body = compound_statement.CompoundStatement() + self._ccode.add_function(cconstructor_funcsig, cconstructor_body) + + debug.line("validate_ccode", f"No constructor found, adding a default version") + + super().validate_ccode() diff --git a/src/clang_convert/grib_accessor/grib_accessor_ccode_converter.py b/src/clang_convert/grib_accessor/grib_accessor_ccode_converter.py index 4380d3a4c..99ed40499 100755 --- a/src/clang_convert/grib_accessor/grib_accessor_ccode_converter.py +++ b/src/clang_convert/grib_accessor/grib_accessor_ccode_converter.py @@ -7,7 +7,6 @@ import default.default_ccode_converter as default_ccode_converter import utils.standard_transforms as standard_transforms from grib_accessor.supporting.virtual_member_functions import grib_accessor_virtual_member_funcsig_mapping from grib_accessor.supporting.member_functions import grib_accessor_member_funcsig_mapping -import grib_accessor.supporting.member_functions as member_functions import grib_accessor.supporting.virtual_member_functions as virtual_member_functions import grib_accessor.supporting.includes as includes import grib_accessor.supporting.type_mappings as type_mappings @@ -21,9 +20,6 @@ import grib_accessor.supporting.arg_mappings as arg_mappings import grib_accessor.supporting.data_member_mappings as data_member_mappings import grib_accessor.grib_accessor_conversion_pack.grib_accessor_type_info as grib_accessor_type_info import grib_accessor.grib_accessor_conversion_pack.grib_accessor_container_utils as grib_accessor_container_utils -import code_object_converter.conversion_pack.arg_utils as arg_utils -import code_object.compound_statement as compound_statement -import code_object.constructor_function as constructor_function prefix = "grib_accessor_class_" rename = { @@ -166,18 +162,3 @@ class GribAccessorCCodeConverter(default_ccode_converter.DefaultCCodeConverter): if mismatch_found: break - - def validate_code_elements(self): - if not self._code_elements.constructor: - # We need to create a default constructor to ensure the InitData is passed up the construction hierarchy correctly! - cppconstructor_funcsig = self._conversion_pack.conversion_data.cppfuncsig_for_cfuncname("init") - assert cppconstructor_funcsig - cppconstructor_body = compound_statement.CompoundStatement() - cppconstructor = constructor_function.ConstructorFunction(cppconstructor_funcsig, - cppconstructor_body, - self._conversion_pack.conversion_data.info.class_name, - self._conversion_pack.conversion_data.info.super_class_name) - debug.line("validate_cppcode", f"No constructor found, adding a default=[{debug.as_debug_string(cppconstructor)}]") - self._code_elements.add_constructor(cppconstructor) - - super().validate_code_elements()