/** * @license * Copyright 2024 The Emscripten Authors * SPDX-License-Identifier: MIT */ #include "runtime_stack_check.js" #include "runtime_exceptions.js" #include "runtime_debug.js" #if SAFE_HEAP #include "runtime_safe_heap.js" #endif #if SHARED_MEMORY && ALLOW_MEMORY_GROWTH && !GROWABLE_ARRAYBUFFERS // Support for growable heap + pthreads, where the buffer may change, so JS views // must be updated. function growMemViews() { // `updateMemoryViews` updates all the views simultaneously, so it's enough to check any of them. if (wasmMemory.buffer != HEAP8.buffer) { updateMemoryViews(); } } #endif #if USE_ASAN #include "runtime_asan.js" #endif #if SINGLE_FILE && SINGLE_FILE_BINARY_ENCODE && !WASM2JS #include "binaryDecode.js" #endif #if MODULARIZE var readyPromiseResolve, readyPromiseReject; #endif #if (PTHREADS || WASM_WORKERS) && (ENVIRONMENT_MAY_BE_NODE && !WASM_ESM_INTEGRATION) if (ENVIRONMENT_IS_NODE && {{{ ENVIRONMENT_IS_WORKER_THREAD() }}}) { // Create as web-worker-like an environment as we can. globalThis.self = globalThis; var parentPort = worker_threads.parentPort; // Deno and Bun already have `postMessage` defined on the global scope and // deliver messages to `globalThis.onmessage`, so we must not duplicate that // behavior here if `postMessage` is already present. if (!globalThis.postMessage) { parentPort.on('message', (msg) => globalThis.onmessage?.({ data: msg })); globalThis.postMessage = (msg) => parentPort.postMessage(msg); } // Node.js Workers do not pass postMessage()s and uncaught exception events to the parent // thread necessarily in the same order where they were generated in sequential program order. // See https://github.com/nodejs/node/issues/59617 // To remedy this, capture all uncaughtExceptions in the Worker, and sequentialize those over // to the same postMessage pipe that other messages use. process.on("uncaughtException", (err) => { #if PTHREADS_DEBUG dbg(`uncaughtException on worker thread: ${err.message}`); #endif postMessage({ cmd: 'uncaughtException', error: err }); // Also shut down the Worker to match the same semantics as if this uncaughtException // handler was not registered. // (n.b. this will not shut down the whole Node.js app process, but just the Worker) process.exit(1); }); } #endif // (PTHREADS || WASM_WORKERS) && (ENVIRONMENT_MAY_BE_NODE && !WASM_ESM_INTEGRATION) #if PTHREADS #include "runtime_pthread.js" #endif #if WASM_WORKERS #include "wasm_worker.js" #endif #if AUDIO_WORKLET #include "audio_worklet.js" #endif // Memory management #if SUPPORT_BIG_ENDIAN /** @type {!DataView} */ var HEAP_DATA_VIEW; #endif #if !MINIMAL_RUNTIME || ASSERTIONS || SAFE_HEAP || USE_ASAN || MODULARIZE var runtimeInitialized = false; #endif #if EXIT_RUNTIME var runtimeExited = false; #endif {{{ // Helper function to export a heap symbol on the module object, // if requested. const shouldExportHeap = (x) => { let shouldExport = false; if (MODULARIZE && EXPORT_ALL) { shouldExport = true; } else if (EXPORTED_RUNTIME_METHODS.has(x)) { shouldExport = true; } return shouldExport; } const maybeExportHeap = (x) => { if (shouldExportHeap(x) && MODULARIZE != 'instance') { return `Module['${x}'] = `; } return ''; }; }}} function updateMemoryViews() { #if GROWABLE_ARRAYBUFFERS var b = wasmMemory.toResizableBuffer(); #else var b = wasmMemory.buffer; #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 SUPPORT_BIG_ENDIAN {{{ maybeExportHeap('HEAP_DATA_VIEW') }}} HEAP_DATA_VIEW = new DataView(b); LE_HEAP_UPDATE(); #endif } #if IMPORTED_MEMORY // In non-standalone/normal mode, we create the memory here. #include "runtime_init_memory.js" #endif // !IMPORTED_MEMORY && ASSERTIONS #include "memoryprofiler.js" #if !DECLARE_ASM_MODULE_EXPORTS function exportAliases(wasmExports) { {{{ makeExportAliases() }}} } #endif