@@ -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 }  ) ; 
818-        } 
808+     // Warn on some common problems. 
809+     if  ( isFileURI ( wasmBinaryFile ) )  { 
810+       err ( `warning: Loading from a file URI (${ wasmBinaryFile }  ) ; 
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