1- #!/usr/bin/env python
1+ #!/usr/bin/env python3
22# Copyright 2022 Shenzhen ZhiLiu Technology Co., Ltd.
33#
44# Licensed under the Apache License, Version 2.0 (the "License");
1818import sys
1919from string import Template
2020
21+ MAX_WASM_API_ARG = 12
2122
22- max_wasm_api_arg = 12
2323header = """/*
2424 * Copyright 2022 Shenzhen ZhiLiu Technology Co., Ltd.
2525 *
7474#endif
7575"""
7676
77-
78- def predefined_macro (vm ):
77+ def generate_wasm_runtime_struct (vm ):
7978 if vm == "wasmtime" :
80- vm_def = """
79+ return """
8180#define DEFINE_WASM_API(NAME, ARG_CHECK) \\
8281 static wasm_trap_t* wasmtime_##NAME( \\
8382 void *env, \\
@@ -105,7 +104,7 @@ def predefined_macro(vm):
105104
106105"""
107106 elif vm == "wasmedge" :
108- vm_def = """
107+ return """
109108#define DEFINE_WASM_API(NAME, ARG_CHECK) \\
110109 static WasmEdge_Result wasmedge_##NAME( \\
111110 void *Data, \\
@@ -130,7 +129,10 @@ def predefined_macro(vm):
130129
131130"""
132131
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 ):
134136 if i == 0 :
135137 void_def = """
136138#define DEFINE_WASM_NAME_ARG_VOID \\
@@ -164,8 +166,29 @@ def predefined_macro(vm):
164166 vm_def += " int32_t p%d = WasmEdge_ValueGetI32(In[%d]); \\ \n " % (j , j )
165167 param_s = ", " .join ('p' + str (j ) for j in range (i ))
166168 vm_def += " int32_t res = NAME(%s);\n " % (param_s )
167- return vm_def
168169
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
169192
170193def get_host_apis (src_dir ):
171194 apis = []
@@ -180,24 +203,25 @@ def get_host_apis(src_dir):
180203 name = m .group (1 )
181204 elif line [0 ] == '{' and matching :
182205 matching = False
183- n_param = len (api .split (',' ))
206+ api_list = api .split (',' )
207+ n_param = len (api_list )
184208 if "(void)" in api :
185209 n_param -= 1
186210 apis .append ({
187211 "name" : name ,
188- "n_param" : n_param
212+ "n_param" : n_param ,
213+ "raw_func" : api
189214 })
190215 api = ""
191216 if matching :
192217 api += line .rstrip ()
193218 return apis
194219
195-
196220if __name__ == '__main__' :
197221 host_api_def = ""
198222 api_def = ""
199223 name_def = ""
200- for i in range (max_wasm_api_arg + 1 ):
224+ for i in range (MAX_WASM_API_ARG + 1 ):
201225 if i == 0 :
202226 host_api_def += "#define DEFINE_WASM_API_ARG_VOID void\n "
203227 else :
@@ -212,6 +236,9 @@ def get_host_apis(src_dir):
212236 param_s += ", "
213237 param_s += "int32_t"
214238 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+
215242 host_api_def += "\n \n "
216243
217244 src_dir = sys .argv [1 ]
@@ -222,6 +249,8 @@ def get_host_apis(src_dir):
222249 n_param = api ["n_param" ]
223250 if n_param == 0 :
224251 param_suffix = "VOID"
252+ elif n_param == 2 and "int64_t" in api ["raw_func" ]:
253+ param_suffix = "I32_I64"
225254 else :
226255 param_suffix = "I32_%d" % n_param
227256
@@ -249,7 +278,7 @@ def get_host_apis(src_dir):
249278 vm_header = "#include <wasmtime.h>" ,
250279 vm_api_header_name = "NGX_HTTP_WASM_API_WASMTIME_H" ,
251280 wasm_api_def = wasmtime_def ,
252- max_wasm_api_arg = max_wasm_api_arg ,
281+ max_wasm_api_arg = MAX_WASM_API_ARG ,
253282 ))
254283
255284 wasmedge_def = predefined_macro ("wasmedge" )
@@ -261,5 +290,5 @@ def get_host_apis(src_dir):
261290 vm_header = "#include <wasmedge/wasmedge.h>" ,
262291 vm_api_header_name = "NGX_HTTP_WASM_API_WASMEDGE_H" ,
263292 wasm_api_def = wasmedge_def ,
264- max_wasm_api_arg = max_wasm_api_arg ,
293+ max_wasm_api_arg = MAX_WASM_API_ARG ,
265294 ))
0 commit comments