Skip to content

Commit af2da32

Browse files
authored
Use async/await instead of promises for wasm loading. NFC (#23068)
These get lowered away by babel when targetting older engines. Followup to #23066, with code size savings.
1 parent ea87423 commit af2da32

File tree

86 files changed

+193
-199
lines changed

Some content is hidden

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

86 files changed

+193
-199
lines changed

ChangeLog.md

+3

src/preamble.js

+85-102
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ function getBinarySync(file) {
647647
#endif
648648
}
649649

650-
function getBinaryPromise(binaryFile) {
650+
async function getWasmBinary(binaryFile) {
651651
#if !SINGLE_FILE
652652
// If we don't have the binary yet, load it asynchronously using readAsync.
653653
if (!wasmBinary
@@ -656,16 +656,17 @@ function getBinaryPromise(binaryFile) {
656656
#endif
657657
) {
658658
// Fetch the binary using readAsync
659-
return readAsync(binaryFile).then(
660-
(response) => new Uint8Array(/** @type{!ArrayBuffer} */(response)),
661-
// Fall back to getBinarySync if readAsync fails
662-
() => getBinarySync(binaryFile)
663-
);
659+
try {
660+
var response = await readAsync(binaryFile);
661+
return new Uint8Array(response);
662+
} catch {
663+
// Fall back to getBinarySync below;
664+
}
664665
}
665666
#endif
666667

667668
// Otherwise, getBinarySync should be able to get it synchronously
668-
return Promise.resolve(getBinarySync(binaryFile));
669+
return getBinarySync(binaryFile);
669670
}
670671

671672
#if LOAD_SOURCE_MAP
@@ -773,56 +774,47 @@ function resetPrototype(constructor, attrs) {
773774
#endif
774775

775776
#if WASM_ASYNC_COMPILATION
776-
function instantiateArrayBuffer(binaryFile, imports) {
777+
async function instantiateArrayBuffer(binaryFile, imports) {
778+
try {
779+
var binary = await getWasmBinary(binaryFile);
780+
var instance = await WebAssembly.instantiate(binary, imports);
777781
#if USE_OFFSET_CONVERTER
778-
var savedBinary;
782+
// wasmOffsetConverter needs to be assigned before calling resolve.
783+
// See comments below in instantiateAsync.
784+
wasmOffsetConverter = new WasmOffsetConverter(binary, instance.module);
779785
#endif
780-
return new Promise((resolve, reject) => {
781-
getBinaryPromise(binaryFile).then((binary) => {
782-
#if USE_OFFSET_CONVERTER
783-
savedBinary = binary;
784-
#endif
785-
return WebAssembly.instantiate(binary, imports);
786-
#if USE_OFFSET_CONVERTER
787-
}).then((instance) => {
788-
// wasmOffsetConverter needs to be assigned before calling resolve.
789-
// See comments below in instantiateAsync.
790-
wasmOffsetConverter = new WasmOffsetConverter(savedBinary, instance.module);
791-
return instance;
792-
#endif
793-
}).then(resolve, (reason) => {
794-
err(`failed to asynchronously prepare wasm: ${reason}`);
795-
786+
return instance;
787+
} catch (reason) {
788+
err(`failed to asynchronously prepare wasm: ${reason}`);
796789
#if WASM == 2
797790
#if ENVIRONMENT_MAY_BE_NODE || ENVIRONMENT_MAY_BE_SHELL
798-
if (typeof location != 'undefined') {
799-
#endif
800-
// WebAssembly compilation failed, try running the JS fallback instead.
801-
var search = location.search;
802-
if (search.indexOf('_rwasm=0') < 0) {
803-
location.href += (search ? search + '&' : '?') + '_rwasm=0';
804-
// Return here to avoid calling abort() below. The application
805-
// still has a chance to start successfully do we don't want to
806-
// trigger onAbort or onExit handlers.
807-
return;
808-
}
809-
#if ENVIRONMENT_MAY_BE_NODE || ENVIRONMENT_MAY_BE_SHELL
791+
if (typeof location != 'undefined') {
792+
#endif
793+
// WebAssembly compilation failed, try running the JS fallback instead.
794+
var search = location.search;
795+
if (search.indexOf('_rwasm=0') < 0) {
796+
// Reload the page with the `_rwasm=0` argument
797+
location.href += (search ? search + '&' : '?') + '_rwasm=0';
798+
// Return a promise that never resolves. We don't want to
799+
// call abort below, or return an error to our caller.
800+
return new Promise(() => {});
810801
}
802+
#if ENVIRONMENT_MAY_BE_NODE || ENVIRONMENT_MAY_BE_SHELL
803+
}
811804
#endif
812805
#endif // WASM == 2
813806

814807
#if ASSERTIONS
815-
// Warn on some common problems.
816-
if (isFileURI(wasmBinaryFile)) {
817-
err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`);
818-
}
808+
// Warn on some common problems.
809+
if (isFileURI(wasmBinaryFile)) {
810+
err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`);
811+
}
819812
#endif
820-
abort(reason);
821-
});
822-
});
813+
abort(reason);
814+
}
823815
}
824816

825-
function instantiateAsync(binary, binaryFile, imports) {
817+
async function instantiateAsync(binary, binaryFile, imports) {
826818
#if !SINGLE_FILE
827819
if (!binary &&
828820
typeof WebAssembly.instantiateStreaming == 'function' &&
@@ -841,56 +833,41 @@ function instantiateAsync(binary, binaryFile, imports) {
841833
!ENVIRONMENT_IS_NODE &&
842834
#endif
843835
typeof fetch == 'function') {
844-
return new Promise((resolve) => {
845-
fetch(binaryFile, {{{ makeModuleReceiveExpr('fetchSettings', "{ credentials: 'same-origin' }") }}}).then((response) => {
846-
// Suppress closure warning here since the upstream definition for
847-
// instantiateStreaming only allows Promise<Repsponse> rather than
848-
// an actual Response.
849-
// TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed.
850-
/** @suppress {checkTypes} */
851-
var result = WebAssembly.instantiateStreaming(response, imports);
852-
836+
try {
837+
var response = fetch(binaryFile, {{{ makeModuleReceiveExpr('fetchSettings', "{ credentials: 'same-origin' }") }}});
853838
#if USE_OFFSET_CONVERTER
854-
// We need the wasm binary for the offset converter. Clone the response
855-
// in order to get its arrayBuffer (cloning should be more efficient
856-
// than doing another entire request).
857-
// (We must clone the response now in order to use it later, as if we
858-
// try to clone it asynchronously lower down then we will get a
859-
// "response was already consumed" error.)
860-
var clonedResponsePromise = response.clone().arrayBuffer();
861-
#endif
862-
863-
result.then(
839+
// We need the wasm binary for the offset converter. Clone the response
840+
// in order to get its arrayBuffer (cloning should be more efficient
841+
// than doing another entire request).
842+
// (We must clone the response now in order to use it later, as if we
843+
// try to clone it asynchronously lower down then we will get a
844+
// "response was already consumed" error.)
845+
var clonedResponse = (await response).clone();
846+
#endif
847+
var instantiationResult = await WebAssembly.instantiateStreaming(response, imports);
864848
#if USE_OFFSET_CONVERTER
865-
(instantiationResult) => {
866-
// When using the offset converter, we must interpose here. First,
867-
// the instantiation result must arrive (if it fails, the error
868-
// handling later down will handle it). Once it arrives, we can
869-
// initialize the offset converter. And only then is it valid to
870-
// call receiveInstantiationResult, as that function will use the
871-
// offset converter (in the case of pthreads, it will create the
872-
// pthreads and send them the offsets along with the wasm instance).
873-
874-
clonedResponsePromise.then((arrayBufferResult) => {
875-
wasmOffsetConverter = new WasmOffsetConverter(new Uint8Array(arrayBufferResult), instantiationResult.module);
876-
resolve(instantiationResult);
877-
},
878-
(reason) => err(`failed to initialize offset-converter: ${reason}`)
879-
);
880-
},
881-
#else
882-
resolve,
883-
#endif
884-
(reason) => {
885-
// We expect the most common failure cause to be a bad MIME type for the binary,
886-
// in which case falling back to ArrayBuffer instantiation should work.
887-
err(`wasm streaming compile failed: ${reason}`);
888-
err('falling back to ArrayBuffer instantiation');
889-
return resolve(instantiateArrayBuffer(binaryFile, imports));
890-
}
891-
);
892-
});
893-
});
849+
// When using the offset converter, we must interpose here. First,
850+
// the instantiation result must arrive (if it fails, the error
851+
// handling later down will handle it). Once it arrives, we can
852+
// initialize the offset converter. And only then is it valid to
853+
// call receiveInstantiationResult, as that function will use the
854+
// offset converter (in the case of pthreads, it will create the
855+
// pthreads and send them the offsets along with the wasm instance).
856+
var arrayBufferResult = await clonedResponse.arrayBuffer();
857+
try {
858+
wasmOffsetConverter = new WasmOffsetConverter(new Uint8Array(arrayBufferResult), instantiationResult.module);
859+
} catch (reason) {
860+
err(`failed to initialize offset-converter: ${reason}`);
861+
}
862+
#endif
863+
return instantiationResult;
864+
} catch (reason) {
865+
// We expect the most common failure cause to be a bad MIME type for the binary,
866+
// in which case falling back to ArrayBuffer instantiation should work.
867+
err(`wasm streaming compile failed: ${reason}`);
868+
err('falling back to ArrayBuffer instantiation');
869+
// fall back of instantiateArrayBuffer below
870+
};
894871
}
895872
#endif
896873
return instantiateArrayBuffer(binaryFile, imports);
@@ -936,7 +913,7 @@ function getWasmImports() {
936913

937914
// Create the wasm instance.
938915
// Receives the wasm imports, returns the exports.
939-
function createWasm() {
916+
{{{ asyncIf(WASM_ASYNC_COMPILATION) }}} function createWasm() {
940917
// Load the wasm module and create an instance of using native support in the JS engine.
941918
// handle a generated wasm instance, receiving its exports and
942919
// performing other necessary setup
@@ -1104,17 +1081,23 @@ function createWasm() {
11041081
#if RUNTIME_DEBUG
11051082
dbg('asynchronously preparing wasm');
11061083
#endif
1107-
instantiateAsync(wasmBinary, wasmBinaryFile, info).then(receiveInstantiationResult)
11081084
#if MODULARIZE
1109-
// If instantiation fails, reject the module ready promise.
1110-
.catch(readyPromiseReject)
1085+
try {
11111086
#endif
1112-
;
1087+
var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
1088+
receiveInstantiationResult(result);
11131089
#if LOAD_SOURCE_MAP
1114-
getSourceMapPromise().then(receiveSourceMapJSON);
1090+
receiveSourceMapJSON(await getSourceMapPromise());
11151091
#endif
1116-
return {}; // no exports yet; we'll fill them in later
1117-
#else
1092+
return result;
1093+
#if MODULARIZE
1094+
} catch (e) {
1095+
// If instantiation fails, reject the module ready promise.
1096+
readyPromiseReject(e);
1097+
return;
1098+
}
1099+
#endif
1100+
#else // WASM_ASYNC_COMPILATION
11181101
var result = instantiateSync(wasmBinaryFile, info);
11191102
#if PTHREADS || MAIN_MODULE
11201103
return receiveInstance(result[0], result[1]);
@@ -1124,7 +1107,7 @@ function createWasm() {
11241107
// When the regression is fixed, we can remove this if/else.
11251108
return receiveInstance(result[0]);
11261109
#endif
1127-
#endif
1110+
#endif // WASM_ASYNC_COMPILATION
11281111
}
11291112

11301113
#if !WASM_BIGINT
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8592
1+
8576
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
21002
1+
20969
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8578
1+
8560
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20969
1+
20937
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9626
1+
9614
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24845
1+
24814
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8562
1+
8543
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20895
1+
20863
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8562
1+
8543
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20895
1+
20863
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8490
1+
8475
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20580
1+
20548
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9629
1+
9613
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24845
1+
24814
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8592
1+
8576
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
21002
1+
20969
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3865
1+
3836
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8639
1+
8606
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7730
1+
7710
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
18909
1+
18876
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2941
1+
2915
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6244
1+
6214
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8043
1+
8034
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
21457
1+
21479
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2788
1+
2785
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7021
1+
7004
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2462
1+
2434
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4984
1+
4955
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2380
1+
2346
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4830
1+
4802
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2380
1+
2346
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4830
1+
4802
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2359
1+
2328
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4797
1+
4769
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6246
1+
6227
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
13767
1+
13729
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1736
1+
1721
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3687
1+
3662
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2380
1+
2346
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4830
1+
4802
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1942
1+
1920
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4064
1+
4040
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1976
1+
1957
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4111
1+
4087

0 commit comments

Comments
 (0)