Skip to content

Commit 080b1fe

Browse files
committed
fix: add duplicate typedef check and improve pointer handling in generate_checked_function
1 parent 33c31ef commit 080b1fe

1 file changed

Lines changed: 28 additions & 23 deletions

File tree

ci/generate_checked_functions.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@ def collect_typedefs(ast):
99
if not isinstance(node, c_ast.Typedef):
1010
continue
1111

12+
if node.name in typedefs:
13+
raise Exception(f"Duplicate typedef found: {node.name}")
14+
1215
typedef_name = node.name
1316
typedef_type = node.type
1417
typedefs[typedef_name] = typedef_type
18+
1519
return typedefs
1620

1721

@@ -23,31 +27,30 @@ def resolve_base_type(ptr_decl):
2327
cur_type = ptr_decl
2428
pointer_type_name = ""
2529

26-
while isinstance(cur_type, c_ast.PtrDecl) or isinstance(
27-
cur_type, c_ast.TypeDecl
28-
):
29-
if isinstance(cur_type, c_ast.PtrDecl):
30-
cur_type = cur_type.type
31-
pointer_type_name += "*"
32-
elif isinstance(cur_type, c_ast.TypeDecl):
33-
if isinstance(cur_type.type, c_ast.IdentifierType):
34-
base_type_name = " ".join(cur_type.type.names)
35-
pointer_type_name = base_type_name + pointer_type_name
36-
return pointer_type_name
37-
else:
38-
pointer_type_name = "".join(cur_type.type.name) + pointer_type_name
39-
return pointer_type_name
40-
return None
30+
while isinstance(cur_type, c_ast.PtrDecl):
31+
cur_type = cur_type.type
32+
pointer_type_name += "*"
33+
34+
assert isinstance(cur_type, c_ast.TypeDecl)
35+
if isinstance(cur_type.type, c_ast.IdentifierType):
36+
base_type_name = " ".join(cur_type.type.names)
37+
pointer_type_name = base_type_name + pointer_type_name
38+
else:
39+
pointer_type_name = "".join(cur_type.type.name) + pointer_type_name
40+
41+
return pointer_type_name
4142

4243
resolved_type = typedefs.get(type_name)
4344

4445
if resolved_type is None:
4546
return type_name
4647

48+
print(f"\n\nResolving typedef {type_name}:")
49+
4750
if isinstance(resolved_type, c_ast.TypeDecl):
4851
if isinstance(resolved_type.type, c_ast.Enum):
4952
print(f"Resolved enum typedef {type_name}")
50-
return type_name
53+
return type_name
5154

5255
if isinstance(resolved_type.type, c_ast.Struct):
5356
print(f"Resolved struct typedef {type_name}")
@@ -60,9 +63,8 @@ def resolve_base_type(ptr_decl):
6063
if isinstance(resolved_type.type, c_ast.IdentifierType):
6164
base_type_name = " ".join(resolved_type.type.names)
6265
print(f"Resolved base typedef {type_name} to {base_type_name}")
63-
return type_name
66+
return type_name
6467

65-
resolved_type.show()
6668
raise Exception(f"Unhandled TypeDecl typedef {type_name}")
6769
elif isinstance(resolved_type, c_ast.PtrDecl):
6870
pointer_type_name = resolve_base_type(resolved_type)
@@ -113,19 +115,22 @@ def generate_checked_function(func, typedefs):
113115
new_func.append(") {")
114116

115117
# Add null checks for pointer parameters
118+
new_func.append(f" Result res;")
116119
has_variadic = False
117120
for param in params:
118121
if isinstance(param, c_ast.EllipsisParam):
119122
# Restructure to use va_list
120123
new_func.append(" va_list args;")
121124
has_variadic = True
122125
elif isinstance(param.type, c_ast.PtrDecl):
126+
new_func.append(f" // Check for null pointer parameter: {param.name}")
123127
new_func.append(f" if ({param.name} == NULL) {{")
124-
new_func.append(f" Result res = {{ .error_code = -1 }};")
128+
new_func.append(f" res.error_code = -1;")
125129
new_func.append(f" return res;")
126130
new_func.append(f" }}")
127131

128132
# Call the original function
133+
new_func.append(f" // Execute the original function")
129134
if return_type == "void":
130135
new_func.append(f" {func_name}({', '.join(param_list)});")
131136
elif has_variadic:
@@ -140,9 +145,9 @@ def generate_checked_function(func, typedefs):
140145
)
141146

142147
# Handle returned values
143-
new_func.append(f" Result res;")
148+
new_func.append(f" // Assign return value and error code")
144149
if return_type == "void":
145-
new_func.append(f" res = {{ .error_code = 0 }};")
150+
new_func.append(f" res.error_code = 0;")
146151
elif return_type == "_Bool":
147152
new_func.append(f" res.error_code = 0 ? original_result : -2;")
148153
new_func.append(f" res.value._Bool_value = original_result;")
@@ -224,8 +229,8 @@ def process_header():
224229
for func in functions:
225230
if isinstance(func.type.type, c_ast.TypeDecl):
226231
return_type = " ".join(func.type.type.type.names)
227-
resolved_type = resolve_typedef(typedefs, return_type)
228-
return_types.add(resolved_type)
232+
# resolved_type = resolve_typedef(typedefs, return_type)
233+
return_types.add(return_type)
229234

230235
# Update the Result struct with all return types
231236
for return_type in return_types:

0 commit comments

Comments
 (0)