Skip to content

Commit b891914

Browse files
committed
fix: enhance return type handling in generate_checked_function to support pointer types
1 parent 3827519 commit b891914

1 file changed

Lines changed: 20 additions & 11 deletions

File tree

ci/generate_checked_functions.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@ def generate_checked_function(func):
1313
params = func.type.args.params if func.type.args else []
1414

1515
# Determine the return type
16+
return_pointer = False
1617
return_type = "void" # Default to void if no return type is specified
1718
if isinstance(func.type.type, c_ast.TypeDecl):
1819
return_type = " ".join(func.type.type.type.names)
20+
# TODO: figure out a better way to detect typedef from pointer
21+
if isinstance(func.type.type, c_ast.PtrDecl):
22+
return_pointer = True
1923

2024
# Start building the new function
2125
new_func = [f"static inline Result {new_func_name}("]
@@ -55,36 +59,41 @@ def generate_checked_function(func):
5559
# Call the original function
5660
if return_type == "void":
5761
new_func.append(f" {func_name}({', '.join(param_list)});")
58-
new_func.append(f" Result res = {{ .error_code = 0 }};")
5962
elif has_variadic:
6063
new_func.append(" va_start(args, " + param_list[-2] + ");")
6164
new_func.append(
6265
f" {return_type} original_result = {func_name}({', '.join(param_list[:-1])}, args);"
6366
)
6467
new_func.append(" va_end(args);")
65-
new_func.append(f" Result res;")
66-
new_func.append(f" if (original_result == 0) {{")
68+
else:
69+
new_func.append(
70+
f" {return_type} original_result = {func_name}({', '.join(param_list)});"
71+
)
72+
73+
# Handle returned values
74+
new_func.append(f" Result res;")
75+
if return_type == "void":
76+
new_func.append(f" res = {{ .error_code = 0 }};")
77+
elif return_type == "_Bool":
78+
new_func.append(f" res.error_code = 0 ? original_result : -2;")
79+
new_func.append(f" res.value._Bool_value = original_result;")
80+
# if return type is a pointer or typedef from pointer
81+
elif return_pointer:
82+
new_func.append(f" if (original_result != NULL) {{")
6783
new_func.append(f" res.error_code = 0;")
6884
new_func.append(f" res.value.{return_type}_value = original_result;")
6985
new_func.append(f" }} else {{")
7086
new_func.append(f" res.error_code = -2;")
7187
new_func.append(f" }}")
7288
else:
73-
new_func.append(
74-
f" {return_type} original_result = {func_name}({', '.join(param_list)});"
75-
)
76-
new_func.append(f" Result res;")
7789
new_func.append(f" if (original_result == 0) {{")
7890
new_func.append(f" res.error_code = 0;")
79-
80-
new_func.append(f" res.value.{return_type}_value = original_result;")
91+
new_func.append(f" res.value._Bool_value = original_result;")
8192
new_func.append(f" }} else {{")
8293
new_func.append(f" res.error_code = -2;")
8394
new_func.append(f" }}")
8495

8596
new_func.append(f" return res;")
86-
new_func.append("}")
87-
8897
return "\n".join(new_func)
8998

9099

0 commit comments

Comments
 (0)