@@ -647,7 +647,7 @@ function getBinarySync(file) {
647
647
#endif
648
648
}
649
649
650
- function getBinaryPromise ( binaryFile ) {
650
+ async function getWasmBinary ( binaryFile ) {
651
651
#if ! SINGLE_FILE
652
652
// If we don't have the binary yet, load it asynchronously using readAsync.
653
653
if ( ! wasmBinary
@@ -656,16 +656,18 @@ function getBinaryPromise(binaryFile) {
656
656
#endif
657
657
) {
658
658
// 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
+ /** @type {!ArrayBuffer } */
661
+ var response = await readAsync ( binaryFile ) ;
662
+ return new Uint8Array ( response ) ;
663
+ } catch {
664
+ // Fall back to getBinarySync below;
665
+ }
664
666
}
665
667
#endif
666
668
667
669
// Otherwise, getBinarySync should be able to get it synchronously
668
- return Promise . resolve ( getBinarySync ( binaryFile ) ) ;
670
+ return getBinarySync ( binaryFile ) ;
669
671
}
670
672
671
673
#if LOAD_SOURCE_MAP
@@ -773,56 +775,47 @@ function resetPrototype(constructor, attrs) {
773
775
#endif
774
776
775
777
#if WASM_ASYNC_COMPILATION
776
- function instantiateArrayBuffer ( binaryFile , imports ) {
777
- #if USE_OFFSET_CONVERTER
778
- var savedBinary ;
779
- #endif
780
- return new Promise ( ( resolve , reject ) => {
781
- getBinaryPromise ( binaryFile ) . then ( ( binary ) => {
778
+ async function instantiateArrayBuffer ( binaryFile , imports ) {
779
+ try {
780
+ var binary = await getWasmBinary ( binaryFile ) ;
781
+ var instance = await WebAssembly . instantiate ( binary , imports ) ;
782
782
#if USE_OFFSET_CONVERTER
783
- savedBinary = binary ;
783
+ // wasmOffsetConverter needs to be assigned before calling resolve.
784
+ // See comments below in instantiateAsync.
785
+ wasmOffsetConverter = new WasmOffsetConverter ( binary , instance . module ) ;
784
786
#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
-
787
+ return instance ;
788
+ } catch ( reason ) {
789
+ err ( `failed to asynchronously prepare wasm: ${ reason } ` ) ;
796
790
#if WASM == 2
797
791
#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
792
+ if ( typeof location != 'undefined' ) {
793
+ #endif
794
+ // WebAssembly compilation failed, try running the JS fallback instead.
795
+ var search = location . search ;
796
+ if ( search . indexOf ( '_rwasm=0' ) < 0 ) {
797
+ // Reload the page with the `_rwasm=0` argument
798
+ location . href += ( search ? search + '&' : '?' ) + '_rwasm=0' ;
799
+ // Return a promise that never resolves. We don't want to
800
+ // call abort below, or return an error to our caller.
801
+ return new Promise ( ( ) => { } ) ;
810
802
}
803
+ #if ENVIRONMENT_MAY_BE_NODE || ENVIRONMENT_MAY_BE_SHELL
804
+ }
811
805
#endif
812
806
#endif // WASM == 2
813
807
814
808
#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
- }
809
+ // Warn on some common problems.
810
+ if ( isFileURI ( wasmBinaryFile ) ) {
811
+ 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` ) ;
812
+ }
819
813
#endif
820
- abort ( reason ) ;
821
- } ) ;
822
- } ) ;
814
+ abort ( reason ) ;
815
+ }
823
816
}
824
817
825
- function instantiateAsync ( binary , binaryFile , imports ) {
818
+ async function instantiateAsync ( binary , binaryFile , imports ) {
826
819
#if ! SINGLE_FILE
827
820
if ( ! binary &&
828
821
typeof WebAssembly . instantiateStreaming == 'function' &&
@@ -841,56 +834,44 @@ function instantiateAsync(binary, binaryFile, imports) {
841
834
! ENVIRONMENT_IS_NODE &&
842
835
#endif
843
836
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
-
837
+ try {
838
+ var response = fetch ( binaryFile , { { { makeModuleReceiveExpr ( 'fetchSettings' , "{ credentials: 'same-origin' }" ) } } } ) ;
853
839
#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 (
840
+ // We need the wasm binary for the offset converter. Clone the response
841
+ // in order to get its arrayBuffer (cloning should be more efficient
842
+ // than doing another entire request).
843
+ // (We must clone the response now in order to use it later, as if we
844
+ // try to clone it asynchronously lower down then we will get a
845
+ // "response was already consumed" error.)
846
+ var clonedResponse = ( await response ) . clone ( ) ;
847
+ #endif
848
+ var result = WebAssembly . instantiateStreaming ( response , imports ) ;
864
849
#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
- } ,
850
+ // When using the offset converter, we must interpose here. First,
851
+ // the instantiation result must arrive (if it fails, the error
852
+ // handling later down will handle it). Once it arrives, we can
853
+ // initialize the offset converter. And only then is it valid to
854
+ // call receiveInstantiationResult, as that function will use the
855
+ // offset converter (in the case of pthreads, it will create the
856
+ // pthreads and send them the offsets along with the wasm instance).
857
+ var instantiationResult = await result ;
858
+ var arrayBufferResult = await clonedResponse . arrayBuffer ( ) ;
859
+ try {
860
+ wasmOffsetConverter = new WasmOffsetConverter ( new Uint8Array ( arrayBufferResult ) , instantiationResult . module ) ;
861
+ } catch ( reason ) {
862
+ err ( `failed to initialize offset-converter: ${ reason } ` ) ;
863
+ }
864
+ return instantiationResult ;
881
865
#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
- } ) ;
866
+ return await result ;
867
+ #endif
868
+ } catch ( reason ) {
869
+ // We expect the most common failure cause to be a bad MIME type for the binary,
870
+ // in which case falling back to ArrayBuffer instantiation should work.
871
+ err ( `wasm streaming compile failed: ${ reason } ` ) ;
872
+ err ( 'falling back to ArrayBuffer instantiation' ) ;
873
+ // fall back of instantiateArrayBuffer below
874
+ } ;
894
875
}
895
876
#endif
896
877
return instantiateArrayBuffer ( binaryFile , imports ) ;
@@ -936,7 +917,7 @@ function getWasmImports() {
936
917
937
918
// Create the wasm instance.
938
919
// Receives the wasm imports, returns the exports.
939
- function createWasm ( ) {
920
+ { { { asyncIf ( WASM_ASYNC_COMPILATION ) } } } function createWasm ( ) {
940
921
// Load the wasm module and create an instance of using native support in the JS engine.
941
922
// handle a generated wasm instance, receiving its exports and
942
923
// performing other necessary setup
@@ -1104,17 +1085,23 @@ function createWasm() {
1104
1085
#if RUNTIME_DEBUG
1105
1086
dbg ( 'asynchronously preparing wasm' ) ;
1106
1087
#endif
1107
- instantiateAsync ( wasmBinary , wasmBinaryFile , info ) . then ( receiveInstantiationResult )
1108
1088
#if MODULARIZE
1109
- // If instantiation fails, reject the module ready promise.
1110
- . catch ( readyPromiseReject )
1089
+ try {
1111
1090
#endif
1112
- ;
1091
+ var result = await instantiateAsync ( wasmBinary , wasmBinaryFile , info ) ;
1092
+ receiveInstantiationResult ( result ) ;
1113
1093
#if LOAD_SOURCE_MAP
1114
- getSourceMapPromise ( ) . then ( receiveSourceMapJSON ) ;
1094
+ receiveSourceMapJSON ( await getSourceMapPromise ( ) ) ;
1115
1095
#endif
1116
- return { } ; // no exports yet; we'll fill them in later
1117
- #else
1096
+ return result ;
1097
+ #if MODULARIZE
1098
+ } catch ( e ) {
1099
+ // If instantiation fails, reject the module ready promise.
1100
+ readyPromiseReject ( e ) ;
1101
+ throw e ;
1102
+ }
1103
+ #endif
1104
+ #else // WASM_ASYNC_COMPILATION
1118
1105
var result = instantiateSync ( wasmBinaryFile , info ) ;
1119
1106
#if PTHREADS || MAIN_MODULE
1120
1107
return receiveInstance ( result [ 0 ] , result [ 1 ] ) ;
@@ -1124,7 +1111,7 @@ function createWasm() {
1124
1111
// When the regression is fixed, we can remove this if/else.
1125
1112
return receiveInstance ( result [ 0 ] ) ;
1126
1113
#endif
1127
- #endif
1114
+ #endif // WASM_ASYNC_COMPILATION
1128
1115
}
1129
1116
1130
1117
#if ! WASM_BIGINT
0 commit comments