Skip to content

Commit a7bb4fa

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 669e01a commit a7bb4fa

File tree

87 files changed

+131
-113
lines changed

Some content is hidden

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

87 files changed

+131
-113
lines changed

ChangeLog.md

Lines changed: 5 additions & 0 deletions

src/preamble.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,11 +1036,11 @@ function getWasmImports() {
10361036
trueModule = null;
10371037
#endif
10381038
#if SHARED_MEMORY || RELOCATABLE
1039-
receiveInstance(result['instance'], result['module']);
1039+
return receiveInstance(result['instance'], result['module']);
10401040
#else
10411041
// 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.
10421042
// When the regression is fixed, can restore the above PTHREADS-enabled path.
1043-
receiveInstance(result['instance']);
1043+
return receiveInstance(result['instance']);
10441044
#endif
10451045
}
10461046
#endif // WASM_ASYNC_COMPILATION
@@ -1076,8 +1076,7 @@ function getWasmImports() {
10761076
// Instantiate from the module posted from the main thread.
10771077
// We can just use sync instantiation in the worker.
10781078
var instance = new WebAssembly.Instance(module, getWasmImports());
1079-
receiveInstance(instance, module);
1080-
resolve();
1079+
resolve(receiveInstance(instance, module));
10811080
};
10821081
});
10831082
}
@@ -1095,16 +1094,16 @@ function getWasmImports() {
10951094
try {
10961095
#endif
10971096
var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
1098-
receiveInstantiationResult(result);
1097+
var exports = receiveInstantiationResult(result);
10991098
#if LOAD_SOURCE_MAP
11001099
receiveSourceMapJSON(await getSourceMapAsync());
11011100
#endif
1102-
return result;
1101+
return exports;
11031102
#if MODULARIZE
11041103
} catch (e) {
11051104
// If instantiation fails, reject the module ready promise.
11061105
readyPromiseReject(e);
1107-
return;
1106+
return Promise.reject(e);
11081107
}
11091108
#endif
11101109
#else // WASM_ASYNC_COMPILATION

test/code_size/hello_webgl2_wasm.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 454,
33
"a.html.gz": 328,
4-
"a.js": 4532,
5-
"a.js.gz": 2315,
4+
"a.js": 4538,
5+
"a.js.gz": 2320,
66
"a.wasm": 10402,
77
"a.wasm.gz": 6703,
8-
"total": 15388,
9-
"total_gz": 9346
8+
"total": 15394,
9+
"total_gz": 9351
1010
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"a.html": 346,
33
"a.html.gz": 262,
4-
"a.js": 22200,
5-
"a.js.gz": 11583,
6-
"total": 22546,
7-
"total_gz": 11845
4+
"a.js": 22206,
5+
"a.js.gz": 11589,
6+
"total": 22552,
7+
"total_gz": 11851
88
}

test/code_size/hello_webgl_wasm.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 454,
33
"a.html.gz": 328,
4-
"a.js": 4070,
5-
"a.js.gz": 2158,
4+
"a.js": 4076,
5+
"a.js.gz": 2163,
66
"a.wasm": 10402,
77
"a.wasm.gz": 6703,
8-
"total": 14926,
9-
"total_gz": 9189
8+
"total": 14932,
9+
"total_gz": 9194
1010
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"a.html": 346,
33
"a.html.gz": 262,
4-
"a.js": 21726,
5-
"a.js.gz": 11413,
6-
"total": 22072,
7-
"total_gz": 11675
4+
"a.js": 21732,
5+
"a.js.gz": 11419,
6+
"total": 22078,
7+
"total_gz": 11681
88
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8482
1+
8479
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20818
1+
20814
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8466
1+
8464
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20786
1+
20782
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9516
1+
9515
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24663
1+
24659
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8443
1+
8442
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20711
1+
20707
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8443
1+
8442
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20711
1+
20707
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20402
1+
20398
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9523
1+
9520
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24663
1+
24659
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8482
1+
8479
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20818
1+
20814
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3769
1+
3767
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8493
1+
8489
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7621
1+
7619
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
18731
1+
18727
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2866
1+
2864
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6140
1+
6136
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8003
1+
8001
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
21535
1+
21526
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2713
1+
2710
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6921
1+
6909
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2369
1+
2367
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4844
1+
4840
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2283
1+
2281
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4695
1+
4691
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2283
1+
2281
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4695
1+
4691
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2265
1+
2264
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4662
1+
4658
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6150
1+
6155
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
13609
1+
13626
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1667
1+
1664
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3575
1+
3571
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2283
1+
2281
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4695
1+
4691
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1862
1+
1859
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3938
1+
3934
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1899
1+
1897
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3986
1+
3982
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4830
1+
4826
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2461
1+
2459
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5115
1+
5110
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2164
1+
2161
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4523
1+
4519
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2128
1+
2125
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4455
1+
4451
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1885
1+
1883
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3985
1+
3981
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1899
1+
1897
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3986
1+
3982
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1899
1+
1897
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3986
1+
3982
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1439
1+
1441
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3064
1+
3058
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1520
1+
1524
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3664
1+
3653
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2769
1+
2763
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1336
1+
1338
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2719
1+
2713
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1336
1+
1338
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2719
1+
2713
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1327
1+
1328
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2704
1+
2698
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1336
1+
1338
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2719
1+
2713
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1487
1+
1500
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3095
1+
3114
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4118
1+
4125
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8556
1+
8572
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1336
1+
1338
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2719
1+
2713
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
53709
1+
53731
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
29018
1+
29040
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
52531
1+
52553

