11from pycparser import c_parser , c_ast , parse_file
22import os
3- from pprint import pprint
43
54
65# Updated generate_checked_function to dynamically update Result definition for new return types
76
87
9- def collect_typedefs (ast ):
10- typedefs = {}
11- for node in ast .ext :
12- if isinstance (node , c_ast .Typedef ):
13- typedefs [node .name ] = node .type
14- return typedefs
15-
16- def resolve_typedef (typedefs , type_name ):
17- resolved_type = typedefs .get (type_name )
18-
19- # Return the original type name if not a typedef
20- if not resolved_type :
21- return type_name
22-
23- print (f"Resolving typedef for { type_name } : { resolved_type } \n " )
24-
25- if isinstance (resolved_type , c_ast .TypeDecl ):
26- # Base case: Return the type name
27- return " " .join (resolved_type .declname )
28- elif isinstance (resolved_type , c_ast .PtrDecl ):
29- # Handle pointer typedefs
30- resolved_type .show ()
31- base_type = " " .join (resolved_type .type .type .name )
32- return f"{ base_type } *"
33- elif isinstance (resolved_type , c_ast .ArrayDecl ):
34- # Handle array typedefs
35- base_type = resolve_typedef (resolved_type .type .declname , typedefs )
36- return f"{ base_type } *"
37-
38-
39- def generate_checked_function (func , typedefs ):
8+ def generate_checked_function (func ):
409 func_name = func .name # Access the name directly from Decl
4110 new_func_name = f"{ func_name } _checked"
4211
@@ -47,8 +16,6 @@ def generate_checked_function(func, typedefs):
4716 return_type = "void" # Default to void if no return type is specified
4817 if isinstance (func .type .type , c_ast .TypeDecl ):
4918 return_type = " " .join (func .type .type .type .names )
50- resolved_type = resolve_typedef (typedefs , return_type )
51- return_type = resolved_type
5219
5320 # Start building the new function
5421 new_func = [f"static inline Result { new_func_name } (" ]
@@ -88,41 +55,32 @@ def generate_checked_function(func, typedefs):
8855 # Call the original function
8956 if return_type == "void" :
9057 new_func .append (f" { func_name } ({ ', ' .join (param_list )} );" )
58+ new_func .append (f" Result res = {{ .error_code = 0 }};" )
9159 elif has_variadic :
9260 new_func .append (" va_start(args, " + param_list [- 2 ] + ");" )
9361 new_func .append (
9462 f" { return_type } original_result = { func_name } ({ ', ' .join (param_list [:- 1 ])} , args);"
9563 )
9664 new_func .append (" va_end(args);" )
65+ new_func .append (f" Result res;" )
66+ new_func .append (f" if (original_result == 0) {{" )
67+ new_func .append (f" res.error_code = 0;" )
68+ new_func .append (f" res.value.{ return_type } _value = original_result;" )
69+ new_func .append (f" }} else {{" )
70+ new_func .append (f" res.error_code = -2;" )
71+ new_func .append (f" }}" )
9772 else :
9873 new_func .append (
9974 f" { return_type } original_result = { func_name } ({ ', ' .join (param_list )} );"
10075 )
101-
102- # Handle result return from the original function
103- new_func .append (f" Result res;" )
104- # if it is bool type
105- if return_type == "_Bool" :
106- new_func .append (f" if (original_result == 1) {{" )
76+ new_func .append (f" Result res;" )
77+ new_func .append (f" if (original_result == 0) {{" )
10778 new_func .append (f" res.error_code = 0;" )
108- new_func .append (f" res.value._Bool_value = original_result;" )
79+
80+ new_func .append (f" res.value.{ return_type } _value = original_result;" )
10981 new_func .append (f" }} else {{" )
110- new_func .append (f" res.error_code = -1 ;" )
82+ new_func .append (f" res.error_code = -2 ;" )
11183 new_func .append (f" }}" )
112- # if it is void type
113- elif return_type == "void" :
114- new_func .append (f" res.error_code = 0;" )
115- else :
116- if isinstance (func .type .type , c_ast .PtrDecl ):
117- new_func .append (f" if (original_result != NULL) {{" )
118- new_func .append (f" res.error_code = 0;" )
119- new_func .append (f" res.value.{ return_type } _value = original_result;" )
120- new_func .append (f" }} else {{" )
121- new_func .append (f" res.error_code = -1;" )
122- new_func .append (f" }}" )
123- else :
124- new_func .append (f" res.error_code = 0;" )
125- new_func .append (f" res.value.{ return_type } _value = original_result;" )
12684
12785 new_func .append (f" return res;" )
12886 new_func .append ("}" )
@@ -172,10 +130,6 @@ def process_header():
172130 ],
173131 )
174132
175- # Collect typedefs
176- typedefs = collect_typedefs (ast )
177- # pprint(typedefs)
178-
179133 # Collect all function declarations
180134 functions = [
181135 node
@@ -188,8 +142,7 @@ def process_header():
188142 for func in functions :
189143 if isinstance (func .type .type , c_ast .TypeDecl ):
190144 return_type = " " .join (func .type .type .type .names )
191- resolved_type = resolve_typedef (typedefs , return_type )
192- return_types .add (resolved_type )
145+ return_types .add (return_type )
193146
194147 # Update the Result struct with all return types
195148 for return_type in return_types :
@@ -218,7 +171,7 @@ def process_header():
218171 f .write (RESULT_STRUCT + "\n " )
219172
220173 for func in functions :
221- new_func = generate_checked_function (func , typedefs )
174+ new_func = generate_checked_function (func )
222175 f .write (new_func + "\n \n " )
223176
224177 f .write ("#endif // WASM_EXPORT_CHECKED_H\n " )
0 commit comments