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