Merge branch main into dev/wasi-libc-windows
This commit is contained in:
@ -1418,6 +1418,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
while (node_cache) {
|
||||
node_next = bh_list_elem_next(node_cache);
|
||||
if (node_cache->br_table_op_addr == frame_ip - 1) {
|
||||
if (lidx > node_cache->br_count)
|
||||
lidx = node_cache->br_count;
|
||||
depth = node_cache->br_depths[lidx];
|
||||
goto label_pop_csp_n;
|
||||
}
|
||||
@ -4209,7 +4211,6 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||
unsigned frame_size = wasm_interp_interp_frame_size(all_cell_num);
|
||||
unsigned i;
|
||||
bool copy_argv_from_frame = true;
|
||||
char exception[EXCEPTION_BUF_LEN];
|
||||
|
||||
if (argc < function->param_cell_num) {
|
||||
char buf[128];
|
||||
@ -4342,8 +4343,6 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
||||
}
|
||||
#endif
|
||||
wasm_copy_exception(module_inst, exception);
|
||||
LOG_DEBUG("meet an exception %s", exception);
|
||||
}
|
||||
|
||||
wasm_exec_env_set_cur_frame(exec_env, prev_frame);
|
||||
|
||||
@ -3945,7 +3945,6 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||
/* This frame won't be used by JITed code, so only allocate interp
|
||||
frame here. */
|
||||
unsigned frame_size = wasm_interp_interp_frame_size(all_cell_num);
|
||||
char exception[EXCEPTION_BUF_LEN];
|
||||
|
||||
if (argc < function->param_cell_num) {
|
||||
char buf[128];
|
||||
@ -4030,8 +4029,6 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
||||
}
|
||||
#endif
|
||||
wasm_copy_exception(module_inst, exception);
|
||||
LOG_DEBUG("meet an exception %s", exception);
|
||||
}
|
||||
|
||||
wasm_exec_env_set_cur_frame(exec_env, prev_frame);
|
||||
|
||||
@ -694,34 +694,10 @@ wasm_loader_find_export(const WASMModule *module, const char *module_name,
|
||||
const char *field_name, uint8 export_kind,
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
WASMExport *export;
|
||||
uint32 i;
|
||||
|
||||
for (i = 0, export = module->exports; i < module->export_count;
|
||||
++i, ++export) {
|
||||
/**
|
||||
* need to consider a scenario that different kinds of exports
|
||||
* may have the same name, like
|
||||
* (table (export "m1" "exported") 10 funcref)
|
||||
* (memory (export "m1" "exported") 10)
|
||||
**/
|
||||
if (export->kind == export_kind && !strcmp(field_name, export->name)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == module->export_count) {
|
||||
LOG_DEBUG("can not find an export %d named %s in the module %s",
|
||||
export_kind, field_name, module_name);
|
||||
set_error_buf(error_buf, error_buf_size,
|
||||
"unknown import or incompatible import type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
(void)module_name;
|
||||
|
||||
/* since there is a validation in load_export_section(), it is for sure
|
||||
* export->index is valid*/
|
||||
WASMExport *export =
|
||||
loader_find_export((WASMModuleCommon *)module, module_name, field_name,
|
||||
export_kind, error_buf, error_buf_size);
|
||||
;
|
||||
return export;
|
||||
}
|
||||
#endif
|
||||
@ -912,152 +888,6 @@ wasm_loader_resolve_global(const char *module_name, const char *global_name,
|
||||
return global;
|
||||
}
|
||||
|
||||
static WASMModule *
|
||||
search_sub_module(const WASMModule *parent_module, const char *sub_module_name)
|
||||
{
|
||||
WASMRegisteredModule *node =
|
||||
bh_list_first_elem(parent_module->import_module_list);
|
||||
while (node && strcmp(sub_module_name, node->module_name)) {
|
||||
node = bh_list_elem_next(node);
|
||||
}
|
||||
return node ? (WASMModule *)node->module : NULL;
|
||||
}
|
||||
|
||||
static bool
|
||||
register_sub_module(const WASMModule *parent_module,
|
||||
const char *sub_module_name, WASMModule *sub_module)
|
||||
{
|
||||
/* register sub_module into its parent sub module list */
|
||||
WASMRegisteredModule *node = NULL;
|
||||
bh_list_status ret;
|
||||
|
||||
if (search_sub_module(parent_module, sub_module_name)) {
|
||||
LOG_DEBUG("%s has been registered in its parent", sub_module_name);
|
||||
return true;
|
||||
}
|
||||
|
||||
node = loader_malloc(sizeof(WASMRegisteredModule), NULL, 0);
|
||||
if (!node) {
|
||||
return false;
|
||||
}
|
||||
|
||||
node->module_name = sub_module_name;
|
||||
node->module = (WASMModuleCommon *)sub_module;
|
||||
ret = bh_list_insert(parent_module->import_module_list, node);
|
||||
bh_assert(BH_LIST_SUCCESS == ret);
|
||||
(void)ret;
|
||||
return true;
|
||||
}
|
||||
|
||||
static WASMModule *
|
||||
load_depended_module(const WASMModule *parent_module,
|
||||
const char *sub_module_name, char *error_buf,
|
||||
uint32 error_buf_size)
|
||||
{
|
||||
WASMModule *sub_module = NULL;
|
||||
bool ret = false;
|
||||
uint8 *buffer = NULL;
|
||||
uint32 buffer_size = 0;
|
||||
const module_reader reader = wasm_runtime_get_module_reader();
|
||||
const module_destroyer destroyer = wasm_runtime_get_module_destroyer();
|
||||
|
||||
/* check the registered module list of the parent */
|
||||
sub_module = search_sub_module(parent_module, sub_module_name);
|
||||
if (sub_module) {
|
||||
LOG_DEBUG("%s has been loaded before", sub_module_name);
|
||||
return sub_module;
|
||||
}
|
||||
|
||||
/* check the global registered module list */
|
||||
sub_module =
|
||||
(WASMModule *)wasm_runtime_find_module_registered(sub_module_name);
|
||||
if (sub_module) {
|
||||
LOG_DEBUG("%s has been loaded", sub_module_name);
|
||||
goto register_sub_module;
|
||||
}
|
||||
|
||||
LOG_VERBOSE("loading %s", sub_module_name);
|
||||
|
||||
if (!reader) {
|
||||
set_error_buf_v(error_buf, error_buf_size,
|
||||
"no sub module reader to load %s", sub_module_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* start to maintain a loading module list */
|
||||
ret = wasm_runtime_is_loading_module(sub_module_name);
|
||||
if (ret) {
|
||||
set_error_buf_v(error_buf, error_buf_size,
|
||||
"found circular dependency on %s", sub_module_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = wasm_runtime_add_loading_module(sub_module_name, error_buf,
|
||||
error_buf_size);
|
||||
if (!ret) {
|
||||
LOG_DEBUG("can not add %s into loading module list\n", sub_module_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = reader(sub_module_name, &buffer, &buffer_size);
|
||||
if (!ret) {
|
||||
LOG_DEBUG("read the file of %s failed", sub_module_name);
|
||||
set_error_buf_v(error_buf, error_buf_size, "unknown import",
|
||||
sub_module_name);
|
||||
goto delete_loading_module;
|
||||
}
|
||||
|
||||
sub_module =
|
||||
wasm_loader_load(buffer, buffer_size, false, error_buf, error_buf_size);
|
||||
if (!sub_module) {
|
||||
LOG_DEBUG("error: can not load the sub_module %s", sub_module_name);
|
||||
/* others will be destroyed in runtime_destroy() */
|
||||
goto destroy_file_buffer;
|
||||
}
|
||||
|
||||
wasm_runtime_delete_loading_module(sub_module_name);
|
||||
|
||||
/* register on a global list */
|
||||
ret = wasm_runtime_register_module_internal(
|
||||
sub_module_name, (WASMModuleCommon *)sub_module, buffer, buffer_size,
|
||||
error_buf, error_buf_size);
|
||||
if (!ret) {
|
||||
LOG_DEBUG("error: can not register module %s globally\n",
|
||||
sub_module_name);
|
||||
/* others will be unloaded in runtime_destroy() */
|
||||
goto unload_module;
|
||||
}
|
||||
|
||||
/* register into its parent list */
|
||||
register_sub_module:
|
||||
ret = register_sub_module(parent_module, sub_module_name, sub_module);
|
||||
if (!ret) {
|
||||
set_error_buf_v(error_buf, error_buf_size,
|
||||
"failed to register sub module %s", sub_module_name);
|
||||
/* since it is in the global module list, no need to
|
||||
* unload the module. the runtime_destroy() will do it
|
||||
*/
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return sub_module;
|
||||
|
||||
unload_module:
|
||||
wasm_loader_unload(sub_module);
|
||||
|
||||
destroy_file_buffer:
|
||||
if (destroyer) {
|
||||
destroyer(buffer, buffer_size);
|
||||
}
|
||||
else {
|
||||
LOG_WARNING("need to release the reading buffer of %s manually",
|
||||
sub_module_name);
|
||||
}
|
||||
|
||||
delete_loading_module:
|
||||
wasm_runtime_delete_loading_module(sub_module_name);
|
||||
return NULL;
|
||||
}
|
||||
#endif /* end of WASM_ENABLE_MULTI_MODULE */
|
||||
|
||||
static bool
|
||||
@ -1104,8 +934,9 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end,
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
else {
|
||||
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
||||
sub_module = load_depended_module(parent_module, sub_module_name,
|
||||
error_buf, error_buf_size);
|
||||
sub_module = (WASMModule *)wasm_runtime_load_depended_module(
|
||||
(WASMModuleCommon *)parent_module, sub_module_name, error_buf,
|
||||
error_buf_size);
|
||||
if (!sub_module) {
|
||||
return false;
|
||||
}
|
||||
@ -1193,8 +1024,9 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end,
|
||||
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
||||
sub_module = load_depended_module(parent_module, sub_module_name,
|
||||
error_buf, error_buf_size);
|
||||
sub_module = (WASMModule *)wasm_runtime_load_depended_module(
|
||||
(WASMModuleCommon *)parent_module, sub_module_name, error_buf,
|
||||
error_buf_size);
|
||||
if (!sub_module) {
|
||||
return false;
|
||||
}
|
||||
@ -1327,8 +1159,9 @@ load_memory_import(const uint8 **p_buf, const uint8 *buf_end,
|
||||
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
||||
sub_module = load_depended_module(parent_module, sub_module_name,
|
||||
error_buf, error_buf_size);
|
||||
sub_module = (WASMModule *)wasm_runtime_load_depended_module(
|
||||
(WASMModuleCommon *)parent_module, sub_module_name, error_buf,
|
||||
error_buf_size);
|
||||
if (!sub_module) {
|
||||
return false;
|
||||
}
|
||||
@ -1427,8 +1260,9 @@ load_global_import(const uint8 **p_buf, const uint8 *buf_end,
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
if (!global->is_linked
|
||||
&& !wasm_runtime_is_built_in_module(sub_module_name)) {
|
||||
sub_module = load_depended_module(parent_module, sub_module_name,
|
||||
error_buf, error_buf_size);
|
||||
sub_module = (WASMModule *)wasm_runtime_load_depended_module(
|
||||
(WASMModuleCommon *)parent_module, sub_module_name, error_buf,
|
||||
error_buf_size);
|
||||
if (!sub_module) {
|
||||
return false;
|
||||
}
|
||||
@ -5476,6 +5310,7 @@ wasm_loader_pop_frame_ref(WASMLoaderContext *ctx, uint8 type, char *error_buf,
|
||||
return true;
|
||||
}
|
||||
|
||||
#if WASM_ENABLE_FAST_INTERP == 0
|
||||
static bool
|
||||
wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||
uint8 type_push, uint8 type_pop, char *error_buf,
|
||||
@ -5490,6 +5325,7 @@ wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool
|
||||
wasm_loader_push_frame_csp(WASMLoaderContext *ctx, uint8 label_type,
|
||||
@ -6166,27 +6002,6 @@ wasm_loader_pop_frame_offset(WASMLoaderContext *ctx, uint8 type,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
wasm_loader_push_pop_frame_offset(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||
uint8 type_push, uint8 type_pop,
|
||||
bool disable_emit, int16 operand_offset,
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
uint8 i;
|
||||
|
||||
for (i = 0; i < pop_cnt; i++) {
|
||||
if (!wasm_loader_pop_frame_offset(ctx, type_pop, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
}
|
||||
if (!wasm_loader_push_frame_offset(ctx, type_push, disable_emit,
|
||||
operand_offset, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
wasm_loader_push_frame_ref_offset(WASMLoaderContext *ctx, uint8 type,
|
||||
bool disable_emit, int16 operand_offset,
|
||||
@ -6220,12 +6035,24 @@ wasm_loader_push_pop_frame_ref_offset(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||
bool disable_emit, int16 operand_offset,
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
if (!wasm_loader_push_pop_frame_offset(ctx, pop_cnt, type_push, type_pop,
|
||||
disable_emit, operand_offset,
|
||||
error_buf, error_buf_size))
|
||||
uint8 i;
|
||||
|
||||
for (i = 0; i < pop_cnt; i++) {
|
||||
if (!wasm_loader_pop_frame_offset(ctx, type_pop, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
|
||||
if (!wasm_loader_pop_frame_ref(ctx, type_pop, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!wasm_loader_push_frame_offset(ctx, type_push, disable_emit,
|
||||
operand_offset, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
if (!wasm_loader_push_pop_frame_ref(ctx, pop_cnt, type_push, type_pop,
|
||||
error_buf, error_buf_size))
|
||||
|
||||
if (!wasm_loader_push_frame_ref(ctx, type_push, error_buf, error_buf_size))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
||||
@ -3937,6 +3937,7 @@ wasm_loader_pop_frame_ref(WASMLoaderContext *ctx, uint8 type, char *error_buf,
|
||||
return true;
|
||||
}
|
||||
|
||||
#if WASM_ENABLE_FAST_INTERP == 0
|
||||
static bool
|
||||
wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||
uint8 type_push, uint8 type_pop, char *error_buf,
|
||||
@ -3951,6 +3952,7 @@ wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool
|
||||
wasm_loader_push_frame_csp(WASMLoaderContext *ctx, uint8 label_type,
|
||||
@ -4608,25 +4610,6 @@ wasm_loader_pop_frame_offset(WASMLoaderContext *ctx, uint8 type,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
wasm_loader_push_pop_frame_offset(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||
uint8 type_push, uint8 type_pop,
|
||||
bool disable_emit, int16 operand_offset,
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
for (int i = 0; i < pop_cnt; i++) {
|
||||
if (!wasm_loader_pop_frame_offset(ctx, type_pop, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
}
|
||||
if (!wasm_loader_push_frame_offset(ctx, type_push, disable_emit,
|
||||
operand_offset, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
wasm_loader_push_frame_ref_offset(WASMLoaderContext *ctx, uint8 type,
|
||||
bool disable_emit, int16 operand_offset,
|
||||
@ -4660,12 +4643,24 @@ wasm_loader_push_pop_frame_ref_offset(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||
bool disable_emit, int16 operand_offset,
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
if (!wasm_loader_push_pop_frame_offset(ctx, pop_cnt, type_push, type_pop,
|
||||
disable_emit, operand_offset,
|
||||
error_buf, error_buf_size))
|
||||
uint8 i;
|
||||
|
||||
for (i = 0; i < pop_cnt; i++) {
|
||||
if (!wasm_loader_pop_frame_offset(ctx, type_pop, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
|
||||
if (!wasm_loader_pop_frame_ref(ctx, type_pop, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!wasm_loader_push_frame_offset(ctx, type_push, disable_emit,
|
||||
operand_offset, error_buf,
|
||||
error_buf_size))
|
||||
return false;
|
||||
if (!wasm_loader_push_pop_frame_ref(ctx, pop_cnt, type_push, type_pop,
|
||||
error_buf, error_buf_size))
|
||||
|
||||
if (!wasm_loader_push_frame_ref(ctx, type_push, error_buf, error_buf_size))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
||||
@ -51,11 +51,15 @@ set_error_buf_v(char *error_buf, uint32 error_buf_size, const char *format, ...)
|
||||
}
|
||||
|
||||
WASMModule *
|
||||
wasm_load(uint8 *buf, uint32 size, char *error_buf, uint32 error_buf_size)
|
||||
wasm_load(uint8 *buf, uint32 size,
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
bool main_module,
|
||||
#endif
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
return wasm_loader_load(buf, size,
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
true,
|
||||
main_module,
|
||||
#endif
|
||||
error_buf, error_buf_size);
|
||||
}
|
||||
@ -1266,78 +1270,6 @@ execute_free_function(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
static bool
|
||||
sub_module_instantiate(WASMModule *module, WASMModuleInstance *module_inst,
|
||||
uint32 stack_size, uint32 heap_size, char *error_buf,
|
||||
uint32 error_buf_size)
|
||||
{
|
||||
bh_list *sub_module_inst_list = module_inst->e->sub_module_inst_list;
|
||||
WASMRegisteredModule *sub_module_list_node =
|
||||
bh_list_first_elem(module->import_module_list);
|
||||
|
||||
while (sub_module_list_node) {
|
||||
WASMSubModInstNode *sub_module_inst_list_node = NULL;
|
||||
WASMModule *sub_module = (WASMModule *)sub_module_list_node->module;
|
||||
WASMModuleInstance *sub_module_inst = NULL;
|
||||
|
||||
sub_module_inst =
|
||||
wasm_instantiate(sub_module, NULL, NULL, stack_size, heap_size,
|
||||
error_buf, error_buf_size);
|
||||
if (!sub_module_inst) {
|
||||
LOG_DEBUG("instantiate %s failed",
|
||||
sub_module_list_node->module_name);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
sub_module_inst_list_node = runtime_malloc(sizeof(WASMSubModInstNode),
|
||||
error_buf, error_buf_size);
|
||||
if (!sub_module_inst_list_node) {
|
||||
LOG_DEBUG("Malloc WASMSubModInstNode failed, SZ:%d",
|
||||
sizeof(WASMSubModInstNode));
|
||||
goto failed;
|
||||
}
|
||||
|
||||
sub_module_inst_list_node->module_inst = sub_module_inst;
|
||||
sub_module_inst_list_node->module_name =
|
||||
sub_module_list_node->module_name;
|
||||
bh_list_status ret =
|
||||
bh_list_insert(sub_module_inst_list, sub_module_inst_list_node);
|
||||
bh_assert(BH_LIST_SUCCESS == ret);
|
||||
(void)ret;
|
||||
|
||||
sub_module_list_node = bh_list_elem_next(sub_module_list_node);
|
||||
|
||||
continue;
|
||||
failed:
|
||||
if (sub_module_inst_list_node) {
|
||||
bh_list_remove(sub_module_inst_list, sub_module_inst_list_node);
|
||||
wasm_runtime_free(sub_module_inst_list_node);
|
||||
}
|
||||
|
||||
if (sub_module_inst)
|
||||
wasm_deinstantiate(sub_module_inst, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
sub_module_deinstantiate(WASMModuleInstance *module_inst)
|
||||
{
|
||||
bh_list *list = module_inst->e->sub_module_inst_list;
|
||||
WASMSubModInstNode *node = bh_list_first_elem(list);
|
||||
while (node) {
|
||||
WASMSubModInstNode *next_node = bh_list_elem_next(node);
|
||||
bh_list_remove(list, node);
|
||||
wasm_deinstantiate(node->module_inst, false);
|
||||
wasm_runtime_free(node);
|
||||
node = next_node;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool
|
||||
check_linked_symbol(WASMModuleInstance *module_inst, char *error_buf,
|
||||
uint32 error_buf_size)
|
||||
@ -1714,8 +1646,9 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent,
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
module_inst->e->sub_module_inst_list =
|
||||
&module_inst->e->sub_module_inst_list_head;
|
||||
ret = sub_module_instantiate(module, module_inst, stack_size, heap_size,
|
||||
error_buf, error_buf_size);
|
||||
ret = wasm_runtime_sub_module_instantiate(
|
||||
(WASMModuleCommon *)module, (WASMModuleInstanceCommon *)module_inst,
|
||||
stack_size, heap_size, error_buf, error_buf_size);
|
||||
if (!ret) {
|
||||
LOG_DEBUG("build a sub module list failed");
|
||||
goto fail;
|
||||
@ -2198,7 +2131,8 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
|
||||
#endif
|
||||
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
sub_module_deinstantiate(module_inst);
|
||||
wasm_runtime_sub_module_deinstantiate(
|
||||
(WASMModuleInstanceCommon *)module_inst);
|
||||
#endif
|
||||
|
||||
if (module_inst->memory_count > 0)
|
||||
@ -2234,12 +2168,10 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
|
||||
wasm_runtime_free(module_inst->e->common.c_api_func_imports);
|
||||
|
||||
if (!is_sub_inst) {
|
||||
#if WASM_ENABLE_LIBC_WASI != 0
|
||||
wasm_runtime_destroy_wasi((WASMModuleInstanceCommon *)module_inst);
|
||||
#endif
|
||||
#if WASM_ENABLE_WASI_NN != 0
|
||||
wasi_nn_destroy(module_inst);
|
||||
#endif
|
||||
wasm_native_call_context_dtors((WASMModuleInstanceCommon *)module_inst);
|
||||
}
|
||||
|
||||
wasm_runtime_free(module_inst);
|
||||
@ -2401,6 +2333,9 @@ wasm_call_function(WASMExecEnv *exec_env, WASMFunctionInstance *function,
|
||||
/* set thread handle and stack boundary */
|
||||
wasm_exec_env_set_thread_info(exec_env);
|
||||
|
||||
/* set exec env so it can be later retrieved from instance */
|
||||
module_inst->e->common.cur_exec_env = exec_env;
|
||||
|
||||
interp_call_wasm(module_inst, exec_env, function, argc, argv);
|
||||
return !wasm_copy_exception(module_inst, NULL);
|
||||
}
|
||||
@ -2981,6 +2916,7 @@ wasm_interp_create_call_stack(struct WASMExecEnv *exec_env)
|
||||
total_len += \
|
||||
wasm_runtime_dump_line_buf_impl(line_buf, print, &buf, &len); \
|
||||
if ((!print) && buf && (len == 0)) { \
|
||||
exception_unlock(module_inst); \
|
||||
return total_len; \
|
||||
} \
|
||||
} while (0)
|
||||
@ -3005,6 +2941,7 @@ wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env, bool print, char *buf,
|
||||
return 0;
|
||||
}
|
||||
|
||||
exception_lock(module_inst);
|
||||
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||
PRINT_OR_DUMP();
|
||||
|
||||
@ -3013,6 +2950,7 @@ wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env, bool print, char *buf,
|
||||
uint32 line_length, i;
|
||||
|
||||
if (!bh_vector_get(module_inst->frames, n, &frame)) {
|
||||
exception_unlock(module_inst);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3043,6 +2981,7 @@ wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env, bool print, char *buf,
|
||||
}
|
||||
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||
PRINT_OR_DUMP();
|
||||
exception_unlock(module_inst);
|
||||
|
||||
return total_len + 1;
|
||||
}
|
||||
|
||||
@ -212,7 +212,10 @@ typedef struct CApiFuncImport {
|
||||
|
||||
/* The common part of WASMModuleInstanceExtra and AOTModuleInstanceExtra */
|
||||
typedef struct WASMModuleInstanceExtraCommon {
|
||||
void *contexts[WASM_MAX_INSTANCE_CONTEXTS];
|
||||
CApiFuncImport *c_api_func_imports;
|
||||
/* pointer to the exec env currently used */
|
||||
WASMExecEnv *cur_exec_env;
|
||||
#if WASM_CONFIGUABLE_BOUNDS_CHECKS != 0
|
||||
/* Disable bounds checks or not */
|
||||
bool disable_bounds_checks;
|
||||
@ -297,12 +300,8 @@ struct WASMModuleInstance {
|
||||
it denotes `AOTModule *` */
|
||||
DefPointer(WASMModule *, module);
|
||||
|
||||
#if WASM_ENABLE_LIBC_WASI
|
||||
/* WASI context */
|
||||
DefPointer(WASIContext *, wasi_ctx);
|
||||
#else
|
||||
DefPointer(void *, wasi_ctx);
|
||||
#endif
|
||||
DefPointer(void *, used_to_be_wasi_ctx); /* unused */
|
||||
|
||||
DefPointer(WASMExecEnv *, exec_env_singleton);
|
||||
/* Array of function pointers to import functions,
|
||||
not available in AOTModuleInstance */
|
||||
@ -397,7 +396,11 @@ wasm_get_func_code_end(WASMFunctionInstance *func)
|
||||
}
|
||||
|
||||
WASMModule *
|
||||
wasm_load(uint8 *buf, uint32 size, char *error_buf, uint32 error_buf_size);
|
||||
wasm_load(uint8 *buf, uint32 size,
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
bool main_module,
|
||||
#endif
|
||||
char *error_buf, uint32 error_buf_size);
|
||||
|
||||
WASMModule *
|
||||
wasm_load_from_sections(WASMSection *section_list, char *error_buf,
|
||||
@ -668,6 +671,16 @@ void
|
||||
wasm_propagate_wasi_args(WASMModule *module);
|
||||
#endif
|
||||
|
||||
#if WASM_ENABLE_THREAD_MGR != 0
|
||||
void
|
||||
exception_lock(WASMModuleInstance *module_inst);
|
||||
void
|
||||
exception_unlock(WASMModuleInstance *module_inst);
|
||||
#else
|
||||
#define exception_lock(module_inst) (void)(module_inst)
|
||||
#define exception_unlock(module_inst) (void)(module_inst)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user