1
- #!/usr/bin/env python
1
+ #!/usr/bin/env python3
2
2
# Copyright 2022 Shenzhen ZhiLiu Technology Co., Ltd.
3
3
#
4
4
# Licensed under the Apache License, Version 2.0 (the "License");
18
18
import sys
19
19
from string import Template
20
20
21
+ MAX_WASM_API_ARG = 12
21
22
22
- max_wasm_api_arg = 12
23
23
header = """/*
24
24
* Copyright 2022 Shenzhen ZhiLiu Technology Co., Ltd.
25
25
*
74
74
#endif
75
75
"""
76
76
77
-
78
- def predefined_macro (vm ):
77
+ def generate_wasm_runtime_struct (vm ):
79
78
if vm == "wasmtime" :
80
- vm_def = """
79
+ return """
81
80
#define DEFINE_WASM_API(NAME, ARG_CHECK) \\
82
81
static wasm_trap_t* wasmtime_##NAME( \\
83
82
void *env, \\
@@ -105,7 +104,7 @@ def predefined_macro(vm):
105
104
106
105
"""
107
106
elif vm == "wasmedge" :
108
- vm_def = """
107
+ return """
109
108
#define DEFINE_WASM_API(NAME, ARG_CHECK) \\
110
109
static WasmEdge_Result wasmedge_##NAME( \\
111
110
void *Data, \\
@@ -130,7 +129,10 @@ def predefined_macro(vm):
130
129
131
130
"""
132
131
133
- for i in range (max_wasm_api_arg + 1 ):
132
+ def predefined_macro (vm ):
133
+ vm_def = generate_wasm_runtime_struct (vm )
134
+
135
+ for i in range (MAX_WASM_API_ARG + 1 ):
134
136
if i == 0 :
135
137
void_def = """
136
138
#define DEFINE_WASM_NAME_ARG_VOID \\
@@ -164,8 +166,29 @@ def predefined_macro(vm):
164
166
vm_def += " int32_t p%d = WasmEdge_ValueGetI32(In[%d]); \\ \n " % (j , j )
165
167
param_s = ", " .join ('p' + str (j ) for j in range (i ))
166
168
vm_def += " int32_t res = NAME(%s);\n " % (param_s )
167
- return vm_def
168
169
170
+ if vm == "wasmtime" :
171
+ vm_def += r'''
172
+ #define DEFINE_WASM_NAME_ARG_I32_I64 \
173
+ 2, { \
174
+ WASM_I32, WASM_I64, }
175
+ #define DEFINE_WASM_API_ARG_CHECK_I32_I64(NAME) \
176
+ int32_t p0 = args[0].of.i32; \
177
+ int64_t p1 = args[1].of.i64; \
178
+ int32_t res = NAME(p0, p1);
179
+ '''
180
+ elif vm == "wasmedge" :
181
+ vm_def += r'''
182
+ #define DEFINE_WASM_NAME_ARG_I32_I64 \
183
+ 2, { \
184
+ WasmEdge_ValType_I32, WasmEdge_ValType_I64, }
185
+ #define DEFINE_WASM_API_ARG_CHECK_I32_I64(NAME) \
186
+ int32_t p0 = WasmEdge_ValueGetI32(In[0]); \
187
+ int64_t p1 = WasmEdge_ValueGetI64(In[1]); \
188
+ int32_t res = NAME(p0, p1);
189
+ '''
190
+
191
+ return vm_def
169
192
170
193
def get_host_apis (src_dir ):
171
194
apis = []
@@ -180,24 +203,25 @@ def get_host_apis(src_dir):
180
203
name = m .group (1 )
181
204
elif line [0 ] == '{' and matching :
182
205
matching = False
183
- n_param = len (api .split (',' ))
206
+ api_list = api .split (',' )
207
+ n_param = len (api_list )
184
208
if "(void)" in api :
185
209
n_param -= 1
186
210
apis .append ({
187
211
"name" : name ,
188
- "n_param" : n_param
212
+ "n_param" : n_param ,
213
+ "raw_func" : api
189
214
})
190
215
api = ""
191
216
if matching :
192
217
api += line .rstrip ()
193
218
return apis
194
219
195
-
196
220
if __name__ == '__main__' :
197
221
host_api_def = ""
198
222
api_def = ""
199
223
name_def = ""
200
- for i in range (max_wasm_api_arg + 1 ):
224
+ for i in range (MAX_WASM_API_ARG + 1 ):
201
225
if i == 0 :
202
226
host_api_def += "#define DEFINE_WASM_API_ARG_VOID void\n "
203
227
else :
@@ -212,6 +236,9 @@ def get_host_apis(src_dir):
212
236
param_s += ", "
213
237
param_s += "int32_t"
214
238
host_api_def += "#define DEFINE_WASM_API_ARG_%s%s\n " % (param_suffix , param_s )
239
+
240
+ host_api_def += """#define DEFINE_WASM_API_ARG_I32_I64 \\ \n int32_t, int64_t"""
241
+
215
242
host_api_def += "\n \n "
216
243
217
244
src_dir = sys .argv [1 ]
@@ -222,6 +249,8 @@ def get_host_apis(src_dir):
222
249
n_param = api ["n_param" ]
223
250
if n_param == 0 :
224
251
param_suffix = "VOID"
252
+ elif n_param == 2 and "int64_t" in api ["raw_func" ]:
253
+ param_suffix = "I32_I64"
225
254
else :
226
255
param_suffix = "I32_%d" % n_param
227
256
@@ -249,7 +278,7 @@ def get_host_apis(src_dir):
249
278
vm_header = "#include <wasmtime.h>" ,
250
279
vm_api_header_name = "NGX_HTTP_WASM_API_WASMTIME_H" ,
251
280
wasm_api_def = wasmtime_def ,
252
- max_wasm_api_arg = max_wasm_api_arg ,
281
+ max_wasm_api_arg = MAX_WASM_API_ARG ,
253
282
))
254
283
255
284
wasmedge_def = predefined_macro ("wasmedge" )
@@ -261,5 +290,5 @@ def get_host_apis(src_dir):
261
290
vm_header = "#include <wasmedge/wasmedge.h>" ,
262
291
vm_api_header_name = "NGX_HTTP_WASM_API_WASMEDGE_H" ,
263
292
wasm_api_def = wasmedge_def ,
264
- max_wasm_api_arg = max_wasm_api_arg ,
293
+ max_wasm_api_arg = MAX_WASM_API_ARG ,
265
294
))
0 commit comments