/**
 * @license
 * Copyright 2024 The Emscripten Authors
 * SPDX-License-Identifier: MIT
 */

{{{
  // Helper function to export a heap symbol on the module object,
  // if requested.
  globalThis.maybeExportHeap = (x) => {
    // For now, we export all heap object when not building with MINIMAL_RUNTIME
    let shouldExport = !MINIMAL_RUNTIME && !STRICT;
    if (!shouldExport) {
      if (MODULARIZE && EXPORT_ALL) {
        shouldExport = true;
      } else if (AUDIO_WORKLET && (x == 'HEAP32' || x == 'HEAPU32')) {
        // Export to the AudioWorkletGlobalScope the needed variables to access
        // the heap. AudioWorkletGlobalScope is unable to access global JS vars
        // in the compiled main JS file.
        shouldExport = true;
      } else if (EXPORTED_RUNTIME_METHODS.includes(x)) {
        shouldExport = true;
      }
    }

    return shouldExport ? `Module['${x}'] = ` : '';
  };
  null;
}}}

function updateMemoryViews() {
  var b = wasmMemory.buffer;
#if SUPPORT_BIG_ENDIAN
  {{{ maybeExportHeap('HEAP_DATA_VIEW') }}} HEAP_DATA_VIEW = new DataView(b);
#endif
  {{{ maybeExportHeap('HEAP8')   }}}HEAP8 = new Int8Array(b);
  {{{ maybeExportHeap('HEAP16')  }}}HEAP16 = new Int16Array(b);
  {{{ maybeExportHeap('HEAPU8')  }}}HEAPU8 = new Uint8Array(b);
  {{{ maybeExportHeap('HEAPU16') }}}HEAPU16 = new Uint16Array(b);
  {{{ maybeExportHeap('HEAP32')  }}}HEAP32 = new Int32Array(b);
  {{{ maybeExportHeap('HEAPU32') }}}HEAPU32 = new Uint32Array(b);
  {{{ maybeExportHeap('HEAPF32') }}}HEAPF32 = new Float32Array(b);
  {{{ maybeExportHeap('HEAPF64') }}}HEAPF64 = new Float64Array(b);
#if WASM_BIGINT
  {{{ maybeExportHeap('HEAP64')  }}}HEAP64 = new BigInt64Array(b);
  {{{ maybeExportHeap('HEAPU64') }}}HEAPU64 = new BigUint64Array(b);
#endif
}

#if MEMORY64 == 1
var toIndexType = (function() {
  // Probe for support of bigint bounds with memory64.
  // TODO(sbc): Remove this once all browsers start requiring bigint here.
  // See https://github.com/WebAssembly/memory64/issues/68
  var bigintMemoryBounds = 1;
  try {
    /** @suppress {checkTypes} */
    new WebAssembly.Memory({'initial': 1n, 'index': 'i64'});
  } catch (e) {
    bigintMemoryBounds = 0;
  }
  return (i) => bigintMemoryBounds ? BigInt(i) : i;
})();
#endif
