mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-15 06:01:14 +00:00
Store import function pointer in module instance (#1130)
Fix the issue reported by #1118 , use this approach since it avoids copying unnecessary static information into instance and reduces the footprint.
This commit is contained in:
parent
f8b4ca2a70
commit
98431225f2
|
@ -771,7 +771,8 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
|
||||||
WASMFunctionImport *func_import = cur_func->u.func_import;
|
WASMFunctionImport *func_import = cur_func->u.func_import;
|
||||||
unsigned local_cell_num = 2;
|
unsigned local_cell_num = 2;
|
||||||
WASMInterpFrame *frame;
|
WASMInterpFrame *frame;
|
||||||
uint32 argv_ret[2];
|
uint32 argv_ret[2], cur_func_index;
|
||||||
|
void *native_func_pointer = NULL;
|
||||||
char buf[128];
|
char buf[128];
|
||||||
bool ret;
|
bool ret;
|
||||||
|
|
||||||
|
@ -786,7 +787,11 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
|
||||||
|
|
||||||
wasm_exec_env_set_cur_frame(exec_env, frame);
|
wasm_exec_env_set_cur_frame(exec_env, frame);
|
||||||
|
|
||||||
if (!func_import->func_ptr_linked) {
|
cur_func_index = cur_func - module_inst->functions;
|
||||||
|
bh_assert(cur_func_index < module_inst->module->import_function_count);
|
||||||
|
native_func_pointer = module_inst->import_func_ptrs[cur_func_index];
|
||||||
|
|
||||||
|
if (!native_func_pointer) {
|
||||||
snprintf(buf, sizeof(buf),
|
snprintf(buf, sizeof(buf),
|
||||||
"failed to call unlinked import function (%s, %s)",
|
"failed to call unlinked import function (%s, %s)",
|
||||||
func_import->module_name, func_import->field_name);
|
func_import->module_name, func_import->field_name);
|
||||||
|
@ -796,9 +801,8 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
|
||||||
|
|
||||||
if (func_import->call_conv_wasm_c_api) {
|
if (func_import->call_conv_wasm_c_api) {
|
||||||
ret = wasm_runtime_invoke_c_api_native(
|
ret = wasm_runtime_invoke_c_api_native(
|
||||||
(WASMModuleInstanceCommon *)module_inst,
|
(WASMModuleInstanceCommon *)module_inst, native_func_pointer,
|
||||||
func_import->func_ptr_linked, func_import->func_type,
|
func_import->func_type, cur_func->param_cell_num, frame->lp,
|
||||||
cur_func->param_cell_num, frame->lp,
|
|
||||||
func_import->wasm_c_api_with_env, func_import->attachment);
|
func_import->wasm_c_api_with_env, func_import->attachment);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
argv_ret[0] = frame->lp[0];
|
argv_ret[0] = frame->lp[0];
|
||||||
|
@ -807,13 +811,13 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
|
||||||
}
|
}
|
||||||
else if (!func_import->call_conv_raw) {
|
else if (!func_import->call_conv_raw) {
|
||||||
ret = wasm_runtime_invoke_native(
|
ret = wasm_runtime_invoke_native(
|
||||||
exec_env, func_import->func_ptr_linked, func_import->func_type,
|
exec_env, native_func_pointer, func_import->func_type,
|
||||||
func_import->signature, func_import->attachment, frame->lp,
|
func_import->signature, func_import->attachment, frame->lp,
|
||||||
cur_func->param_cell_num, argv_ret);
|
cur_func->param_cell_num, argv_ret);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ret = wasm_runtime_invoke_native_raw(
|
ret = wasm_runtime_invoke_native_raw(
|
||||||
exec_env, func_import->func_ptr_linked, func_import->func_type,
|
exec_env, native_func_pointer, func_import->func_type,
|
||||||
func_import->signature, func_import->attachment, frame->lp,
|
func_import->signature, func_import->attachment, frame->lp,
|
||||||
cur_func->param_cell_num, argv_ret);
|
cur_func->param_cell_num, argv_ret);
|
||||||
}
|
}
|
||||||
|
|
|
@ -839,7 +839,8 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
|
||||||
WASMFunctionImport *func_import = cur_func->u.func_import;
|
WASMFunctionImport *func_import = cur_func->u.func_import;
|
||||||
unsigned local_cell_num = 2;
|
unsigned local_cell_num = 2;
|
||||||
WASMInterpFrame *frame;
|
WASMInterpFrame *frame;
|
||||||
uint32 argv_ret[2];
|
uint32 argv_ret[2], cur_func_index;
|
||||||
|
void *native_func_pointer = NULL;
|
||||||
bool ret;
|
bool ret;
|
||||||
|
|
||||||
if (!(frame = ALLOC_FRAME(exec_env,
|
if (!(frame = ALLOC_FRAME(exec_env,
|
||||||
|
@ -853,7 +854,11 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
|
||||||
|
|
||||||
wasm_exec_env_set_cur_frame(exec_env, frame);
|
wasm_exec_env_set_cur_frame(exec_env, frame);
|
||||||
|
|
||||||
if (!func_import->func_ptr_linked) {
|
cur_func_index = cur_func - module_inst->functions;
|
||||||
|
bh_assert(cur_func_index < module_inst->module->import_function_count);
|
||||||
|
native_func_pointer = module_inst->import_func_ptrs[cur_func_index];
|
||||||
|
|
||||||
|
if (!native_func_pointer) {
|
||||||
char buf[128];
|
char buf[128];
|
||||||
snprintf(buf, sizeof(buf),
|
snprintf(buf, sizeof(buf),
|
||||||
"failed to call unlinked import function (%s, %s)",
|
"failed to call unlinked import function (%s, %s)",
|
||||||
|
@ -864,9 +869,8 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
|
||||||
|
|
||||||
if (func_import->call_conv_wasm_c_api) {
|
if (func_import->call_conv_wasm_c_api) {
|
||||||
ret = wasm_runtime_invoke_c_api_native(
|
ret = wasm_runtime_invoke_c_api_native(
|
||||||
(WASMModuleInstanceCommon *)module_inst,
|
(WASMModuleInstanceCommon *)module_inst, native_func_pointer,
|
||||||
func_import->func_ptr_linked, func_import->func_type,
|
func_import->func_type, cur_func->param_cell_num, frame->lp,
|
||||||
cur_func->param_cell_num, frame->lp,
|
|
||||||
func_import->wasm_c_api_with_env, func_import->attachment);
|
func_import->wasm_c_api_with_env, func_import->attachment);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
argv_ret[0] = frame->lp[0];
|
argv_ret[0] = frame->lp[0];
|
||||||
|
@ -875,13 +879,13 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
|
||||||
}
|
}
|
||||||
else if (!func_import->call_conv_raw) {
|
else if (!func_import->call_conv_raw) {
|
||||||
ret = wasm_runtime_invoke_native(
|
ret = wasm_runtime_invoke_native(
|
||||||
exec_env, func_import->func_ptr_linked, func_import->func_type,
|
exec_env, native_func_pointer, func_import->func_type,
|
||||||
func_import->signature, func_import->attachment, frame->lp,
|
func_import->signature, func_import->attachment, frame->lp,
|
||||||
cur_func->param_cell_num, argv_ret);
|
cur_func->param_cell_num, argv_ret);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ret = wasm_runtime_invoke_native_raw(
|
ret = wasm_runtime_invoke_native_raw(
|
||||||
exec_env, func_import->func_ptr_linked, func_import->func_type,
|
exec_env, native_func_pointer, func_import->func_type,
|
||||||
func_import->signature, func_import->attachment, frame->lp,
|
func_import->signature, func_import->attachment, frame->lp,
|
||||||
cur_func->param_cell_num, argv_ret);
|
cur_func->param_cell_num, argv_ret);
|
||||||
}
|
}
|
||||||
|
|
|
@ -580,6 +580,13 @@ functions_instantiate(const WASMModule *module, WASMModuleInstance *module_inst,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
total_size = sizeof(void *) * (uint64)module->import_function_count;
|
||||||
|
if (!(module_inst->import_func_ptrs =
|
||||||
|
runtime_malloc(total_size, error_buf, error_buf_size))) {
|
||||||
|
wasm_runtime_free(functions);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* instantiate functions from import section */
|
/* instantiate functions from import section */
|
||||||
function = functions;
|
function = functions;
|
||||||
import = module->import_functions;
|
import = module->import_functions;
|
||||||
|
@ -608,6 +615,10 @@ functions_instantiate(const WASMModule *module, WASMModuleInstance *module_inst,
|
||||||
function->local_count = 0;
|
function->local_count = 0;
|
||||||
function->local_types = NULL;
|
function->local_types = NULL;
|
||||||
|
|
||||||
|
/* Copy the function pointer to current instance */
|
||||||
|
module_inst->import_func_ptrs[i] =
|
||||||
|
function->u.func_import->func_ptr_linked;
|
||||||
|
|
||||||
function++;
|
function++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1597,6 +1608,10 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
|
||||||
memories_deinstantiate(module_inst, module_inst->memories,
|
memories_deinstantiate(module_inst, module_inst->memories,
|
||||||
module_inst->memory_count);
|
module_inst->memory_count);
|
||||||
|
|
||||||
|
if (module_inst->import_func_ptrs) {
|
||||||
|
wasm_runtime_free(module_inst->import_func_ptrs);
|
||||||
|
}
|
||||||
|
|
||||||
tables_deinstantiate(module_inst->tables, module_inst->table_count);
|
tables_deinstantiate(module_inst->tables, module_inst->table_count);
|
||||||
functions_deinstantiate(module_inst->functions,
|
functions_deinstantiate(module_inst->functions,
|
||||||
module_inst->function_count);
|
module_inst->function_count);
|
||||||
|
|
|
@ -165,6 +165,9 @@ struct WASMModuleInstance {
|
||||||
uint32 export_tab_count;
|
uint32 export_tab_count;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Array of function pointers to import functions */
|
||||||
|
void **import_func_ptrs;
|
||||||
|
|
||||||
WASMMemoryInstance **memories;
|
WASMMemoryInstance **memories;
|
||||||
WASMTableInstance **tables;
|
WASMTableInstance **tables;
|
||||||
WASMGlobalInstance *globals;
|
WASMGlobalInstance *globals;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user