mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 15:05:19 +00:00
Remove an improper assumption when creating wasm_trap (#1657)
Allow to have multiple stores in an engine and multiple instances in a store. Letting a wasm_function_t pass its wasm_store_t to make it more efficient.
This commit is contained in:
parent
101ea0ea3c
commit
a1f7832625
|
@ -1637,11 +1637,11 @@ wasm_frame_func_offset(const wasm_frame_t *frame)
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasm_trap_t *
|
static wasm_trap_t *
|
||||||
wasm_trap_new_internal(WASMModuleInstanceCommon *inst_comm_rt,
|
wasm_trap_new_internal(wasm_store_t *store,
|
||||||
const char *default_error_info)
|
WASMModuleInstanceCommon *inst_comm_rt,
|
||||||
|
const char *error_info)
|
||||||
{
|
{
|
||||||
wasm_trap_t *trap;
|
wasm_trap_t *trap;
|
||||||
const char *error_info = NULL;
|
|
||||||
wasm_instance_vec_t *instances;
|
wasm_instance_vec_t *instances;
|
||||||
wasm_instance_t *frame_instance = NULL;
|
wasm_instance_t *frame_instance = NULL;
|
||||||
uint32 i;
|
uint32 i;
|
||||||
|
@ -1651,72 +1651,44 @@ wasm_trap_new_internal(WASMModuleInstanceCommon *inst_comm_rt,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if WASM_ENABLE_INTERP != 0
|
|
||||||
if (inst_comm_rt->module_type == Wasm_Module_Bytecode) {
|
|
||||||
error_info = wasm_get_exception((WASMModuleInstance *)inst_comm_rt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if WASM_ENABLE_AOT != 0
|
|
||||||
if (inst_comm_rt->module_type == Wasm_Module_AoT) {
|
|
||||||
error_info = aot_get_exception((AOTModuleInstance *)inst_comm_rt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* a wrong combination of module filetype and compilation flags
|
|
||||||
* also leads to below branch
|
|
||||||
*/
|
|
||||||
if (!error_info && !(error_info = default_error_info)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(trap = malloc_internal(sizeof(wasm_trap_t)))) {
|
if (!(trap = malloc_internal(sizeof(wasm_trap_t)))) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(trap->message = malloc_internal(sizeof(wasm_byte_vec_t)))) {
|
/* fill in message */
|
||||||
goto failed;
|
if (strlen(error_info) > 0) {
|
||||||
}
|
if (!(trap->message = malloc_internal(sizeof(wasm_byte_vec_t)))) {
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
wasm_name_new_from_string_nt(trap->message, error_info);
|
wasm_name_new_from_string_nt(trap->message, error_info);
|
||||||
if (strlen(error_info) && !trap->message->data) {
|
if (!trap->message->data) {
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
|
||||||
#if WASM_ENABLE_INTERP != 0
|
|
||||||
if (inst_comm_rt->module_type == Wasm_Module_Bytecode) {
|
|
||||||
trap->frames = ((WASMModuleInstance *)inst_comm_rt)->frames;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if WASM_ENABLE_AOT != 0
|
|
||||||
if (inst_comm_rt->module_type == Wasm_Module_AoT) {
|
|
||||||
trap->frames = ((AOTModuleInstance *)inst_comm_rt)->frames;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* WASM_ENABLE_DUMP_CALL_STACK != 0 */
|
|
||||||
|
|
||||||
/* allow a NULL frames list */
|
|
||||||
if (!trap->frames) {
|
|
||||||
return trap;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(instances = singleton_engine->stores->data[0]->instances)) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < instances->num_elems; i++) {
|
|
||||||
if (instances->data[i]->inst_comm_rt == inst_comm_rt) {
|
|
||||||
frame_instance = instances->data[i];
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < trap->frames->num_elems; i++) {
|
/* fill in frames */
|
||||||
(((wasm_frame_t *)trap->frames->data) + i)->instance = frame_instance;
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
|
trap->frames = ((WASMModuleInstance *)inst_comm_rt)->frames;
|
||||||
|
|
||||||
|
if (trap->frames) {
|
||||||
|
/* fill in instances */
|
||||||
|
instances = store->instances;
|
||||||
|
bh_assert(instances != NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < instances->num_elems; i++) {
|
||||||
|
if (instances->data[i]->inst_comm_rt == inst_comm_rt) {
|
||||||
|
frame_instance = instances->data[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < trap->frames->num_elems; i++) {
|
||||||
|
(((wasm_frame_t *)trap->frames->data) + i)->instance =
|
||||||
|
frame_instance;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* WASM_ENABLE_DUMP_CALL_STACK != 0 */
|
||||||
|
|
||||||
return trap;
|
return trap;
|
||||||
failed:
|
failed:
|
||||||
|
@ -2929,14 +2901,9 @@ failed:
|
||||||
if (argv != argv_buf)
|
if (argv != argv_buf)
|
||||||
wasm_runtime_free(argv);
|
wasm_runtime_free(argv);
|
||||||
|
|
||||||
/* trap -> exception -> trap */
|
return wasm_trap_new_internal(
|
||||||
if (wasm_runtime_get_exception(func->inst_comm_rt)) {
|
func->store, func->inst_comm_rt,
|
||||||
return wasm_trap_new_internal(func->inst_comm_rt, NULL);
|
wasm_runtime_get_exception(func->inst_comm_rt));
|
||||||
}
|
|
||||||
else {
|
|
||||||
return wasm_trap_new_internal(func->inst_comm_rt,
|
|
||||||
"wasm_func_call failed");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
|
|
|
@ -143,6 +143,8 @@ int main(int argc, const char* argv[]) {
|
||||||
own wasm_name_t message;
|
own wasm_name_t message;
|
||||||
wasm_trap_message(trap, &message);
|
wasm_trap_message(trap, &message);
|
||||||
printf("> %s\n", message.data);
|
printf("> %s\n", message.data);
|
||||||
|
assert(message.num_elems > 0);
|
||||||
|
assert(strncmp(message.data, "Exception: ", strlen("Exception: ")) == 0);
|
||||||
|
|
||||||
printf("Printing origin...\n");
|
printf("Printing origin...\n");
|
||||||
own wasm_frame_t* frame = wasm_trap_origin(trap);
|
own wasm_frame_t* frame = wasm_trap_origin(trap);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user