mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
65f95f26ff
configure.ac: setup build tools and register objects main.c: wrap main with rb_wasm_rt_start to handle asyncify unwinds tool/m4/ruby_wasm_tools.m4: setup default command based on WASI_SDK_PATH environment variable. checks wasm-opt which is used for asyncify. tool/wasm-clangw wasm/wasm-opt: a clang wrapper which replaces real wasm-opt with do-nothing wasm-opt to avoid misoptimization before asyncify. asyncify is performed at POSTLINK, but clang linker driver tries to run optimization by wasm-opt unconditionally. inlining pass at wasm level breaks asyncify's assumption, so should not optimize before POSTLIK. wasm/GNUmakefile.in: wasm specific rules to compile objects
47 lines
1.3 KiB
C
47 lines
1.3 KiB
C
#include "wasm/machine.h"
|
|
#include "wasm/setjmp.h"
|
|
#include "wasm/fiber.h"
|
|
#include "wasm/asyncify.h"
|
|
#include <stdlib.h>
|
|
|
|
int rb_wasm_rt_start(int (main)(int argc, char **argv), int argc, char **argv) {
|
|
int result;
|
|
void *asyncify_buf;
|
|
|
|
bool new_fiber_started = false;
|
|
void *arg0 = NULL, *arg1 = NULL;
|
|
void (*fiber_entry_point)(void *, void *) = NULL;
|
|
|
|
while (1) {
|
|
if (fiber_entry_point) {
|
|
fiber_entry_point(arg0, arg1);
|
|
} else {
|
|
result = main(argc, argv);
|
|
}
|
|
|
|
// NOTE: it's important to call 'asyncify_stop_unwind' here instead in rb_wasm_handle_jmp_unwind
|
|
// because unless that, Asyncify inserts another unwind check here and it unwinds to the root frame.
|
|
asyncify_stop_unwind();
|
|
|
|
if ((asyncify_buf = rb_wasm_handle_jmp_unwind()) != NULL) {
|
|
asyncify_start_rewind(asyncify_buf);
|
|
continue;
|
|
}
|
|
if ((asyncify_buf = rb_wasm_handle_scan_unwind()) != NULL) {
|
|
asyncify_start_rewind(asyncify_buf);
|
|
continue;
|
|
}
|
|
|
|
asyncify_buf = rb_wasm_handle_fiber_unwind(&fiber_entry_point, &arg0, &arg1, &new_fiber_started);
|
|
// Newly starting fiber doesn't have asyncify buffer yet, so don't rewind it for the first time entry
|
|
if (asyncify_buf) {
|
|
asyncify_start_rewind(asyncify_buf);
|
|
continue;
|
|
} else if (new_fiber_started) {
|
|
continue;
|
|
}
|
|
|
|
break;
|
|
}
|
|
return result;
|
|
}
|