Refine wasm_runtime_call_wasm_a/v (#1326)
Refine wasm_runtime_call_wasm_a/v by adding cache buf for arguments/results to avoid allocating memory frequently.
This commit is contained in:
parent
dd62b32b20
commit
8de5168cea
@ -1789,10 +1789,11 @@ wasm_runtime_call_wasm_a(WASMExecEnv *exec_env,
|
|||||||
uint32 num_results, wasm_val_t results[],
|
uint32 num_results, wasm_val_t results[],
|
||||||
uint32 num_args, wasm_val_t args[])
|
uint32 num_args, wasm_val_t args[])
|
||||||
{
|
{
|
||||||
uint32 argc, *argv, cell_num, total_size, module_type;
|
uint32 argc, argv_buf[16] = { 0 }, *argv = argv_buf, cell_num, module_type;
|
||||||
#if WASM_ENABLE_REF_TYPES != 0
|
#if WASM_ENABLE_REF_TYPES != 0
|
||||||
uint32 i, param_size_in_double_world = 0, result_size_in_double_world = 0;
|
uint32 i, param_size_in_double_world = 0, result_size_in_double_world = 0;
|
||||||
#endif
|
#endif
|
||||||
|
uint64 total_size;
|
||||||
WASMType *type;
|
WASMType *type;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
@ -1836,11 +1837,11 @@ wasm_runtime_call_wasm_a(WASMExecEnv *exec_env,
|
|||||||
}
|
}
|
||||||
|
|
||||||
total_size = sizeof(uint32) * (uint64)(cell_num > 2 ? cell_num : 2);
|
total_size = sizeof(uint32) * (uint64)(cell_num > 2 ? cell_num : 2);
|
||||||
if (!(argv = runtime_malloc((uint32)total_size, exec_env->module_inst, NULL,
|
if (total_size > sizeof(argv_buf)) {
|
||||||
0))) {
|
if (!(argv =
|
||||||
wasm_runtime_set_exception(exec_env->module_inst,
|
runtime_malloc(total_size, exec_env->module_inst, NULL, 0))) {
|
||||||
"allocate memory failed");
|
goto fail1;
|
||||||
goto fail1;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
parse_args_to_uint32_array(type, args, argv);
|
parse_args_to_uint32_array(type, args, argv);
|
||||||
@ -1850,7 +1851,8 @@ wasm_runtime_call_wasm_a(WASMExecEnv *exec_env,
|
|||||||
parse_uint32_array_to_results(type, argv, results);
|
parse_uint32_array_to_results(type, argv, results);
|
||||||
|
|
||||||
fail2:
|
fail2:
|
||||||
wasm_runtime_free(argv);
|
if (argv != argv_buf)
|
||||||
|
wasm_runtime_free(argv);
|
||||||
fail1:
|
fail1:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1861,9 +1863,10 @@ wasm_runtime_call_wasm_v(WASMExecEnv *exec_env,
|
|||||||
uint32 num_results, wasm_val_t results[],
|
uint32 num_results, wasm_val_t results[],
|
||||||
uint32 num_args, ...)
|
uint32 num_args, ...)
|
||||||
{
|
{
|
||||||
wasm_val_t *args = NULL;
|
wasm_val_t args_buf[8] = { 0 }, *args = args_buf;
|
||||||
WASMType *type = NULL;
|
WASMType *type = NULL;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
uint64 total_size;
|
||||||
uint32 i = 0, module_type;
|
uint32 i = 0, module_type;
|
||||||
va_list vargs;
|
va_list vargs;
|
||||||
|
|
||||||
@ -1881,11 +1884,13 @@ wasm_runtime_call_wasm_v(WASMExecEnv *exec_env,
|
|||||||
"function declaration.");
|
"function declaration.");
|
||||||
goto fail1;
|
goto fail1;
|
||||||
}
|
}
|
||||||
if (!(args =
|
|
||||||
runtime_malloc(sizeof(wasm_val_t) * num_args, NULL, NULL, 0))) {
|
total_size = sizeof(wasm_val_t) * (uint64)num_args;
|
||||||
wasm_runtime_set_exception(exec_env->module_inst,
|
if (total_size > sizeof(args_buf)) {
|
||||||
"allocate memory failed");
|
if (!(args =
|
||||||
goto fail1;
|
runtime_malloc(total_size, exec_env->module_inst, NULL, 0))) {
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
va_start(vargs, num_args);
|
va_start(vargs, num_args);
|
||||||
@ -1927,9 +1932,11 @@ wasm_runtime_call_wasm_v(WASMExecEnv *exec_env,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
va_end(vargs);
|
va_end(vargs);
|
||||||
|
|
||||||
ret = wasm_runtime_call_wasm_a(exec_env, function, num_results, results,
|
ret = wasm_runtime_call_wasm_a(exec_env, function, num_results, results,
|
||||||
num_args, args);
|
num_args, args);
|
||||||
wasm_runtime_free(args);
|
if (args != args_buf)
|
||||||
|
wasm_runtime_free(args);
|
||||||
|
|
||||||
fail1:
|
fail1:
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user