Fixed some issues converting the updates StructMemberAccess data

This commit is contained in:
kevstone 2024-02-19 19:32:57 +00:00
parent 81db7afeec
commit 0c9770c061
5 changed files with 45 additions and 29 deletions

View File

@ -932,6 +932,9 @@ class AstParser:
name = self.parse_ast_node(children[0]) name = self.parse_ast_node(children[0])
index = self.parse_ast_node(children[1]) index = self.parse_ast_node(children[1])
if isinstance(name, struct_member_access.StructMemberAccess):
debug.line("parse_ARRAY_SUBSCRIPT_EXPR", f"[FOR INFO] Array name is StructMemberAccess [{debug.as_debug_string(name)}]")
arr_access = array_access.ArrayAccess(name, index) arr_access = array_access.ArrayAccess(name, index)
return arr_access return arr_access

View File

@ -5,6 +5,7 @@ import code_object_converter.code_interface_converter as code_interface_converte
import code_object_converter.conversion_funcs as conversion_funcs import code_object_converter.conversion_funcs as conversion_funcs
import code_object.struct_member_access as struct_member_access import code_object.struct_member_access as struct_member_access
from code_object.code_interface import NONE_VALUE from code_object.code_interface import NONE_VALUE
import code_object_converter.conversion_pack.arg_utils as arg_utils
class ArrayAccessConverter(code_interface_converter.CodeInterfaceConverter): class ArrayAccessConverter(code_interface_converter.CodeInterfaceConverter):
def __init__(self, ccode_object) -> None: def __init__(self, ccode_object) -> None:
@ -22,7 +23,10 @@ class ArrayAccessConverter(code_interface_converter.CodeInterfaceConverter):
# If the name has been converted to a struct_member_access, representing a container size, e.g. foo.size(), # If the name has been converted to a struct_member_access, representing a container size, e.g. foo.size(),
# then we need to deal with the array access part! # then we need to deal with the array access part!
if isinstance(cpp_name, struct_member_access.StructMemberAccess): if isinstance(cpp_name, struct_member_access.StructMemberAccess):
if cpp_name.member and cpp_name.member.name == "size()":
if cpp_name.member:
cpp_member_name = arg_utils.extract_name(cpp_name.member)
if cpp_member_name and cpp_member_name == "size()":
# If we're accessing index 0, then we can just remove the [0] part, # If we're accessing index 0, then we can just remove the [0] part,
# otherwise something unexpected has happened! # otherwise something unexpected has happened!
if cpp_index.as_string() == "0": if cpp_index.as_string() == "0":
@ -32,4 +36,5 @@ class ArrayAccessConverter(code_interface_converter.CodeInterfaceConverter):
assert False, f"Unexpected array access=[{debug.as_debug_string(self._ccode_object)}]" assert False, f"Unexpected array access=[{debug.as_debug_string(self._ccode_object)}]"
cpparray_access = array_access.ArrayAccess(cpp_name, cpp_index) cpparray_access = array_access.ArrayAccess(cpp_name, cpp_index)
return conversion_pack.conversion_validation.validate_array_access(self._ccode_object, cpparray_access) return conversion_pack.conversion_validation.validate_array_access(self._ccode_object, cpparray_access)

View File

