@@ -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
0 commit comments