Hi, I trying to add asyncify into project that uses exceptions (dosbox-x). I know that asyncify currently does not support exceptions. My idea is asyncify only "top level" functions that does not have exceptions code. My current asyncify call stack is:
js -> $runJsdos (asyncify) -> $jsdos_main (asyncify) -> $loopNoThrow -> $loop -> ...
$loop can throw exception, so I impelemtned loopNoThrow like this:
int loopThrownNum = -1;
int loopNoThrow() {
try {
return (*loop)();
} catch (int x) {
loopThrownNum = x;
return 0;
} catch (...) {
printf("throwing out loopNoThrow is not supported by asyncify\n");
abort();
}
}
I turning the exception into ret val, and the $jsdos_main is last asyncify function:
while (true) {
sleep(0);
int ret = loopNoThrow();
// rest logic
}
To be sure that I don't use exceptions in async function, I mark them as noexcept, and compile with -fno-exceptions.
However, at link stage wasm-opt fail on assertion "unexpected expression type", because in function $runJsdos there are exception handling code.
The code of $runJsdos before wasm-opt:
(func $runJsdos (param $0 i32) (result i32)
(drop
(call $jsdos_main\28Config*\29
(local.get $0)
)
)
(call $jsdos::destroyAsyncify\28\29)
(block $label$1
(br_if $label$1
(i32.eqz
(local.get $0)
)
)
(drop
(call $Config::~Config\28\29
(local.get $0)
)
)
)
(call $operator\20delete\28void*\29
(local.get $0)
)
(unreachable)
)
As you can see there is nothing related to exceptions, but AsyncifyFlow reports that $runJsdos have following code:
(try
(do
(local.set $3
(i32.load $0
(i32.const 1889704)
)
)
(nop)
(local.set $3
(call_indirect $0 (type $none_=>_i32)
(local.get $3)
)
)
)
(catch $tag$0
(local.set $0
(pop i32)
)
(nop)
(nop)
(nop)
(global.set $__stack_pointer
(local.get $2)
)
(i32.store $0
(i32.const 40043732)
(i32.const 1052)
)
(i32.store $0
(i32.const 40043728)
(i32.const 0)
)
(nop)
(call $_Unwind_CallPersonality
(local.get $0)
)
(nop)
(local.set $1
(i32.load $0
(i32.const 40043736)
)
)
(nop)
(nop)
(local.set $0
(call $__cxa_begin_catch
(local.get $0)
)
)
(nop)
(local.set $1
(i32.eq
(local.get $1)
(i32.const 2)
)
)
(if
(local.get $1)
(block
(nop)
(local.set $0
(i32.load $0
(local.get $0)
)
)
(i32.store $0
(i32.const 1149424)
(local.get $0)
)
(call $__cxa_end_catch)
(unreachable)
)
)
(call $puts
(i32.const 5497)
)
(try $label$938
(do
(call $abort)
)
(catch_all
(nop)
(global.set $__stack_pointer
(local.get $2)
)
(try
(do
(call $__cxa_end_catch)
)
(catch_all
(nop)
(global.set $__stack_pointer
(local.get $2)
)
(call $std::terminate\28\29)
(unreachable)
)
)
(rethrow $label$938)
)
)
(unreachable)
)
)
Probably this happens because of some inlining, I compile with -Oz, but I am not sure. How I can avoid injection of exception handling code into this functions?
Thank you!