test/test_unicode_js_library.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
Unicode postjs: àČšñéáúÍųåêâăščếệüçλληνικάбългарскиPусскийСрпскиУкраїнська한국어中文普通话(中国大陆)普通话(香港)中文(台灣)粵語(香港)日本語हिन्दीภาษาไทย
21
Unicode snowman ☃ says hello! àČšñéáúÍųåêâăščếệüçλληνικάбългарскиPусскийСрпскиУкраїнська한국어中文普通话(中国大陆)普通话(香港)中文(台灣)粵語(香港)日本語हिन्दीภาษาไทย
2+
Unicode postjs: àČšñéáúÍųåêâăščếệüçλληνικάбългарскиPусскийСрпскиУкраїнська한국어中文普通话(中国大陆)普通话(香港)中文(台灣)粵語(香港)日本語हिन्दीภาษาไทย

tools/emscripten.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -893,6 +893,16 @@ def create_sending(metadata, library_symbols):
893893
return '{\n ' + ',\n '.join(elems) + '\n}'
894894

895895

896+
def can_use_await():
897+
# In MODULARIZE mode we can use `await` since the factory function itself
898+
# is marked as `async` and the generated code all lives inside that factory
899+
# function.
900+
# However, because closure does see this (it runs only on the inner code),
901+
# it sees this as a top-level-await, which it does not yet support.
902+
# FIXME(https://github.com/emscripten-core/emscripten/issues/23158)
903+
return settings.MODULARIZE and not settings.USE_CLOSURE_COMPILER
904+
905+
896906
def make_export_wrappers(function_exports):
897907
assert not settings.MINIMAL_RUNTIME
898908

@@ -932,7 +942,7 @@ def install_wrapper(sym):
932942
# With assertions enabled we create a wrapper that are calls get routed through, for
933943
# the lifetime of the program.
934944
wrapper += f"createExportWrapper('{name}', {nargs});"
935-
elif settings.WASM_ASYNC_COMPILATION or settings.PTHREADS:
945+
elif (settings.WASM_ASYNC_COMPILATION and not can_use_await()) or settings.PTHREADS:
936946
# With WASM_ASYNC_COMPILATION wrapper will replace the global var and Module var on
937947
# first use.
938948
args = [f'a{i}' for i in range(nargs)]
@@ -998,7 +1008,11 @@ def create_module(receiving, metadata, global_exports, library_symbols):
9981008

9991009
if not settings.MINIMAL_RUNTIME:
10001010
if settings.WASM_ASYNC_COMPILATION:
1001-
module.append("var wasmExports;\ncreateWasm();\n")
1011+
if can_use_await():
1012+
# In modullize mode the generated code is within a factory function.
1013+
module.append("var wasmExports = await createWasm();\n")
1014+
else:
1015+
module.append("var wasmExports;\ncreateWasm();\n")
10021016
else:
10031017
module.append("var wasmExports = createWasm();\n")
10041018

0 commit comments

Comments
 (0)