@@ -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,17 @@ 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
+ var response = await readAsync ( binaryFile ) ;
661
+ return new Uint8Array ( response ) ;
662
+ } catch {
663
+ // Fall back to getBinarySync below;
664
+ }
664
665
}
665
666
#endif
666
667
667
668
// Otherwise, getBinarySync should be able to get it synchronously
668
- return Promise . resolve ( getBinarySync ( binaryFile ) ) ;
669
+ return getBinarySync ( binaryFile ) ;
669
670
}
670
671
671
672
#if LOAD_SOURCE_MAP
@@ -773,56 +774,47 @@ function resetPrototype(constructor, attrs) {
773
774
#endif
774
775
775
776
#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 ) ;
777
781
#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 ) ;
779
785
#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 } ` ) ;
796
789
#if WASM == 2
797
790
#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 ( ( ) => { } ) ;
810
801
}
802
+ #if ENVIRONMENT_MAY_BE_NODE || ENVIRONMENT_MAY_BE_SHELL
803
+ }
811
804
#endif
812
805
#endif // WASM == 2
813
806
814
807
#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
+ }
819
812
#endif
820
- abort ( reason ) ;
821
- } ) ;
822
- } ) ;
813
+ abort ( reason ) ;
814
+ }
823
815
}
824
816
825
- function instantiateAsync ( binary , binaryFile , imports ) {
817
+ async function instantiateAsync ( binary , binaryFile , imports ) {
826
818
#if ! SINGLE_FILE
827
819
if ( ! binary &&
828
820
typeof WebAssembly . instantiateStreaming == 'function' &&
@@ -841,56 +833,41 @@ function instantiateAsync(binary, binaryFile, imports) {
841
833
! ENVIRONMENT_IS_NODE &&
842
834
#endif
843
835
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' }" ) } } } ) ;
853
838
#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 ) ;
864
848
#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
+ } ;
894
871
}
895
872
#endif
896
873
return instantiateArrayBuffer ( binaryFile , imports ) ;
@@ -936,7 +913,7 @@ function getWasmImports() {
936
913
937
914
// Create the wasm instance.
938
915
// Receives the wasm imports, returns the exports.
939
- function createWasm ( ) {
916
+ { { { asyncIf ( WASM_ASYNC_COMPILATION ) } } } function createWasm ( ) {
940
917
// Load the wasm module and create an instance of using native support in the JS engine.
941
918
// handle a generated wasm instance, receiving its exports and
942
919
// performing other necessary setup
@@ -1104,17 +1081,23 @@ function createWasm() {
1104
1081
#if RUNTIME_DEBUG
1105
1082
dbg ( 'asynchronously preparing wasm' ) ;
1106
1083
#endif
1107
- instantiateAsync ( wasmBinary , wasmBinaryFile , info ) . then ( receiveInstantiationResult )
1108
1084
#if MODULARIZE
1109
- // If instantiation fails, reject the module ready promise.
1110
- . catch ( readyPromiseReject )
1085
+ try {
1111
1086
#endif
1112
- ;
1087
+ var result = await instantiateAsync ( wasmBinary , wasmBinaryFile , info ) ;
1088
+ receiveInstantiationResult ( result ) ;
1113
1089
#if LOAD_SOURCE_MAP
1114
- getSourceMapPromise ( ) . then ( receiveSourceMapJSON ) ;
1090
+ receiveSourceMapJSON ( await getSourceMapPromise ( ) ) ;
1115
1091
#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
1118
1101
var result = instantiateSync ( wasmBinaryFile , info ) ;
1119
1102
#if PTHREADS || MAIN_MODULE
1120
1103
return receiveInstance ( result [ 0 ] , result [ 1 ] ) ;
@@ -1124,7 +1107,7 @@ function createWasm() {
1124
1107
// When the regression is fixed, we can remove this if/else.
1125
1108
return receiveInstance ( result [ 0 ] ) ;
1126
1109
#endif
1127
- #endif
1110
+ #endif // WASM_ASYNC_COMPILATION
1128
1111
}
1129
1112
1130
1113
#if ! WASM_BIGINT
0 commit comments