Skip to content

Commit a4f64a3

Browse files
authored
Move all addOn<X> functions into a JS library. (#23565)
- Make all `addOn<X>` functions have a corresponding compile time version `addAt<X>`. - Make all the `addOn<X>` functions use the compile time `addAt<X>` helper so the `addOn<X>` code is not emitted if it is not needed. - Add the missing injection points to the minimal runtime. - Add tests to ensure the order in regular runtime and mininimal runtime. Automatic rebaseline of codesize expectations. NFC This is an automatic change generated by tools/maint/rebaseline_tests.py. The following (85) test expectation files were updated by running the tests with `--rebaseline`: ``` browser/test_small_js_flags.js.size: 4248 => 4150 [-98 bytes / -2.31%] other/codesize/test_codesize_cxx_ctors1.gzsize: 8288 => 8263 [-25 bytes / -0.30%] other/codesize/test_codesize_cxx_ctors1.jssize: 20132 => 20087 [-45 bytes / -0.22%] other/codesize/test_codesize_cxx_ctors2.gzsize: 8273 => 8252 [-21 bytes / -0.25%] other/codesize/test_codesize_cxx_ctors2.jssize: 20111 => 20065 [-46 bytes / -0.23%] other/codesize/test_codesize_cxx_except.gzsize: 9289 => 9269 [-20 bytes / -0.22%] other/codesize/test_codesize_cxx_except.jssize: 23900 => 23854 [-46 bytes / -0.19%] other/codesize/test_codesize_cxx_except_wasm.gzsize: 8231 => 8207 [-24 bytes / -0.29%] other/codesize/test_codesize_cxx_except_wasm.jssize: 20024 => 19979 [-45 bytes / -0.22%] other/codesize/test_codesize_cxx_except_wasm_legacy.gzsize: 8231 => 8207 [-24 bytes / -0.29%] other/codesize/test_codesize_cxx_except_wasm_legacy.jssize: 20024 => 19979 [-45 bytes / -0.22%] other/codesize/test_codesize_cxx_lto.gzsize: 8296 => 8279 [-17 bytes / -0.20%] other/codesize/test_codesize_cxx_lto.jssize: 20208 => 20162 [-46 bytes / -0.23%] other/codesize/test_codesize_cxx_mangle.gzsize: 9292 => 9277 [-15 bytes / -0.16%] other/codesize/test_codesize_cxx_mangle.jssize: 23900 => 23854 [-46 bytes / -0.19%] other/codesize/test_codesize_cxx_noexcept.gzsize: 8288 => 8263 [-25 bytes / -0.30%] other/codesize/test_codesize_cxx_noexcept.jssize: 20132 => 20087 [-45 bytes / -0.22%] other/codesize/test_codesize_cxx_wasmfs.gzsize: 3496 => 3471 [-25 bytes / -0.72%] other/codesize/test_codesize_cxx_wasmfs.jssize: 7541 => 7496 [-45 bytes / -0.60%] other/codesize/test_codesize_files_js_fs.gzsize: 7591 => 7571 [-20 bytes / -0.26%] other/codesize/test_codesize_files_js_fs.jssize: 18679 => 18634 [-45 bytes / -0.24%] other/codesize/test_codesize_files_wasmfs.gzsize: 2736 => 2712 [-24 bytes / -0.88%] other/codesize/test_codesize_files_wasmfs.jssize: 5851 => 5807 [-44 bytes / -0.75%] other/codesize/test_codesize_hello_O0.gzsize: 7874 => 7872 [-2 bytes / -0.03%] other/codesize/test_codesize_hello_O0.jssize: 20992 => 20962 [-30 bytes / -0.14%] other/codesize/test_codesize_hello_O1.gzsize: 2605 => 2579 [-26 bytes / -1.00%] other/codesize/test_codesize_hello_O1.jssize: 6719 => 6647 [-72 bytes / -1.07%] other/codesize/test_codesize_hello_O2.gzsize: 2257 => 2232 [-25 bytes / -1.11%] other/codesize/test_codesize_hello_O2.jssize: 4645 => 4600 [-45 bytes / -0.97%] other/codesize/test_codesize_hello_O3.gzsize: 2212 => 2190 [-22 bytes / -0.99%] other/codesize/test_codesize_hello_O3.jssize: 4587 => 4542 [-45 bytes / -0.98%] other/codesize/test_codesize_hello_Os.gzsize: 2212 => 2190 [-22 bytes / -0.99%] other/codesize/test_codesize_hello_Os.jssize: 4587 => 4542 [-45 bytes / -0.98%] other/codesize/test_codesize_hello_Oz.gzsize: 2212 => 2190 [-22 bytes / -0.99%] other/codesize/test_codesize_hello_Oz.jssize: 4587 => 4542 [-45 bytes / -0.98%] other/codesize/test_codesize_hello_dylink.gzsize: 5931 => 5914 [-17 bytes / -0.29%] other/codesize/test_codesize_hello_dylink.jssize: 13106 => 13075 [-31 bytes / -0.24%] other/codesize/test_codesize_hello_export_nothing.gzsize: 1620 => 1600 [-20 bytes / -1.23%] other/codesize/test_codesize_hello_export_nothing.jssize: 3500 => 3471 [-29 bytes / -0.83%] other/codesize/test_codesize_hello_wasmfs.gzsize: 2212 => 2190 [-22 bytes / -0.99%] other/codesize/test_codesize_hello_wasmfs.jssize: 4587 => 4542 [-45 bytes / -0.98%] other/codesize/test_codesize_libcxxabi_message_O3.gzsize: 1814 => 1791 [-23 bytes / -1.27%] other/codesize/test_codesize_libcxxabi_message_O3.jssize: 3863 => 3825 [-38 bytes / -0.98%] other/codesize/test_codesize_libcxxabi_message_O3_standalone.gzsize: 1858 => 1825 [-33 bytes / -1.78%] other/codesize/test_codesize_libcxxabi_message_O3_standalone.jssize: 3920 => 3868 [-52 bytes / -1.33%] other/codesize/test_codesize_mem_O3.gzsize: 2265 => 2242 [-23 bytes / -1.02%] other/codesize/test_codesize_mem_O3.jssize: 4755 => 4710 [-45 bytes / -0.95%] other/codesize/test_codesize_mem_O3_grow.gzsize: 2413 => 2391 [-22 bytes / -0.91%] other/codesize/test_codesize_mem_O3_grow.jssize: 5039 => 4994 [-45 bytes / -0.89%] other/codesize/test_codesize_mem_O3_grow_standalone.gzsize: 2117 => 2087 [-30 bytes / -1.42%] other/codesize/test_codesize_mem_O3_grow_standalone.jssize: 4457 => 4405 [-52 bytes / -1.17%] other/codesize/test_codesize_mem_O3_standalone.gzsize: 2083 => 2047 [-36 bytes / -1.73%] other/codesize/test_codesize_mem_O3_standalone.jssize: 4389 => 4337 [-52 bytes / -1.18%] other/codesize/test_codesize_mem_O3_standalone_lib.gzsize: 1844 => 1819 [-25 bytes / -1.36%] other/codesize/test_codesize_mem_O3_standalone_lib.jssize: 3919 => 3881 [-38 bytes / -0.97%] other/codesize/test_codesize_mem_O3_standalone_narg.gzsize: 1858 => 1825 [-33 bytes / -1.78%] other/codesize/test_codesize_mem_O3_standalone_narg.jssize: 3920 => 3868 [-52 bytes / -1.33%] other/codesize/test_codesize_mem_O3_standalone_narg_flto.gzsize: 1858 => 1825 [-33 bytes / -1.78%] other/codesize/test_codesize_mem_O3_standalone_narg_flto.jssize: 3920 => 3868 [-52 bytes / -1.33%] other/codesize/test_codesize_minimal_64.gzsize: 1389 => 1332 [-57 bytes / -4.10%] other/codesize/test_codesize_minimal_64.jssize: 2908 => 2827 [-81 bytes / -2.79%] other/codesize/test_codesize_minimal_O0.gzsize: 6381 => 6331 [-50 bytes / -0.78%] other/codesize/test_codesize_minimal_O0.jssize: 16805 => 16687 [-118 bytes / -0.70%] other/codesize/test_codesize_minimal_O1.gzsize: 1470 => 1408 [-62 bytes / -4.22%] other/codesize/test_codesize_minimal_O1.jssize: 3423 => 3301 [-122 bytes / -3.56%] other/codesize/test_codesize_minimal_O2.gzsize: 1329 => 1273 [-56 bytes / -4.21%] other/codesize/test_codesize_minimal_O2.jssize: 2656 => 2574 [-82 bytes / -3.09%] other/codesize/test_codesize_minimal_O3.gzsize: 1294 => 1238 [-56 bytes / -4.33%] other/codesize/test_codesize_minimal_O3.jssize: 2605 => 2524 [-81 bytes / -3.11%] other/codesize/test_codesize_minimal_Os.gzsize: 1294 => 1238 [-56 bytes / -4.33%] other/codesize/test_codesize_minimal_Os.jssize: 2605 => 2524 [-81 bytes / -3.11%] other/codesize/test_codesize_minimal_Oz-ctors.gzsize: 1290 => 1223 [-67 bytes / -5.19%] other/codesize/test_codesize_minimal_Oz-ctors.jssize: 2599 => 2503 [-96 bytes / -3.69%] other/codesize/test_codesize_minimal_Oz.gzsize: 1294 => 1238 [-56 bytes / -4.33%] other/codesize/test_codesize_minimal_Oz.jssize: 2605 => 2524 [-81 bytes / -3.11%] other/codesize/test_codesize_minimal_esm.gzsize: 1495 => 1436 [-59 bytes / -3.95%] other/codesize/test_codesize_minimal_esm.jssize: 3074 => 2995 [-79 bytes / -2.57%] other/codesize/test_codesize_minimal_pthreads.gzsize: 4152 => 4114 [-38 bytes / -0.92%] other/codesize/test_codesize_minimal_pthreads.jssize: 8634 => 8564 [-70 bytes / -0.81%] other/codesize/test_codesize_minimal_wasmfs.gzsize: 1294 => 1238 [-56 bytes / -4.33%] other/codesize/test_codesize_minimal_wasmfs.jssize: 2605 => 2524 [-81 bytes / -3.11%] other/test_INCOMING_MODULE_JS_API.js.size: 3639 => 3540 [-99 bytes / -2.72%] other/test_unoptimized_code_size.js.size: 52550 => 51969 [-581 bytes / -1.11%] other/test_unoptimized_code_size_no_asserts.js.size: 28168 => 27535 [-633 bytes / -2.25%] other/test_unoptimized_code_size_strict.js.size: 51198 => 50401 [-797 bytes / -1.56%] Average change: -1.48% (-5.19% - -0.03%) ```
1 parent 39ca935 commit a4f64a3

File tree

101 files changed

+277
-160
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+277
-160
lines changed

src/jsifier.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import {
1414
ATEXITS,
1515
ATINITS,
1616
ATPOSTCTORS,
17+
ATPRERUNS,
18+
ATMAINS,
19+
ATPOSTRUNS,
1720
defineI64Param,
1821
indentify,
1922
makeReturn64,
@@ -786,8 +789,11 @@ var proxiedFunctionTable = [
786789
warnings: warningOccured(),
787790
asyncFuncs,
788791
libraryDefinitions: LibraryManager.libraryDefinitions,
792+
ATPRERUNS: ATPRERUNS.join('\n'),
789793
ATINITS: ATINITS.join('\n'),
790794
ATPOSTCTORS: ATPOSTCTORS.join('\n'),
795+
ATMAINS: ATMAINS.join('\n'),
796+
ATPOSTRUNS: ATPOSTRUNS.join('\n'),
791797
ATEXITS: ATEXITS.join('\n'),
792798
}),
793799
);

