File size: 4,592 Bytes
00df61d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | /**
* @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
|