Skip to content

Commit 33c31ef

Browse files
committed
fix: update generate_checked_function to resolve typedefs and enhance Result handling for new return types
1 parent b891914 commit 33c31ef

1 file changed

Lines changed: 81 additions & 7 deletions

File tree

ci/generate_checked_functions.py

Lines changed: 81 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,78 @@
22
import os
33

44

5-
# Updated generate_checked_function to dynamically update Result definition for new return types
5+
def collect_typedefs(ast):
6+
"""Collect all typedefs in the AST."""
7+
typedefs = {}
8+
for node in ast.ext:
9+
if not isinstance(node, c_ast.Typedef):
10+
continue
11+
12+
typedef_name = node.name
13+
typedef_type = node.type
14+
typedefs[typedef_name] = typedef_type
15+
return typedefs
16+
17+
18+
def resolve_typedef(typedefs, type_name):
19+
"""Resolve a typedef to its underlying type."""
20+
21+
def resolve_base_type(ptr_decl):
22+
# handle cases like: typedef int******* ptr;
23+
cur_type = ptr_decl
24+
pointer_type_name = ""
25+
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
41+
42+
resolved_type = typedefs.get(type_name)
43+
44+
if resolved_type is None:
45+
return type_name
46+
47+
if isinstance(resolved_type, c_ast.TypeDecl):
48+
if isinstance(resolved_type.type, c_ast.Enum):
49+
print(f"Resolved enum typedef {type_name}")
50+
return type_name
651

52+
if isinstance(resolved_type.type, c_ast.Struct):
53+
print(f"Resolved struct typedef {type_name}")
54+
return type_name
755

8-
def generate_checked_function(func):
56+
if isinstance(resolved_type.type, c_ast.Union):
57+
print(f"Resolved union typedef {type_name}")
58+
return type_name
59+
60+
if isinstance(resolved_type.type, c_ast.IdentifierType):
61+
base_type_name = " ".join(resolved_type.type.names)
62+
print(f"Resolved base typedef {type_name} to {base_type_name}")
63+
return type_name
64+
65+
resolved_type.show()
66+
raise Exception(f"Unhandled TypeDecl typedef {type_name}")
67+
elif isinstance(resolved_type, c_ast.PtrDecl):
68+
pointer_type_name = resolve_base_type(resolved_type)
69+
print(f"Resolved pointer typedef {type_name} to {pointer_type_name}")
70+
return pointer_type_name
71+
else:
72+
resolved_type.show()
73+
raise Exception(f"Unhandled typedef {type_name}")
74+
75+
76+
def generate_checked_function(func, typedefs):
977
func_name = func.name # Access the name directly from Decl
1078
new_func_name = f"{func_name}_checked"
1179

@@ -17,8 +85,9 @@ def generate_checked_function(func):
1785
return_type = "void" # Default to void if no return type is specified
1886
if isinstance(func.type.type, c_ast.TypeDecl):
1987
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):
88+
89+
resolved_type = resolve_typedef(typedefs, return_type)
90+
if resolved_type.endswith("*"):
2291
return_pointer = True
2392

2493
# Start building the new function
@@ -88,12 +157,13 @@ def generate_checked_function(func):
88157
else:
89158
new_func.append(f" if (original_result == 0) {{")
90159
new_func.append(f" res.error_code = 0;")
91-
new_func.append(f" res.value._Bool_value = original_result;")
160+
new_func.append(f" res.value.{return_type}_value = original_result;")
92161
new_func.append(f" }} else {{")
93162
new_func.append(f" res.error_code = -2;")
94163
new_func.append(f" }}")
95164

96165
new_func.append(f" return res;")
166+
new_func.append(f"}}")
97167
return "\n".join(new_func)
98168

99169

@@ -139,6 +209,9 @@ def process_header():
139209
],
140210
)
141211

212+
# Collect all typedefs
213+
typedefs = collect_typedefs(ast)
214+
142215
# Collect all function declarations
143216
functions = [
144217
node
@@ -151,7 +224,8 @@ def process_header():
151224
for func in functions:
152225
if isinstance(func.type.type, c_ast.TypeDecl):
153226
return_type = " ".join(func.type.type.type.names)
154-
return_types.add(return_type)
227+
resolved_type = resolve_typedef(typedefs, return_type)
228+
return_types.add(resolved_type)
155229

156230
# Update the Result struct with all return types
157231
for return_type in return_types:
@@ -180,7 +254,7 @@ def process_header():
180254
f.write(RESULT_STRUCT + "\n")
181255

182256
for func in functions:
183-
new_func = generate_checked_function(func)
257+
new_func = generate_checked_function(func, typedefs)
184258
f.write(new_func + "\n\n")
185259

186260
f.write("#endif // WASM_EXPORT_CHECKED_H\n")

0 commit comments

Comments
 (0)