Skip to content

Commit 3827519

Browse files
committed
Revert "WIP. fix bugs about returning a pointer"
This reverts commit 4f9f6422cd9c32b71890d5ef668a8e3c15e15aa8.
1 parent 9be8c51 commit 3827519

1 file changed

Lines changed: 16 additions & 63 deletions

File tree

ci/generate_checked_functions.py

Lines changed: 16 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,11 @@
11
from pycparser import c_parser, c_ast, parse_file
22
import 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

Comments
 (0)