src/lib/libcore.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2296,6 +2296,68 @@ addToLibrary({
22962296

22972297
$noExitRuntime: "{{{ makeModuleReceiveExpr('noExitRuntime', !EXIT_RUNTIME) }}}",
22982298

2299+
// The following addOn<X> functions are for adding runtime callbacks at
2300+
// various executions points. Each addOn<X> function has a corresponding
2301+
// compiled time version named addAt<X> that will instead inline during
2302+
// compilation (see parseTools.mjs).
2303+
// Note: if there are both runtime and compile time code, the runtime
2304+
// callbacks will be invoked before the compile time code.
2305+
2306+
// See ATPRERUNS in parseTools.mjs for more information.
2307+
$onPreRuns: [],
2308+
$onPreRuns__internal: true,
2309+
$onPreRuns__deps: ['$callRuntimeCallbacks'],
2310+
$onPreRuns__postset: () => {
2311+
ATPRERUNS.unshift('callRuntimeCallbacks(onPreRuns);');
2312+
},
2313+
$addOnPreRun__deps: ['$onPreRuns'],
2314+
$addOnPreRun: (cb) => onPreRuns.unshift(cb),
2315+
// See ATINITS in parseTools.mjs for more information.
2316+
$onInits: [],
2317+
$onInits__internal: true,
2318+
$onInits__deps: ['$callRuntimeCallbacks'],
2319+
$onInits__postset: () => {
2320+
ATINITS.unshift('callRuntimeCallbacks(onInits);');
2321+
},
2322+
$addOnInit__deps: ['$onInits'],
2323+
$addOnInit: (cb) => onInits.unshift(cb),
2324+
// See ATPOSTCTORS in parseTools.mjs for more information.
2325+
$onPostCtors: [],
2326+
$onPostCtors__internal: true,
2327+
$onPostCtors__deps: ['$callRuntimeCallbacks'],
2328+
$onPostCtors__postset: () => {
2329+
ATPOSTCTORS.unshift('callRuntimeCallbacks(onPostCtors);');
2330+
},
2331+
$addOnPostCtor__deps: ['$onPostCtors'],
2332+
$addOnPostCtor: (cb) => onPostCtors.unshift(cb),
2333+
// See ATMAINS in parseTools.mjs for more information.
2334+
$onMains: [],
2335+
$onMains__internal: true,
2336+
$onMains__deps: ['$callRuntimeCallbacks'],
2337+
$onMains__postset: () => {
2338+
ATMAINS.unshift('callRuntimeCallbacks(onMains);');
2339+
},
2340+
$addOnPreMain__deps: ['$onMains'],
2341+
$addOnPreMain: (cb) => onMains.unshift(cb),
2342+
// See ATEXITS in parseTools.mjs for more information.
2343+
$onExits: [],
2344+
$onExits__internal: true,
2345+
$onExits__deps: ['$callRuntimeCallbacks'],
2346+
$onExits__postset: () => {
2347+
ATEXITS.unshift('callRuntimeCallbacks(onExits);');
2348+
},
2349+
$addOnExit__deps: ['$onExits'],
2350+
$addOnExit: (cb) => onExits.unshift(cb),
2351+
// See ATPOSTRUNS in parseTools.mjs for more information.
2352+
$onPostRuns: [],
2353+
$onPostRuns__internal: true,
2354+
$onPostRuns__deps: ['$callRuntimeCallbacks'],
2355+
$onPostRuns__postset: () => {
2356+
ATPOSTRUNS.unshift('callRuntimeCallbacks(onPostRuns);');
2357+
},
2358+
$addOnPostRun__deps: ['$onPostRuns'],
2359+
$addOnPostRun: (cb) => onPostRuns.unshift(cb),
2360+
22992361
// We used to define these globals unconditionally in support code.
23002362
// Instead, we now define them here so folks can pull it in explicitly, on
23012363
// demand.

src/lib/libdylink.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,7 @@ var LibraryDylink = {
612612
'$currentModuleWeakSymbols',
613613
'$updateTableMap',
614614
'$wasmTable',
615+
'$addOnPostCtor',
615616
],
616617
$loadWebAssemblyModule: (binary, flags, libName, localScope, handle) => {
617618
#if DYLINK_DEBUG
@@ -859,7 +860,7 @@ var LibraryDylink = {
859860
init();
860861
} else {
861862
// we aren't ready to run compiled code yet
862-
__ATPOSTCTOR__.push(init);
863+
addOnPostCtor(init);
863864
}
864865
}
865866
#if PTHREADS

src/lib/libglut.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ var LibraryGLUT = {
304304
glutGetModifiers__proxy: 'sync',
305305
glutGetModifiers: () => GLUT.modifiers,
306306

307-
glutInit__deps: ['$Browser'],
307+
glutInit__deps: ['$Browser', '$addOnExit'],
308308
glutInit__proxy: 'sync',
309309
glutInit: (argcp, argv) => {
310310
// Ignore arguments
@@ -342,7 +342,7 @@ var LibraryGLUT = {
342342
}
343343
});
344344

345-
__ATEXIT__.push(() => {
345+
addOnExit(() => {
346346
if (isTouchDevice) {
347347
window.removeEventListener("touchmove", GLUT.touchHandler, true);
348348
window.removeEventListener("touchstart", GLUT.touchHandler, true);

src/lib/libhtml5.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var LibraryHTML5 = {
99
#if PTHREADS
1010
'_emscripten_run_callback_on_thread',
1111
#endif
12+
'$addOnExit',
1213
],
1314
$JSEvents: {
1415

@@ -49,7 +50,7 @@ var LibraryHTML5 = {
4950
5051
// When the C runtime exits via exit(), we unregister all event handlers
5152
// added by this library to be nice and clean.
52-
// Track in this field whether we have yet registered that __ATEXIT__ handler.
53+
// Track in this field whether we have yet registered that onExit handler.
5354
removeEventListenersRegistered: false,
5455
5556
#if HTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS
@@ -74,7 +75,7 @@ var LibraryHTML5 = {
7475
#if EXIT_RUNTIME
7576
registerRemoveEventListeners() {
7677
if (!JSEvents.removeEventListenersRegistered) {
77-
__ATEXIT__.push(JSEvents.removeAllEventListeners);
78+
addOnExit(JSEvents.removeAllEventListeners);
7879
JSEvents.removeEventListenersRegistered = true;
7980
}
8081
},

src/lib/libpthread.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ var LibraryPThread = {
3636
$PThread__deps: ['_emscripten_thread_init',
3737
'$terminateWorker',
3838
'$cleanupThread',
39+
'$addOnPreRun',
3940
#if MAIN_MODULE
4041
'$markAsFinished',
4142
#endif

src/modules.mjs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -427,11 +427,6 @@ function exportRuntime() {
427427
// All possible runtime elements that can be exported
428428
let runtimeElements = [
429429
'run',
430-
'addOnPreRun',
431-
'addOnInit',
432-
'addOnPreMain',
433-
'addOnExit',
434-
'addOnPostRun',
435430
'addRunDependency',
436431
'removeRunDependency',
437432
'out',

src/parseTools.mjs

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -731,30 +731,54 @@ function makeEval(code) {
731731
return ret;
732732
}
733733

734-
export const ATINITS = [];
734+
// Add code to run soon after the Wasm module has been loaded. This is the first
735+
// injection point before all the other addAt<X> functions below. The code will
736+
// be executed after the runtime `onPreRuns` callbacks.
737+
export const ATPRERUNS = [];
738+
function addAtPreRun(code) {
739+
ATPRERUNS.push(code);
740+
}
735741

736742
// Add code to run after the Wasm module is loaded, but before static
737-
// constructors and main (if applicable). The code will be executed before the
738-
// runtime `__ATINIT__` callbacks.
743+
// constructors and main (if applicable). The code will be executed after the
744+
// runtime `onInits` callbacks.
745+
export const ATINITS = [];
739746
function addAtInit(code) {
740747
ATINITS.push(code);
741748
}
742749

743-
export const ATPOSTCTORS = [];
744-
745750
// Add code to run after static constructors, but before main (if applicable).
751+
// The code will be executed after the runtime `onPostCtors` callbacks.
752+
export const ATPOSTCTORS = [];
746753
function addAtPostCtor(code) {
747754
ATPOSTCTORS.push(code);
748755
}
749756

750-
export const ATEXITS = [];
757+
// Add code to run right before main is called. This is only available if the
758+
// the Wasm module has a main function. The code will be executed after the
759+
// runtime `onMains` callbacks.
760+
export const ATMAINS = [];
761+
function addAtPreMain(code) {
762+
ATMAINS.push(code);
763+
}
751764

765+
// Add code to run after main has executed and the runtime is shutdown. This is
766+
// only available when the Wasm module has a main function and -sEXIT_RUNTIME is
767+
// set. The code will be executed after the runtime `onExits` callbacks.
768+
export const ATEXITS = [];
752769
function addAtExit(code) {
753770
if (EXIT_RUNTIME) {
754771
ATEXITS.push(code);
755772
}
756773
}
757774

775+
// Add code to run after main and ATEXITS (if applicable). The code will be
776+
// executed after the runtime `onPostRuns` callbacks.
777+
export const ATPOSTRUNS = [];
778+
function addAtPostRun(code) {
779+
ATPOSTRUNS.push(code);
780+
}
781+
758782
function makeRetainedCompilerSettings() {
759783
const ignore = new Set();
760784
if (STRICT) {
@@ -1093,7 +1117,11 @@ function ENVIRONMENT_IS_WORKER_THREAD() {
10931117

10941118
addToCompileTimeContext({
10951119
ATEXITS,
1120+
ATPRERUNS,
10961121
ATINITS,
1122+
ATPOSTCTORS,
1123+
ATMAINS,
1124+
ATPOSTRUNS,
10971125
FOUR_GB,
10981126
LONG_TYPE,
10991127
POINTER_HEAP,
@@ -1111,8 +1139,11 @@ addToCompileTimeContext({
11111139
ENVIRONMENT_IS_MAIN_THREAD,
11121140
ENVIRONMENT_IS_WORKER_THREAD,
11131141
addAtExit,
1142+
addAtPreRun,
11141143
addAtInit,
11151144
addAtPostCtor,
1145+
addAtPreMain,
1146+
addAtPostRun,
11161147
asyncIf,
11171148
awaitIf,
11181149
buildStringArray,

src/postamble.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ var mainArgs = undefined;
4242
#endif
4343
#if ASSERTIONS
4444
assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])');
45-
assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');
45+
assert(typeof onPreRuns === 'undefined' || onPreRuns.length == 0, 'cannot call main when preRun functions remain to be called');
4646
#endif
4747

4848
var entryFunction = {{{ getEntryFunction() }}};

src/postamble_minimal.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ function run() {
1313
emscriptenMemoryProfiler.onPreloadComplete();
1414
#endif
1515

16+
<<< ATMAINS >>>
1617
#if PROXY_TO_PTHREAD
1718
// User requested the PROXY_TO_PTHREAD option, so call a stub main which
1819
// pthread_create()s a new thread that will call the user's real main() for
@@ -22,7 +23,6 @@ function run() {
2223
var ret = _main();
2324

2425
#if EXIT_RUNTIME
25-
callRuntimeCallbacks(__ATEXIT__);
2626
<<< ATEXITS >>>
2727
#if PTHREADS
2828
PThread.terminateAllThreads();
@@ -43,6 +43,7 @@ function run() {
4343
#if STACK_OVERFLOW_CHECK
4444
checkStackCookie();
4545
#endif
46+
<<< ATPOSTRUNS >>>
4647
}
4748
#endif
4849

@@ -217,6 +218,7 @@ WebAssembly.instantiate(Module['wasm'], imports).then((output) => {
217218
#endif
218219
updateMemoryViews();
219220
#endif
221+
<<< ATPRERUNS >>>
220222

221223
initRuntime(wasmExports);
222224
#if PTHREADS

0 commit comments

Comments
 (0)