@ -150,7 +150,8 @@ class DefaultConversionValidation(conversion_validation.ConversionValidation):
if isinstance(cppleft, struct_member_access.StructMemberAccess): if isinstance(cppleft, struct_member_access.StructMemberAccess):
cpparg = self._conversion_data.cpparg_for_cppname(cppleft.name) cpparg = self._conversion_data.cpparg_for_cppname(cppleft.name)
if cppleft.member: if cppleft.member:
if cppleft.member.name == "size()": cppleft_member_name = arg_utils.extract_name(cppleft.member)
if cppleft_member_name and cppleft_member_name == "size()":
if cppleft.as_string() == cppright.as_string(): if cppleft.as_string() == cppright.as_string():
# We've converted something like *len = strlen(v); where len and v are both mapped to (e.g.) stringValue, # We've converted something like *len = strlen(v); where len and v are both mapped to (e.g.) stringValue,
# resulting in the redundant call stringValue.size() = stringValue.size()! # resulting in the redundant call stringValue.size() = stringValue.size()!
@ -158,9 +159,9 @@ class DefaultConversionValidation(conversion_validation.ConversionValidation):
return as_commented_out_code(cppbinary_operation, "Removing: C++ code is redundant") return as_commented_out_code(cppbinary_operation, "Removing: C++ code is redundant")
elif cppright.as_string() == "0": elif cppright.as_string() == "0":
cppleft.member.name = "clear()" cppleft.member.name = literal.Literal("clear()")
else: else:
cppleft.member.name = f"resize({cppright.as_string()})" cppleft.member.name = literal.Literal(f"resize({cppright.as_string()})")
# Double-check it's not const! # Double-check it's not const!
debug.line("validate_binary_operation", f"Performing const check cppleft.name=[{debug.as_debug_string(cppleft.name)}] cpparg=[{debug.as_debug_string(cpparg)}]") debug.line("validate_binary_operation", f"Performing const check cppleft.name=[{debug.as_debug_string(cppleft.name)}] cpparg=[{debug.as_debug_string(cpparg)}]")
@ -174,12 +175,12 @@ class DefaultConversionValidation(conversion_validation.ConversionValidation):
cppright_value = cppright.as_string() cppright_value = cppright.as_string()
if is_number(cppright_value) or not self.is_cppfunction_returning_container(cppright): if is_number(cppright_value) or not self.is_cppfunction_returning_container(cppright):
cppleft.index = "[0]" cppleft = array_access.ArrayAccess(cppleft.name, literal.Literal("0"))
debug.line("validate_binary_operation", f"Assigning number to container, so updating it to access first element: cppleft=[{debug.as_debug_string(cppleft)}] cppright_value=[{cppright_value}]") debug.line("validate_binary_operation", f"Assigning number to container, so updating it to access first element: cppleft=[{debug.as_debug_string(cppleft)}] cppright_value=[{cppright_value}]")
return binary_operation.BinaryOperation(cppleft, cppbinary_op, cppright) return binary_operation.BinaryOperation(cppleft, cppbinary_op, cppright)
# Check if we're assigning to a data member and need to ensure the function is non-const # Check if we're assigning to a data member and need to ensure the function is non-const
data_member_name = cppleft.name data_member_name = arg_utils.extract_name(cppleft.name)
debug.line("validate_binary_operation", f"CHECK is_cppdata_member({data_member_name})") debug.line("validate_binary_operation", f"CHECK is_cppdata_member({data_member_name})")
if self._conversion_data.is_cppdata_member(data_member_name): if self._conversion_data.is_cppdata_member(data_member_name):

View File

@ -2,17 +2,19 @@
import utils.debug as debug import utils.debug as debug
from code_object.struct_member_access import StructMemberAccess from code_object.struct_member_access import StructMemberAccess
import default.default_conversion_pack.default_container_utils as default_container_utils import default.default_conversion_pack.default_container_utils as default_container_utils
import code_object_converter.conversion_pack.arg_utils as arg_utils
import code_object.literal as literal
class GribAccessorContainerUtils(default_container_utils.DefaultContainerUtils): class GribAccessorContainerUtils(default_container_utils.DefaultContainerUtils):
def create_cpp_container_length_arg(self, name): def create_cpp_container_length_arg(self, name):
cpp_member = super().create_cpp_container_length_arg(name) cpp_member = super().create_cpp_container_length_arg(name)
if cpp_member.name == "initData": cpp_name = arg_utils.extract_name(cpp_member)
# Need to change from initData.size() to initData.args.size() if cpp_name and cpp_name == "initData":
args_member = StructMemberAccess(".", "args", None) # Need to change from initData.size() to initData.length
size_member = StructMemberAccess(".", "size()", None) args_member = StructMemberAccess(".", literal.Literal("length"), None)
args_member.member = size_member
cpp_member.member = args_member cpp_member.member = args_member
debug.line("create_cpp_container_length_arg", f"Updated initData length access: cpp_member=[{debug.as_debug_string(cpp_member)}]") debug.line("create_cpp_container_length_arg", f"Updated initData length access: cpp_member=[{debug.as_debug_string(cpp_member)}]")

View File

