in codegen_sources/model/src/evaluation/comp_acc_computation.py [0:0]
def convert_filled_arguments(script_model, f, lang, lang_processor, f_name=None):
assert lang in {"java", "cpp"}
header = []
arguments_gold = lang_processor.extract_arguments(script_model)
return_type_gold = get_return_type(script_model)
arguments_filled = lang_processor.extract_arguments(f)
return_type_filled = get_return_type(f)
if arguments_gold[0] == arguments_filled[0]:
return None
if f_name is None:
f_name = lang_processor.get_function_name(f)
argument_types_gold = [t.strip() for t in arguments_gold[0]]
arguments_strings = [
make_arg_string(arg_type, f"param{i}")
for i, arg_type in enumerate(argument_types_gold)
]
new_function_lines = [
f'static {return_type_gold} f_filled({", ".join(arguments_strings)})',
"{",
]
new_params_strings = []
for param_index, (param_type_gold, param_type_filled) in enumerate(
zip(argument_types_gold, arguments_filled[0])
):
param_type_filled = param_type_filled.strip()
param_type_gold = param_type_gold.strip()
if param_type_filled == param_type_gold:
new_params_strings.append(f"param{param_index}")
elif lang == "cpp":
if "vector" in param_type_filled:
if "int" not in argument_types_gold:
return None
ints_indices = [
i
for i, t in enumerate(argument_types_gold)
if t == "int" and i > param_index
]
if any([i > param_index for i in ints_indices]):
array_length_arg = min([i for i in ints_indices if i > param_index])
else:
array_length_arg = min(ints_indices)
new_function_lines.append(
f'{param_type_filled.replace("&", "")} vect_param{param_index}(param{param_index}, param{param_index} + param{array_length_arg});'
)
new_params_strings.append(f"vect_param{param_index}")
elif param_type_filled == "string" and "char" in param_type_gold:
new_function_lines.append(
f'{param_type_filled.replace("&", "")} string_param{param_index}(param{param_index});'
)
new_params_strings.append(f"string_param{param_index}")
elif param_type_gold == "string" and "char" in param_type_filled:
new_function_lines.append(
f"char char_arr_param{param_index}[param{param_index}.length() + 1];"
)
new_function_lines.append(
f"strcopy(char_arr_param{param_index}, param{param_index}.c_str());"
)
new_params_strings.append(f"char_arr_param{param_index}")
else:
new_params_strings.append(f"({param_type_filled}) param{param_index}")
elif lang == "java":
if (
param_type_filled == "String" and "char" in param_type_gold
) or param_type_filled == transform_to_java_object_type(param_type_gold):
new_params_strings.append(
f"{param_type_filled}.valueOf(param{param_index})"
)
header.append("#include <cstring>")
elif param_type_gold == "String":
new_params_strings.append(f"param{param_index}.toCharArray()")
else:
new_params_strings.append(f"({param_type_filled}) param{param_index}")
else:
return None
inner_function_name = "f_filled_inner"
outer_f_return_string = f'{inner_function_name}({",".join(new_params_strings)})'
if return_type_filled != return_type_gold:
outer_f_return_string = f"({return_type_gold}) {outer_f_return_string}"
new_function_lines += [f"return {outer_f_return_string};", "}"]
f = lang_processor.detokenize_code(f.replace(f_name, inner_function_name))
return "\n".join(list(set(header))) + script_model.replace(
TOFILL[lang], "\n".join([f, "\n"] + new_function_lines)
)