Skip to content

Commit f2b5976

Browse files
committed
Allow the createWasm function to use async/await where possible
The advantage if using `await` in the cases where we can is that it avoids the generation or wrapper function for each export. So instead of ``` var wasmExport = createWasm(); // returns empty object ... var malloc = ((..) => (malloc = wasmExports['malloc'])() ``` We can just generate: ``` var wasmExport = createWasm(); // returns empty object ... var malloc = wasmExports['malloc']; ``` This only currently works in MODULARIZE mode where the code is running inside a factory function. Otherwise it would end up using top-level-await. One wrinkle here is that this is not currently supported when closure is enabled because we run closure only on the contents of the factory function so closure ends up seeing this as a top level await when its not.
1 parent dfe3356 commit f2b5976

File tree

85 files changed

+105
-166
lines changed

Some content is hidden

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

85 files changed

+105
-166
lines changed

src/parseTools.mjs

-29
Original file line numberDiff line numberDiff line change
@@ -971,34 +971,6 @@ function to64(x) {
971971
return `BigInt(${x})`;
972972
}
973973

974-
// Add assertions to catch common errors when using the Promise object we
975-
// return from MODULARIZE Module() invocations.
976-
function addReadyPromiseAssertions() {
977-
// Warn on someone doing
978-
//
979-
// var instance = Module();
980-
// ...
981-
// instance._main();
982-
const properties = Array.from(EXPORTED_FUNCTIONS.values());
983-
// Also warn on onRuntimeInitialized which might be a common pattern with
984-
// older MODULARIZE-using codebases.
985-
properties.push('onRuntimeInitialized');
986-
const warningEnding =
987-
' on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js';
988-
const res = JSON.stringify(properties);
989-
return (
990-
res +
991-
`.forEach((prop) => {
992-
if (!Object.getOwnPropertyDescriptor(readyPromise, prop)) {
993-
Object.defineProperty(readyPromise, prop, {
994-
get: () => abort('You are getting ' + prop + '${warningEnding}'),
995-
set: () => abort('You are setting ' + prop + '${warningEnding}'),
996-
});
997-
}
998-
});`
999-
);
1000-
}
1001-
1002974
function asyncIf(condition) {
1003975
return condition ? 'async' : '';
1004976
}
@@ -1118,7 +1090,6 @@ addToCompileTimeContext({
11181090
ENVIRONMENT_IS_WORKER_THREAD,
11191091
addAtExit,
11201092
addAtInit,
1121-
addReadyPromiseAssertions,
11221093
asyncIf,
11231094
awaitIf,
11241095
buildStringArray,

src/preamble.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -1028,11 +1028,11 @@ function getWasmImports() {
10281028
trueModule = null;
10291029
#endif
10301030
#if SHARED_MEMORY || RELOCATABLE
1031-
receiveInstance(result['instance'], result['module']);
1031+
return receiveInstance(result['instance'], result['module']);
10321032
#else
10331033
// TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
10341034
// When the regression is fixed, can restore the above PTHREADS-enabled path.
1035-
receiveInstance(result['instance']);
1035+
return receiveInstance(result['instance']);
10361036
#endif
10371037
}
10381038
#endif // WASM_ASYNC_COMPILATION
@@ -1068,8 +1068,7 @@ function getWasmImports() {
10681068
// Instantiate from the module posted from the main thread.
10691069
// We can just use sync instantiation in the worker.
10701070
var instance = new WebAssembly.Instance(module, getWasmImports());
1071-
receiveInstance(instance, module);
1072-
resolve();
1071+
resolve(receiveInstance(instance, module));
10731072
};
10741073
});
10751074
}
@@ -1085,11 +1084,11 @@ function getWasmImports() {
10851084
try {
10861085
#endif
10871086
var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
1088-
receiveInstantiationResult(result);
1087+
var exports = receiveInstantiationResult(result);
10891088
#if LOAD_SOURCE_MAP
10901089
receiveSourceMapJSON(await getSourceMapPromise());
10911090
#endif
1092-
return result;
1091+
return exports;
10931092
#if MODULARIZE
10941093
} catch (e) {
10951094
// If instantiation fails, reject the module ready promise.

src/shell.js

-3
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@ var readyPromise = new Promise((resolve, reject) => {
4747
readyPromiseResolve = resolve;
4848
readyPromiseReject = reject;
4949
});
50-
#if ASSERTIONS
51-
{{{ addReadyPromiseAssertions() }}}
52-
#endif
5350
#endif
5451

5552
// Determine the runtime environment we are in. You can customize this by

src/shell_minimal.js

-3
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@ var readyPromise = new Promise((resolve, reject) => {
4141
readyPromiseResolve = resolve;
4242
readyPromiseReject = reject;
4343
});
44-
#if ASSERTIONS
45-
{{{ addReadyPromiseAssertions() }}}
46-
#endif
4744
#endif
4845

4946
#if ENVIRONMENT_MAY_BE_NODE
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8545
1+
8542
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20951
1+
20947
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8530
1+
8528
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20919
1+
20915
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9579
1+
9578
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24796
1+
24792
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8508
1+
8506
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20845
1+
20841
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8508
1+
8506
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20845
1+
20841
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8446
1+
8445
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20530
1+
20526
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9580
1+
9579
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24796
1+
24792
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8545
1+
8542
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20951
1+
20947
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3807
1+
3805
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8588
1+
8584
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7686
1+
7684
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
18858
1+
18854
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2906
1+
2903
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6229
1+
6225
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8021
1+
8019
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
21551
1+
21542
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2761
1+
2758
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7028
1+
7016
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2408
1+
2407
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4937
1+
4933
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2320
1+
2318
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4784
1+
4780
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2320
1+
2318
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4784
1+
4780
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2301
1+
2300
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4751
1+
4747
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6198
1+
6204
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
13710
1+
13727
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1694
1+
1691
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3644
1+
3640
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2320
1+
2318
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4784
1+
4780
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1896
1+
1893
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4022
1+
4018
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1934
1+
1932
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4069
1+
4065
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4925
1+
4921
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2503
1+
2502
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5210
1+
5206
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2199
1+
2197
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4618
1+
4614
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2164
1+
2161
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4548
1+
4544
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1921
1+
1917
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4069
1+
4065
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1934
1+
1932
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4069
1+
4065
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1934
1+
1932
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4069
1+
4065
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1469
1+
1470
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3124
1+
3118
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1546
1+
1548
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3693
1+
3682
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1398
1+
1399
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2829
1+
2823
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1363
1+
1365
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2779
1+
2773
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1363
1+
1365
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2779
1+
2773
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1354
1+
1356
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2764
1+
2758
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1363
1+
1365
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2779
1+
2773
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4163
1+
4170
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8638
1+
8654
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1363
1+
1365
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2779
1+
2773
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
54298
1+
54320
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
29718
1+
29740
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
53094
1+
53116

test/test_other.py

-25
Original file line numberDiff line numberDiff line change
@@ -11963,31 +11963,6 @@ def test_assertions_on_outgoing_module_api_changes(self):
1196311963
'''
1196411964
self.do_runf('src.cpp', expected, emcc_args=['-sASSERTIONS'])
1196511965

11966-
def test_modularize_assertions_on_ready_promise(self):
11967-
# check that when assertions are on we give useful error messages for
11968-
# mistakenly thinking the Promise is an instance. I.e., once you could do
11969-
# Module()._main to get an instance and the main function, but after
11970-
# the breaking change in #10697 Module() now returns a promise, and to get
11971-
# the instance you must use .then() to get a callback with the instance.
11972-
create_file('test.js', r'''
11973-
try {
11974-
Module()._main;
11975-
} catch(e) {
11976-
console.log(e);
11977-
}
11978-
try {
11979-
Module().onRuntimeInitialized = 42;
11980-
} catch(e) {
11981-
console.log(e);
11982-
}
11983-
''')
11984-
self.run_process([EMCC, test_file('hello_world.c'), '-sMODULARIZE', '-sASSERTIONS', '--extern-post-js', 'test.js'])
11985-
# A return code of 1 is from an uncaught exception not handled by
11986-
# the domain or the 'uncaughtException' event handler.
11987-
out = self.run_js('a.out.js', assert_returncode=1)
11988-
self.assertContained('You are getting _main on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js', out)
11989-
self.assertContained('You are setting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js', out)
11990-
1199111966
def test_modularize_assertions_on_reject_promise(self):
1199211967
# Check that there is an uncaught exception in modularize mode.
1199311968
# Once we added an `uncaughtException` handler to the global process

0 commit comments

Comments
 (0)