22import 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