@ -16,6 +16,7 @@ import code_object_converter.conversion_pack.arg_utils as arg_utils
import code_object.cast_expression as cast_expression import code_object.cast_expression as cast_expression
import code_object.macro_instantation as macro_instantation import code_object.macro_instantation as macro_instantation
import code_object.struct_member_access as struct_member_access import code_object.struct_member_access as struct_member_access
import code_object.array_access as array_access
from utils.string_funcs import strip_semicolon from utils.string_funcs import strip_semicolon
from grib_accessor.grib_accessor_conversion_pack.grib_accessor_special_function_call_conversion import special_function_name_mapping from grib_accessor.grib_accessor_conversion_pack.grib_accessor_special_function_call_conversion import special_function_name_mapping
@ -215,7 +216,7 @@ class GribAccessorConversionValidation(default_conversion_validation.DefaultConv
if cpparg: if cpparg:
if cpparg.decl_spec.type != cppfunc_return_type: if cpparg.decl_spec.type != cppfunc_return_type:
updated_cpp_expression = literal.Literal(f"static_cast<GribStatus>({cpparg.name})") updated_cpp_expression = literal.Literal(f"static_cast<{cppfunc_return_type}>({cpparg.name})")
elif cppfunc_return_type == "GribStatus": elif cppfunc_return_type == "GribStatus":
cpp_expression = cppreturn_statement.expression.as_string() cpp_expression = cppreturn_statement.expression.as_string()
if cpp_expression == "0": if cpp_expression == "0":
@ -229,25 +230,29 @@ class GribAccessorConversionValidation(default_conversion_validation.DefaultConv
return super().validate_return_statement(creturn_statement, cppreturn_statement) return super().validate_return_statement(creturn_statement, cppreturn_statement)
def validate_struct_member_access(self, cstruct_member_access, cppstruct_member_access): def validate_struct_member_access(self, cstruct_member_access, cppstruct_member_access):
if cppstruct_member_access.name == "buffer_" and cppstruct_member_access.member.name == "data":
cppstruct_member_access_name = arg_utils.extract_name(cppstruct_member_access.name)
if cppstruct_member_access_name == "buffer_":
if cstruct_member_access.as_string().endswith("->data"):
# Just need to change ->data to .data() # Just need to change ->data to .data()
cppstruct_member_access.member.access = "." cppstruct_member_access_member = struct_member_access.StructMemberAccess(".", literal.Literal("data()"))
cppstruct_member_access.member.name += "()" return struct_member_access.StructMemberAccess(cppstruct_member_access.access,
return cppstruct_member_access cppstruct_member_access.variable,
cppstruct_member_access_member)
# Handle AccessorPtr types # Handle AccessorPtr types
cpparg = self._conversion_data.cpparg_for_cppname(cppstruct_member_access.name) cpparg = self._conversion_data.cpparg_for_cppname(cppstruct_member_access.name)
if cpparg and cpparg.decl_spec.type == "AccessorPtr": if cpparg and cpparg.decl_spec.type == "AccessorPtr":
data_member = cppstruct_member_access.member data_member = cppstruct_member_access.member
if data_member: if data_member:
if data_member.name == "name": data_member_name = arg_utils.extract_name(data_member.name)
data_member.name += "().get().c_str()" # It's read-only so this is ok! if data_member_name == "name":
if data_member.name == "parent": data_member.name = literal.Literal(f"{data_member_name}().get().c_str()") # It's read-only so this is ok!
if data_member_name == "parent":
# For now we'll strip off the parent bit as that is accessing the grib_section, which we'll probably get # For now we'll strip off the parent bit as that is accessing the grib_section, which we'll probably get
# another way! # another way!
updated_cppstruct_member_access = struct_member_access.StructMemberAccess(cppstruct_member_access.access, updated_cppstruct_member_access = struct_member_access.StructMemberAccess(cppstruct_member_access.access,
cppstruct_member_access.name, cppstruct_member_access.name)
cppstruct_member_access.index)
debug.line("validate_struct_member_access", f"Updating AccessorPtr grib_section access: [{debug.as_debug_string(cppstruct_member_access)}]->[{updated_cppstruct_member_access}]") debug.line("validate_struct_member_access", f"Updating AccessorPtr grib_section access: [{debug.as_debug_string(cppstruct_member_access)}]->[{updated_cppstruct_member_access}]")
return updated_cppstruct_member_access return updated_cppstruct_member_access