@swmansion/popcorn 0.2.0-rc.1 → 0.2.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/AtomVM.mjs CHANGED
@@ -1,48 +1,10 @@
1
- // This code implements the `-sMODULARIZE` settings by taking the generated
2
- // JS program code (INNER_JS_CODE) and wrapping it in a factory function.
3
-
4
- // When targetting node and ES6 we use `await import ..` in the generated code
5
- // so the outer function needs to be marked as async.
6
- async function Module(moduleArg = {}) {
1
+ var Module = (() => {
2
+
3
+ return (
4
+ async function(moduleArg = {}) {
7
5
  var moduleRtn;
8
6
 
9
7
  // include: shell.js
10
- // include: minimum_runtime_check.js
11
- (function() {
12
- // "30.0.0" -> 300000
13
- function humanReadableVersionToPacked(str) {
14
- str = str.split("-")[0];
15
- // Remove any trailing part from e.g. "12.53.3-alpha"
16
- var vers = str.split(".").slice(0, 3);
17
- while (vers.length < 3) vers.push("00");
18
- vers = vers.map((n, i, arr) => n.padStart(2, "0"));
19
- return vers.join("");
20
- }
21
- // 300000 -> "30.0.0"
22
- var packedVersionToHumanReadable = n => [ n / 1e4 | 0, (n / 100 | 0) % 100, n % 100 ].join(".");
23
- var TARGET_NOT_SUPPORTED = 2147483647;
24
- var currentNodeVersion = typeof process !== "undefined" && process?.versions?.node ? humanReadableVersionToPacked(process.versions.node) : TARGET_NOT_SUPPORTED;
25
- if (currentNodeVersion < TARGET_NOT_SUPPORTED) {
26
- throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");
27
- }
28
- if (currentNodeVersion < 2147483647) {
29
- throw new Error(`This emscripten-generated code requires node v${packedVersionToHumanReadable(2147483647)} (detected v${packedVersionToHumanReadable(currentNodeVersion)})`);
30
- }
31
- var currentSafariVersion = typeof navigator !== "undefined" && navigator?.userAgent?.includes("Safari/") && navigator.userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/) ? humanReadableVersionToPacked(navigator.userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/)[1]) : TARGET_NOT_SUPPORTED;
32
- if (currentSafariVersion < 15e4) {
33
- throw new Error(`This emscripten-generated code requires Safari v${packedVersionToHumanReadable(15e4)} (detected v${currentSafariVersion})`);
34
- }
35
- var currentFirefoxVersion = typeof navigator !== "undefined" && navigator?.userAgent?.match(/Firefox\/(\d+(?:\.\d+)?)/) ? parseFloat(navigator.userAgent.match(/Firefox\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED;
36
- if (currentFirefoxVersion < 114) {
37
- throw new Error(`This emscripten-generated code requires Firefox v114 (detected v${currentFirefoxVersion})`);
38
- }
39
- var currentChromeVersion = typeof navigator !== "undefined" && navigator?.userAgent?.match(/Chrome\/(\d+(?:\.\d+)?)/) ? parseFloat(navigator.userAgent.match(/Chrome\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED;
40
- if (currentChromeVersion < 85) {
41
- throw new Error(`This emscripten-generated code requires Chrome v85 (detected v${currentChromeVersion})`);
42
- }
43
- })();
44
-
45
- // end include: minimum_runtime_check.js
46
8
  // The Module object: Our interface to the outside world. We import
47
9
  // and export values on it. There are various ways Module can be used:
48
10
  // 1. Not defined. We create it here
@@ -58,16 +20,24 @@ async function Module(moduleArg = {}) {
58
20
  // can continue to use Module afterwards as well.
59
21
  var Module = moduleArg;
60
22
 
23
+ // Set up the promise that indicates the Module is initialized
24
+ var readyPromiseResolve, readyPromiseReject;
25
+
26
+ var readyPromise = new Promise((resolve, reject) => {
27
+ readyPromiseResolve = resolve;
28
+ readyPromiseReject = reject;
29
+ });
30
+
61
31
  // Determine the runtime environment we are in. You can customize this by
62
32
  // setting the ENVIRONMENT setting at compile time (see settings.js).
63
33
  // Attempt to auto-detect the environment
64
- var ENVIRONMENT_IS_WEB = !!globalThis.window;
34
+ var ENVIRONMENT_IS_WEB = typeof window == "object";
65
35
 
66
- var ENVIRONMENT_IS_WORKER = !!globalThis.WorkerGlobalScope;
36
+ var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != "undefined";
67
37
 
68
38
  // N.b. Electron.js environment is simultaneously a NODE-environment, but
69
39
  // also a web environment.
70
- var ENVIRONMENT_IS_NODE = globalThis.process?.versions?.node && globalThis.process?.type != "renderer";
40
+ var ENVIRONMENT_IS_NODE = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string" && process.type != "renderer";
71
41
 
72
42
  var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
73
43
 
@@ -86,7 +56,7 @@ if (ENVIRONMENT_IS_PTHREAD) {
86
56
 
87
57
  // --pre-jses are emitted after the Module integration code, so that they can
88
58
  // refer to Module (if they choose; they can also define Module)
89
- // include: /var/folders/49/x629zf3j4jd1nq2_dndmhc340000gn/T/popcorn-swm.ANkseGitYY/atomvm/src/platforms/emscripten/src/atomvm.pre.js
59
+ // include: /tmp/popcorn-swm.0jor1PP/atomvm/src/platforms/emscripten/src/atomvm.pre.js
90
60
  /*
91
61
  * This file is part of AtomVM.
92
62
  *
@@ -158,7 +128,7 @@ function ensureValidResult(result) {
158
128
  throw new Error(message);
159
129
  }
160
130
 
161
- // end include: /var/folders/49/x629zf3j4jd1nq2_dndmhc340000gn/T/popcorn-swm.ANkseGitYY/atomvm/src/platforms/emscripten/src/atomvm.pre.js
131
+ // end include: /tmp/popcorn-swm.0jor1PP/atomvm/src/platforms/emscripten/src/atomvm.pre.js
162
132
  var arguments_ = [];
163
133
 
164
134
  var thisProgram = "./this.program";
@@ -182,14 +152,16 @@ function locateFile(path) {
182
152
  // Hooks that are implemented differently in different runtime environments.
183
153
  var readAsync, readBinary;
184
154
 
185
- if (ENVIRONMENT_IS_SHELL) ; else // Note that this includes Node.js workers when relevant (pthreads is enabled).
155
+ if (ENVIRONMENT_IS_SHELL) {
156
+ if ((typeof process == "object" && typeof require === "function") || typeof window == "object" || typeof WorkerGlobalScope != "undefined") throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");
157
+ } else // Note that this includes Node.js workers when relevant (pthreads is enabled).
186
158
  // Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
187
159
  // ENVIRONMENT_IS_NODE.
188
160
  if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
189
161
  try {
190
162
  scriptDirectory = new URL(".", _scriptName).href;
191
163
  } catch {}
192
- if (!(globalThis.window || globalThis.WorkerGlobalScope)) throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");
164
+ if (!(typeof window == "object" || typeof WorkerGlobalScope != "undefined")) throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");
193
165
  {
194
166
  // include: web_or_worker_shell_read.js
195
167
  if (ENVIRONMENT_IS_WORKER) {
@@ -220,6 +192,8 @@ var out = console.log.bind(console);
220
192
 
221
193
  var err = console.error.bind(console);
222
194
 
195
+ var WORKERFS = "WORKERFS is no longer included by default; build with -lworkerfs.js";
196
+
223
197
  // perform assertions in shell.js after we set up out() and err(), as otherwise
224
198
  // if an assertion fails it cannot print the message
225
199
  assert(ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER || ENVIRONMENT_IS_NODE, "Pthreads do not work in this environment yet (need Web Workers, or an alternative to them)");
@@ -240,11 +214,13 @@ assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at bui
240
214
  // is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
241
215
  var wasmBinary;
242
216
 
243
- if (!globalThis.WebAssembly) {
217
+ if (typeof WebAssembly != "object") {
244
218
  err("no native wasm support detected");
245
219
  }
246
220
 
247
221
  // Wasm globals
222
+ var wasmMemory;
223
+
248
224
  // For sending to workers.
249
225
  var wasmModule;
250
226
 
@@ -272,12 +248,18 @@ var EXITSTATUS;
272
248
 
273
249
  // We used to include malloc/free by default in the past. Show a helpful error in
274
250
  // builds with assertions.
251
+ // Memory management
252
+ var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /* BigInt64Array type is not correctly defined in closure
253
+ /** not-@type {!BigInt64Array} */ HEAP64, /** @type {!Float64Array} */ HEAPF64;
254
+
255
+ var runtimeInitialized = false;
256
+
275
257
  /**
276
258
  * Indicates whether filename is delivered via file protocol (as opposed to http/https)
277
259
  * @noinline
278
260
  */ var isFileURI = filename => filename.startsWith("file://");
279
261
 
280
- // include: runtime_common.js
262
+ // include: runtime_shared.js
281
263
  // include: runtime_stack_check.js
282
264
  // Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
283
265
  function writeStackCookie() {
@@ -292,9 +274,9 @@ function writeStackCookie() {
292
274
  // The stack grow downwards towards _emscripten_stack_get_end.
293
275
  // We write cookies to the final two words in the stack and detect if they are
294
276
  // ever overwritten.
295
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((max) >> 2), "storing")] = 34821223;
277
+ SAFE_HEAP_STORE(((max) >> 2) * 4, 34821223, 4);
296
278
  checkInt32(34821223);
297
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((max) + (4)) >> 2), "storing")] = 2310721022;
279
+ SAFE_HEAP_STORE((((max) + (4)) >> 2) * 4, 2310721022, 4);
298
280
  checkInt32(2310721022);
299
281
  }
300
282
 
@@ -305,8 +287,8 @@ function checkStackCookie() {
305
287
  if (max == 0) {
306
288
  max += 4;
307
289
  }
308
- var cookie1 = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((max) >> 2), "loading")];
309
- var cookie2 = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((max) + (4)) >> 2), "loading")];
290
+ var cookie1 = SAFE_HEAP_LOAD(((max) >> 2) * 4, 4, 1);
291
+ var cookie2 = SAFE_HEAP_LOAD((((max) + (4)) >> 2) * 4, 4, 1);
310
292
  if (cookie1 != 34821223 || cookie2 != 2310721022) {
311
293
  abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`);
312
294
  }
@@ -325,7 +307,7 @@ function dbg(...args) {
325
307
  var h16 = new Int16Array(1);
326
308
  var h8 = new Int8Array(h16.buffer);
327
309
  h16[0] = 25459;
328
- if (h8[0] !== 115 || h8[1] !== 99) abort("Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)");
310
+ if (h8[0] !== 115 || h8[1] !== 99) throw "Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)";
329
311
  })();
330
312
 
331
313
  function consumedModuleProp(prop) {
@@ -339,10 +321,6 @@ function consumedModuleProp(prop) {
339
321
  }
340
322
  }
341
323
 
342
- function makeInvalidEarlyAccess(name) {
343
- return () => assert(false, `call to '${name}' via reference taken before Wasm module initialization`);
344
- }
345
-
346
324
  function ignoredModuleProp(prop) {
347
325
  if (Object.getOwnPropertyDescriptor(Module, prop)) {
348
326
  abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`);
@@ -351,11 +329,54 @@ function ignoredModuleProp(prop) {
351
329
 
352
330
  // forcing the filesystem exports a few things by default
353
331
  function isExportedByForceFilesystem(name) {
354
- return name === "FS_createPath" || name === "FS_createDataFile" || name === "FS_createPreloadedFile" || name === "FS_preloadFile" || name === "FS_unlink" || name === "addRunDependency" || // The old FS has some functionality that WasmFS lacks.
332
+ return name === "FS_createPath" || name === "FS_createDataFile" || name === "FS_createPreloadedFile" || name === "FS_unlink" || name === "addRunDependency" || // The old FS has some functionality that WasmFS lacks.
355
333
  name === "FS_createLazyFile" || name === "FS_createDevice" || name === "removeRunDependency";
356
334
  }
357
335
 
336
+ /**
337
+ * Intercept access to a global symbol. This enables us to give informative
338
+ * warnings/errors when folks attempt to use symbols they did not include in
339
+ * their build, or no symbols that no longer exist.
340
+ */ function hookGlobalSymbolAccess(sym, func) {
341
+ if (typeof globalThis != "undefined" && !Object.getOwnPropertyDescriptor(globalThis, sym)) {
342
+ Object.defineProperty(globalThis, sym, {
343
+ configurable: true,
344
+ get() {
345
+ func();
346
+ return undefined;
347
+ }
348
+ });
349
+ }
350
+ }
351
+
352
+ function missingGlobal(sym, msg) {
353
+ hookGlobalSymbolAccess(sym, () => {
354
+ warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`);
355
+ });
356
+ }
357
+
358
+ missingGlobal("buffer", "Please use HEAP8.buffer or wasmMemory.buffer");
359
+
360
+ missingGlobal("asm", "Please use wasmExports instead");
361
+
358
362
  function missingLibrarySymbol(sym) {
363
+ hookGlobalSymbolAccess(sym, () => {
364
+ // Can't `abort()` here because it would break code that does runtime
365
+ // checks. e.g. `if (typeof SDL === 'undefined')`.
366
+ var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`;
367
+ // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in
368
+ // library.js, which means $name for a JS name with no prefix, or name
369
+ // for a JS name like _name.
370
+ var librarySymbol = sym;
371
+ if (!librarySymbol.startsWith("_")) {
372
+ librarySymbol = "$" + sym;
373
+ }
374
+ msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`;
375
+ if (isExportedByForceFilesystem(sym)) {
376
+ msg += ". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you";
377
+ }
378
+ warnOnce(msg);
379
+ });
359
380
  // Any symbol that is not included from the JS library is also (by definition)
360
381
  // not exported on the Module object.
361
382
  unexportedRuntimeSymbol(sym);
@@ -427,19 +448,64 @@ var checkInt32 = value => checkInt(value, 32, MIN_INT32, MAX_UINT32);
427
448
  var checkInt64 = value => checkInt(value, 64, MIN_INT64, MAX_UINT64);
428
449
 
429
450
  // end include: runtime_debug.js
451
+ // include: memoryprofiler.js
452
+ // end include: memoryprofiler.js
430
453
  // include: runtime_safe_heap.js
431
- function SAFE_HEAP_INDEX(arr, idx, action) {
432
- const bytes = arr.BYTES_PER_ELEMENT;
433
- const dest = idx * bytes;
434
- if (idx <= 0) abort(`segmentation fault ${action} ${bytes} bytes at address ${dest}`);
454
+ /** @param {number|boolean=} isFloat */ function getSafeHeapType(bytes, isFloat) {
455
+ switch (bytes) {
456
+ case 1:
457
+ return "i8";
458
+
459
+ case 2:
460
+ return "i16";
461
+
462
+ case 4:
463
+ return isFloat ? "float" : "i32";
464
+
465
+ case 8:
466
+ return isFloat ? "double" : "i64";
467
+
468
+ default:
469
+ abort(`getSafeHeapType() invalid bytes=${bytes}`);
470
+ }
471
+ }
472
+
473
+ /** @param {number|boolean=} isFloat */ function SAFE_HEAP_STORE(dest, value, bytes, isFloat) {
474
+ if (dest <= 0) abort(`segmentation fault storing ${bytes} bytes to address ${dest}`);
475
+ if (dest % bytes !== 0) abort(`alignment error storing to address ${dest}, which was expected to be aligned to a multiple of ${bytes}`);
435
476
  if (runtimeInitialized) {
436
477
  var brk = _sbrk(0);
437
- if (dest + bytes > brk) abort(`segmentation fault, exceeded the top of the available dynamic heap when ${action} ${bytes} bytes at address ${dest}. DYNAMICTOP=${brk}`);
478
+ if (dest + bytes > brk) abort(`segmentation fault, exceeded the top of the available dynamic heap when storing ${bytes} bytes to address ${dest}. DYNAMICTOP=${brk}`);
438
479
  if (brk < _emscripten_stack_get_base()) abort(`brk >= _emscripten_stack_get_base() (brk=${brk}, _emscripten_stack_get_base()=${_emscripten_stack_get_base()})`);
439
480
  // sbrk-managed memory must be above the stack
440
481
  if (brk > wasmMemory.buffer.byteLength) abort(`brk <= wasmMemory.buffer.byteLength (brk=${brk}, wasmMemory.buffer.byteLength=${wasmMemory.buffer.byteLength})`);
441
482
  }
442
- return idx;
483
+ setValue_safe(dest, value, getSafeHeapType(bytes, isFloat));
484
+ return value;
485
+ }
486
+
487
+ function SAFE_HEAP_STORE_D(dest, value, bytes) {
488
+ return SAFE_HEAP_STORE(dest, value, bytes, true);
489
+ }
490
+
491
+ /** @param {number|boolean=} isFloat */ function SAFE_HEAP_LOAD(dest, bytes, unsigned, isFloat) {
492
+ if (dest <= 0) abort(`segmentation fault loading ${bytes} bytes from address ${dest}`);
493
+ if (dest % bytes !== 0) abort(`alignment error loading from address ${dest}, which was expected to be aligned to a multiple of ${bytes}`);
494
+ if (runtimeInitialized) {
495
+ var brk = _sbrk(0);
496
+ if (dest + bytes > brk) abort(`segmentation fault, exceeded the top of the available dynamic heap when loading ${bytes} bytes from address ${dest}. DYNAMICTOP=${brk}`);
497
+ if (brk < _emscripten_stack_get_base()) abort(`brk >= _emscripten_stack_get_base() (brk=${brk}, _emscripten_stack_get_base()=${_emscripten_stack_get_base()})`);
498
+ // sbrk-managed memory must be above the stack
499
+ if (brk > wasmMemory.buffer.byteLength) abort(`brk <= wasmMemory.buffer.byteLength (brk=${brk}, wasmMemory.buffer.byteLength=${wasmMemory.buffer.byteLength})`);
500
+ }
501
+ var type = getSafeHeapType(bytes, isFloat);
502
+ var ret = getValue_safe(dest, type);
503
+ if (unsigned) ret = unSign(ret, parseInt(type.slice(1), 10));
504
+ return ret;
505
+ }
506
+
507
+ function SAFE_HEAP_LOAD_D(dest, bytes, unsigned) {
508
+ return SAFE_HEAP_LOAD(dest, bytes, unsigned, true);
443
509
  }
444
510
 
445
511
  function segfault() {
@@ -451,7 +517,7 @@ function alignfault() {
451
517
  }
452
518
 
453
519
  // end include: runtime_safe_heap.js
454
- var readyPromiseResolve, readyPromiseReject;
520
+ var wasmModuleReceived;
455
521
 
456
522
  // include: runtime_pthread.js
457
523
  // Pthread Web Worker handling code.
@@ -461,8 +527,6 @@ var readyPromiseResolve, readyPromiseReject;
461
527
  // including the main thread).
462
528
  var workerID = 0;
463
529
 
464
- var startWorker;
465
-
466
530
  if (ENVIRONMENT_IS_PTHREAD) {
467
531
  // Thread-local guard variable for one-time init of the JS state
468
532
  var initializedJS = false;
@@ -483,7 +547,7 @@ if (ENVIRONMENT_IS_PTHREAD) {
483
547
  let messageQueue = [];
484
548
  self.onmessage = e => messageQueue.push(e);
485
549
  // And add a callback for when the runtime is initialized.
486
- startWorker = () => {
550
+ self.startWorker = instance => {
487
551
  // Notify the main thread that this thread has loaded.
488
552
  postMessage({
489
553
  cmd: "loaded"
@@ -516,9 +580,7 @@ if (ENVIRONMENT_IS_PTHREAD) {
516
580
  }
517
581
  wasmMemory = msgData.wasmMemory;
518
582
  updateMemoryViews();
519
- wasmModule = msgData.wasmModule;
520
- createWasm();
521
- run();
583
+ wasmModuleReceived(msgData.wasmModule);
522
584
  } else if (cmd === "run") {
523
585
  assert(msgData.pthread_ptr);
524
586
  // Call inside JS module to set up the stack frame for this pthread in JS module scope.
@@ -567,14 +629,6 @@ if (ENVIRONMENT_IS_PTHREAD) {
567
629
 
568
630
  // ENVIRONMENT_IS_PTHREAD
569
631
  // end include: runtime_pthread.js
570
- // Memory management
571
- var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float64Array} */ HEAPF64;
572
-
573
- // BigInt64Array type is not correctly defined in closure
574
- var /** not-@type {!BigInt64Array} */ HEAP64;
575
-
576
- var runtimeInitialized = false;
577
-
578
632
  function updateMemoryViews() {
579
633
  var b = wasmMemory.buffer;
580
634
  HEAP8 = new Int8Array(b);
@@ -582,16 +636,18 @@ function updateMemoryViews() {
582
636
  HEAPU8 = new Uint8Array(b);
583
637
  HEAP32 = new Int32Array(b);
584
638
  HEAPU32 = new Uint32Array(b);
639
+ HEAPF32 = new Float32Array(b);
585
640
  HEAPF64 = new Float64Array(b);
586
641
  HEAP64 = new BigInt64Array(b);
587
642
  new BigUint64Array(b);
588
643
  }
589
644
 
645
+ // end include: runtime_shared.js
646
+ assert(typeof Int32Array != "undefined" && typeof Float64Array !== "undefined" && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, "JS engine does not provide full typed array support");
647
+
590
648
  // In non-standalone/normal mode, we create the memory here.
591
649
  // include: runtime_init_memory.js
592
650
  // Create the wasm memory. (Note: this only applies if IMPORTED_MEMORY is defined)
593
- var wasmMemory;
594
-
595
651
  // check for full engine support (use string 'subarray' to avoid closure compiler confusion)
596
652
  function initMemory() {
597
653
  if ((ENVIRONMENT_IS_PTHREAD)) {
@@ -612,11 +668,6 @@ function initMemory() {
612
668
  }
613
669
 
614
670
  // end include: runtime_init_memory.js
615
- // include: memoryprofiler.js
616
- // end include: memoryprofiler.js
617
- // end include: runtime_common.js
618
- assert(globalThis.Int32Array && globalThis.Float64Array && Int32Array.prototype.subarray && Int32Array.prototype.set, "JS engine does not provide full typed array support");
619
-
620
671
  function preRun() {
621
672
  assert(!ENVIRONMENT_IS_PTHREAD);
622
673
  // PThreads reuse the runtime from the main thread.
@@ -634,7 +685,7 @@ function preRun() {
634
685
  function initRuntime() {
635
686
  assert(!runtimeInitialized);
636
687
  runtimeInitialized = true;
637
- if (ENVIRONMENT_IS_PTHREAD) return startWorker();
688
+ if (ENVIRONMENT_IS_PTHREAD) return startWorker(Module);
638
689
  checkStackCookie();
639
690
  // Begin ATINITS hooks
640
691
  if (!Module["noFSInit"] && !FS.initialized) FS.init();
@@ -666,6 +717,84 @@ function postRun() {
666
717
  callRuntimeCallbacks(onPostRuns);
667
718
  }
668
719
 
720
+ // A counter of dependencies for calling run(). If we need to
721
+ // do asynchronous work before running, increment this and
722
+ // decrement it. Incrementing must happen in a place like
723
+ // Module.preRun (used by emcc to add file preloading).
724
+ // Note that you can add dependencies in preRun, even though
725
+ // it happens right before run - run will be postponed until
726
+ // the dependencies are met.
727
+ var runDependencies = 0;
728
+
729
+ var dependenciesFulfilled = null;
730
+
731
+ // overridden to take different actions when all run dependencies are fulfilled
732
+ var runDependencyTracking = {};
733
+
734
+ var runDependencyWatcher = null;
735
+
736
+ function getUniqueRunDependency(id) {
737
+ var orig = id;
738
+ while (1) {
739
+ if (!runDependencyTracking[id]) return id;
740
+ id = orig + Math.random();
741
+ }
742
+ }
743
+
744
+ function addRunDependency(id) {
745
+ runDependencies++;
746
+ Module["monitorRunDependencies"]?.(runDependencies);
747
+ if (id) {
748
+ assert(!runDependencyTracking[id]);
749
+ runDependencyTracking[id] = 1;
750
+ if (runDependencyWatcher === null && typeof setInterval != "undefined") {
751
+ // Check for missing dependencies every few seconds
752
+ runDependencyWatcher = setInterval(() => {
753
+ if (ABORT) {
754
+ clearInterval(runDependencyWatcher);
755
+ runDependencyWatcher = null;
756
+ return;
757
+ }
758
+ var shown = false;
759
+ for (var dep in runDependencyTracking) {
760
+ if (!shown) {
761
+ shown = true;
762
+ err("still waiting on run dependencies:");
763
+ }
764
+ err(`dependency: ${dep}`);
765
+ }
766
+ if (shown) {
767
+ err("(end of list)");
768
+ }
769
+ }, 1e4);
770
+ }
771
+ } else {
772
+ err("warning: run dependency added without ID");
773
+ }
774
+ }
775
+
776
+ function removeRunDependency(id) {
777
+ runDependencies--;
778
+ Module["monitorRunDependencies"]?.(runDependencies);
779
+ if (id) {
780
+ assert(runDependencyTracking[id]);
781
+ delete runDependencyTracking[id];
782
+ } else {
783
+ err("warning: run dependency removed without ID");
784
+ }
785
+ if (runDependencies == 0) {
786
+ if (runDependencyWatcher !== null) {
787
+ clearInterval(runDependencyWatcher);
788
+ runDependencyWatcher = null;
789
+ }
790
+ if (dependenciesFulfilled) {
791
+ var callback = dependenciesFulfilled;
792
+ dependenciesFulfilled = null;
793
+ callback();
794
+ }
795
+ }
796
+ }
797
+
669
798
  /** @param {string|number=} what */ function abort(what) {
670
799
  Module["onAbort"]?.(what);
671
800
  what = "Aborted(" + what + ")";
@@ -686,7 +815,7 @@ function postRun() {
686
815
  // though it can.
687
816
  // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.
688
817
  /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what);
689
- readyPromiseReject?.(e);
818
+ readyPromiseReject(e);
690
819
  // Throw the error whether or not MODULARIZE is set because abort is used
691
820
  // in code paths apart from instantiation where an exception is expected
692
821
  // to be thrown when abort is called.
@@ -721,8 +850,6 @@ function getBinarySync(file) {
721
850
  if (readBinary) {
722
851
  return readBinary(file);
723
852
  }
724
- // Throwing a plain string here, even though it not normally adviables since
725
- // this gets turning into an `abort` in instantiateArrayBuffer.
726
853
  throw "both async and sync fetching of the wasm failed";
727
854
  }
728
855
 
@@ -747,15 +874,15 @@ async function instantiateArrayBuffer(binaryFile, imports) {
747
874
  } catch (reason) {
748
875
  err(`failed to asynchronously prepare wasm: ${reason}`);
749
876
  // Warn on some common problems.
750
- if (isFileURI(binaryFile)) {
751
- err(`warning: Loading from a file URI (${binaryFile}) 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`);
877
+ if (isFileURI(wasmBinaryFile)) {
878
+ 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`);
752
879
  }
753
880
  abort(reason);
754
881
  }
755
882
  }
756
883
 
757
884
  async function instantiateAsync(binary, binaryFile, imports) {
758
- if (!binary) {
885
+ if (!binary && typeof WebAssembly.instantiateStreaming == "function") {
759
886
  try {
760
887
  var response = fetch(binaryFile, {
761
888
  credentials: "same-origin"
@@ -790,11 +917,13 @@ async function createWasm() {
790
917
  /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) {
791
918
  wasmExports = instance.exports;
792
919
  registerTLSInit(wasmExports["_emscripten_tls_init"]);
793
- assignWasmExports(wasmExports);
794
920
  // We now have the Wasm module loaded up, keep a reference to the compiled module so we can post it to the workers.
795
921
  wasmModule = module;
922
+ removeRunDependency("wasm-instantiate");
796
923
  return wasmExports;
797
924
  }
925
+ // wait for the pthread pool (if any)
926
+ addRunDependency("wasm-instantiate");
798
927
  // Prefer streaming instantiation if available.
799
928
  // Async compilation can be confusing when an error on the page overwrites Module
800
929
  // (for example, if the order of elements is wrong, and the one defining Module is
@@ -817,8 +946,8 @@ async function createWasm() {
817
946
  if (Module["instantiateWasm"]) {
818
947
  return new Promise((resolve, reject) => {
819
948
  try {
820
- Module["instantiateWasm"](info, (inst, mod) => {
821
- resolve(receiveInstance(inst, mod));
949
+ Module["instantiateWasm"](info, (mod, inst) => {
950
+ resolve(receiveInstance(mod, inst));
822
951
  });
823
952
  } catch (e) {
824
953
  err(`Module.instantiateWasm callback failed with error: ${e}`);
@@ -827,16 +956,25 @@ async function createWasm() {
827
956
  });
828
957
  }
829
958
  if ((ENVIRONMENT_IS_PTHREAD)) {
830
- // Instantiate from the module that was recieved via postMessage from
831
- // the main thread. We can just use sync instantiation in the worker.
832
- assert(wasmModule, "wasmModule should have been received via postMessage");
833
- var instance = new WebAssembly.Instance(wasmModule, getWasmImports());
834
- return receiveInstance(instance, wasmModule);
959
+ return new Promise(resolve => {
960
+ wasmModuleReceived = module => {
961
+ // Instantiate from the module posted from the main thread.
962
+ // We can just use sync instantiation in the worker.
963
+ var instance = new WebAssembly.Instance(module, getWasmImports());
964
+ resolve(receiveInstance(instance, module));
965
+ };
966
+ });
835
967
  }
836
968
  wasmBinaryFile ??= findWasmBinary();
837
- var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
838
- var exports$1 = receiveInstantiationResult(result);
839
- return exports$1;
969
+ try {
970
+ var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
971
+ var exports$1 = receiveInstantiationResult(result);
972
+ return exports$1;
973
+ } catch (e) {
974
+ // If instantiation fails, reject the module ready promise.
975
+ readyPromiseReject(e);
976
+ return Promise.reject(e);
977
+ }
840
978
  }
841
979
 
842
980
  // end include: preamble.js
@@ -940,15 +1078,15 @@ var stackAlloc = sz => __emscripten_stack_alloc(sz);
940
1078
  var arg = callArgs[i];
941
1079
  if (typeof arg == "bigint") {
942
1080
  // The prefix is non-zero to indicate a bigint.
943
- HEAP64[SAFE_HEAP_INDEX(HEAP64, b + 2 * i, "storing")] = 1n;
944
- HEAP64[SAFE_HEAP_INDEX(HEAP64, b + 2 * i + 1, "storing")] = arg;
1081
+ HEAP64[b + 2 * i] = 1n;
1082
+ HEAP64[b + 2 * i + 1] = arg;
945
1083
  } else {
946
1084
  // The prefix is zero to indicate a JS Number.
947
- HEAP64[SAFE_HEAP_INDEX(HEAP64, b + 2 * i, "storing")] = 0n;
948
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, b + 2 * i + 1, "storing")] = arg;
1085
+ HEAP64[b + 2 * i] = 0n;
1086
+ SAFE_HEAP_STORE_D((b + 2 * i + 1) * 8, arg, 8);
949
1087
  }
950
1088
  }
951
- var rtn = __emscripten_run_js_on_main_thread(funcIndex, emAsmAddr, serializedNumCallArgs, args, sync);
1089
+ var rtn = __emscripten_run_on_main_thread_js(funcIndex, emAsmAddr, serializedNumCallArgs, args, sync);
952
1090
  stackRestore(sp);
953
1091
  return rtn;
954
1092
  };
@@ -991,7 +1129,7 @@ function exitOnMainThread(returnCode) {
991
1129
  // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down
992
1130
  if (keepRuntimeAlive() && !implicit) {
993
1131
  var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;
994
- readyPromiseReject?.(msg);
1132
+ readyPromiseReject(msg);
995
1133
  err(msg);
996
1134
  }
997
1135
  _proc_exit(status);
@@ -1000,8 +1138,8 @@ function exitOnMainThread(returnCode) {
1000
1138
  var _exit = exitJS;
1001
1139
 
1002
1140
  var ptrToString = ptr => {
1003
- assert(typeof ptr === "number", `ptrToString expects a number, got ${typeof ptr}`);
1004
- // Convert to 32-bit unsigned value
1141
+ assert(typeof ptr === "number");
1142
+ // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
1005
1143
  ptr >>>= 0;
1006
1144
  return "0x" + ptr.toString(16).padStart(8, "0");
1007
1145
  };
@@ -1013,8 +1151,18 @@ var PThread = {
1013
1151
  pthreads: {},
1014
1152
  nextWorkerID: 1,
1015
1153
  init() {
1154
+ if ((!(ENVIRONMENT_IS_PTHREAD))) {
1155
+ PThread.initMainThread();
1156
+ }
1157
+ },
1158
+ initMainThread() {
1159
+ // MINIMAL_RUNTIME takes care of calling loadWasmModuleToAllWorkers
1160
+ // in postamble_minimal.js
1161
+ addOnPreRun(() => {
1162
+ addRunDependency("loading-workers");
1163
+ PThread.loadWasmModuleToAllWorkers(() => removeRunDependency("loading-workers"));
1164
+ });
1016
1165
  },
1017
- initMainThread() {},
1018
1166
  terminateAllThreads: () => {
1019
1167
  assert(!ENVIRONMENT_IS_PTHREAD, "Internal Error! terminateAllThreads() can only ever be called from main application thread!");
1020
1168
  // Attempt to kill all workers. Sadly (at least on the web) there is no
@@ -1079,10 +1227,7 @@ var PThread = {
1079
1227
  } else if (cmd === "spawnThread") {
1080
1228
  spawnThread(d);
1081
1229
  } else if (cmd === "cleanupThread") {
1082
- // cleanupThread needs to be run via callUserCallback since it calls
1083
- // back into user code to free thread data. Without this it's possible
1084
- // the unwind or ExitStatus exception could escape here.
1085
- callUserCallback(() => cleanupThread(d.thread));
1230
+ cleanupThread(d.thread);
1086
1231
  } else if (cmd === "loaded") {
1087
1232
  worker.loaded = true;
1088
1233
  onFinishedLoading(worker);
@@ -1127,6 +1272,9 @@ var PThread = {
1127
1272
  "workerID": worker.workerID
1128
1273
  });
1129
1274
  }),
1275
+ loadWasmModuleToAllWorkers(onMaybeReady) {
1276
+ onMaybeReady();
1277
+ },
1130
1278
  allocateUnusedWorker() {
1131
1279
  var worker;
1132
1280
  // If we're using module output, use bundler-friendly pattern.
@@ -1169,9 +1317,9 @@ var onPostRuns = [];
1169
1317
 
1170
1318
  var addOnPostRun = cb => onPostRuns.push(cb);
1171
1319
 
1172
- function establishStackSpace(pthread_ptr) {
1173
- var stackHigh = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((pthread_ptr) + (52)) >> 2), "loading")];
1174
- var stackSize = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((pthread_ptr) + (56)) >> 2), "loading")];
1320
+ var establishStackSpace = pthread_ptr => {
1321
+ var stackHigh = SAFE_HEAP_LOAD((((pthread_ptr) + (52)) >> 2) * 4, 4, 1);
1322
+ var stackSize = SAFE_HEAP_LOAD((((pthread_ptr) + (56)) >> 2) * 4, 4, 1);
1175
1323
  var stackLow = stackHigh - stackSize;
1176
1324
  assert(stackHigh != 0);
1177
1325
  assert(stackLow != 0);
@@ -1184,6 +1332,38 @@ function establishStackSpace(pthread_ptr) {
1184
1332
  // Write the stack cookie last, after we have set up the proper bounds and
1185
1333
  // current position of the stack.
1186
1334
  writeStackCookie();
1335
+ };
1336
+
1337
+ function getValue_safe(ptr, type = "i8") {
1338
+ if (type.endsWith("*")) type = "*";
1339
+ switch (type) {
1340
+ case "i1":
1341
+ return HEAP8[ptr];
1342
+
1343
+ case "i8":
1344
+ return HEAP8[ptr];
1345
+
1346
+ case "i16":
1347
+ return HEAP16[((ptr) >> 1)];
1348
+
1349
+ case "i32":
1350
+ return HEAP32[((ptr) >> 2)];
1351
+
1352
+ case "i64":
1353
+ return HEAP64[((ptr) >> 3)];
1354
+
1355
+ case "float":
1356
+ return HEAPF32[((ptr) >> 2)];
1357
+
1358
+ case "double":
1359
+ return HEAPF64[((ptr) >> 3)];
1360
+
1361
+ case "*":
1362
+ return HEAPU32[((ptr) >> 2)];
1363
+
1364
+ default:
1365
+ abort(`invalid type for getValue: ${type}`);
1366
+ }
1187
1367
  }
1188
1368
 
1189
1369
  var invokeEntryPoint = (ptr, arg) => {
@@ -1210,14 +1390,11 @@ var invokeEntryPoint = (ptr, arg) => {
1210
1390
  var result = (a1 => dynCall_ii(ptr, a1))(arg);
1211
1391
  checkStackCookie();
1212
1392
  function finish(result) {
1213
- // In MINIMAL_RUNTIME the noExitRuntime concept does not apply to
1214
- // pthreads. To exit a pthread with live runtime, use the function
1215
- // emscripten_unwind_to_js_event_loop() in the pthread body.
1216
1393
  if (keepRuntimeAlive()) {
1217
1394
  EXITSTATUS = result;
1218
- return;
1395
+ } else {
1396
+ __emscripten_thread_exit(result);
1219
1397
  }
1220
- __emscripten_thread_exit(result);
1221
1398
  }
1222
1399
  finish(result);
1223
1400
  };
@@ -1230,6 +1407,60 @@ var runtimeKeepalivePush = () => {
1230
1407
  runtimeKeepaliveCounter += 1;
1231
1408
  };
1232
1409
 
1410
+ function setValue_safe(ptr, value, type = "i8") {
1411
+ if (type.endsWith("*")) type = "*";
1412
+ switch (type) {
1413
+ case "i1":
1414
+ HEAP8[ptr] = value;
1415
+ checkInt8(value);
1416
+ break;
1417
+
1418
+ case "i8":
1419
+ HEAP8[ptr] = value;
1420
+ checkInt8(value);
1421
+ break;
1422
+
1423
+ case "i16":
1424
+ HEAP16[((ptr) >> 1)] = value;
1425
+ checkInt16(value);
1426
+ break;
1427
+
1428
+ case "i32":
1429
+ HEAP32[((ptr) >> 2)] = value;
1430
+ checkInt32(value);
1431
+ break;
1432
+
1433
+ case "i64":
1434
+ HEAP64[((ptr) >> 3)] = BigInt(value);
1435
+ checkInt64(value);
1436
+ break;
1437
+
1438
+ case "float":
1439
+ HEAPF32[((ptr) >> 2)] = value;
1440
+ break;
1441
+
1442
+ case "double":
1443
+ HEAPF64[((ptr) >> 3)] = value;
1444
+ break;
1445
+
1446
+ case "*":
1447
+ HEAPU32[((ptr) >> 2)] = value;
1448
+ break;
1449
+
1450
+ default:
1451
+ abort(`invalid type for setValue: ${type}`);
1452
+ }
1453
+ }
1454
+
1455
+ var unSign = (value, bits) => {
1456
+ if (value >= 0) {
1457
+ return value;
1458
+ }
1459
+ // Need some trickery, since if bits == 32, we are right at the limit of the
1460
+ // bits JS uses in bitshifts
1461
+ return bits <= 32 ? 2 * Math.abs(1 << (bits - 1)) + value : Math.pow(2, bits) + value;
1462
+ };
1463
+
1233
1464
  var warnOnce = text => {
1234
1465
  warnOnce.shown ||= {};
1235
1466
  if (!warnOnce.shown[text]) {
@@ -1238,17 +1469,7 @@ var warnOnce = text => {
1238
1469
  }
1239
1470
  };
1240
1471
 
1241
- var UTF8Decoder = globalThis.TextDecoder && new TextDecoder;
1242
-
1243
- var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => {
1244
- var maxIdx = idx + maxBytesToRead;
1245
- // TextDecoder needs to know the byte length in advance, it doesn't stop on
1246
- // null terminator by itself.
1247
- // As a tiny code save trick, compare idx against maxIdx using a negation,
1248
- // so that maxBytesToRead=undefined/NaN means Infinity.
1249
- while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx;
1250
- return idx;
1251
- };
1472
+ var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder : undefined;
1252
1473
 
1253
1474
  /**
1254
1475
  * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given
@@ -1257,15 +1478,22 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => {
1257
1478
  * heapOrArray is either a regular array, or a JavaScript typed array view.
1258
1479
  * @param {number=} idx
1259
1480
  * @param {number=} maxBytesToRead
1260
- * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character.
1261
1481
  * @return {string}
1262
- */ var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => {
1263
- var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead);
1264
- // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it.
1482
+ */ var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => {
1483
+ var endIdx = idx + maxBytesToRead;
1484
+ var endPtr = idx;
1485
+ // TextDecoder needs to know the byte length in advance, it doesn't stop on
1486
+ // null terminator by itself. Also, use the length info to avoid running tiny
1487
+ // strings through TextDecoder, since .subarray() allocates garbage.
1488
+ // (As a tiny code save trick, compare endPtr against endIdx using a negation,
1489
+ // so that undefined/NaN means Infinity)
1490
+ while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
1265
1491
  if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
1266
1492
  return UTF8Decoder.decode(heapOrArray.buffer instanceof ArrayBuffer ? heapOrArray.subarray(idx, endPtr) : heapOrArray.slice(idx, endPtr));
1267
1493
  }
1268
1494
  var str = "";
1495
+ // If building with TextDecoder, we have already computed the string length
1496
+ // above, so test loop end condition against that
1269
1497
  while (idx < endPtr) {
1270
1498
  // For UTF8 byte structure, see:
1271
1499
  // http://en.wikipedia.org/wiki/UTF-8#Description
@@ -1307,10 +1535,12 @@ var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => {
1307
1535
  * maximum number of bytes to read. You can omit this parameter to scan the
1308
1536
  * string until the first 0 byte. If maxBytesToRead is passed, and the string
1309
1537
  * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the
1310
- * string will cut short at that byte index.
1311
- * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character.
1538
+ * string will cut short at that byte index (i.e. maxBytesToRead will not
1539
+ * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing
1540
+ * frequent uses of UTF8ToString() with and without maxBytesToRead may throw
1541
+ * JS JIT optimizations off, so it is worth to consider consistently using one
1312
1542
  * @return {string}
1313
- */ var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => {
1543
+ */ var UTF8ToString = (ptr, maxBytesToRead) => {
1314
1544
  assert(typeof ptr == "number", `UTF8ToString expects a number (got ${typeof ptr})`);
1315
1545
  return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
1316
1546
  };
@@ -1322,7 +1552,7 @@ function pthreadCreateProxied(pthread_ptr, attr, startRoutine, arg) {
1322
1552
  return ___pthread_create_js(pthread_ptr, attr, startRoutine, arg);
1323
1553
  }
1324
1554
 
1325
- var _emscripten_has_threading_support = () => !!globalThis.SharedArrayBuffer;
1555
+ var _emscripten_has_threading_support = () => typeof SharedArrayBuffer != "undefined";
1326
1556
 
1327
1557
  var ___pthread_create_js = (pthread_ptr, attr, startRoutine, arg) => {
1328
1558
  if (!_emscripten_has_threading_support()) {
@@ -1511,10 +1741,19 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1511
1741
  var endIdx = outIdx + maxBytesToWrite - 1;
1512
1742
  // -1 for string null terminator.
1513
1743
  for (var i = 0; i < str.length; ++i) {
1744
+ // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
1745
+ // unit, not a Unicode code point of the character! So decode
1746
+ // UTF16->UTF32->UTF8.
1747
+ // See http://unicode.org/faq/utf_bom.html#utf16-3
1514
1748
  // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description
1515
1749
  // and https://www.ietf.org/rfc/rfc2279.txt
1516
1750
  // and https://tools.ietf.org/html/rfc3629
1517
- var u = str.codePointAt(i);
1751
+ var u = str.charCodeAt(i);
1752
+ // possibly a lead surrogate
1753
+ if (u >= 55296 && u <= 57343) {
1754
+ var u1 = str.charCodeAt(++i);
1755
+ u = 65536 + ((u & 1023) << 10) | (u1 & 1023);
1756
+ }
1518
1757
  if (u <= 127) {
1519
1758
  if (outIdx >= endIdx) break;
1520
1759
  heap[outIdx++] = u;
@@ -1534,9 +1773,6 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1534
1773
  heap[outIdx++] = 128 | ((u >> 12) & 63);
1535
1774
  heap[outIdx++] = 128 | ((u >> 6) & 63);
1536
1775
  heap[outIdx++] = 128 | (u & 63);
1537
- // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16.
1538
- // We need to manually skip over the second code unit for correct iteration.
1539
- i++;
1540
1776
  }
1541
1777
  }
1542
1778
  // Null-terminate the pointer to the buffer.
@@ -1555,7 +1791,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1555
1791
  var FS_stdin_getChar = () => {
1556
1792
  if (!FS_stdin_getChar_buffer.length) {
1557
1793
  var result = null;
1558
- if (globalThis.window?.prompt) {
1794
+ if (typeof window != "undefined" && typeof window.prompt == "function") {
1559
1795
  // Browser.
1560
1796
  result = window.prompt("Input: ");
1561
1797
  // returns null on cancel
@@ -2022,6 +2258,61 @@ var MEMFS = {
2022
2258
  }
2023
2259
  };
2024
2260
 
2261
+ var asyncLoad = async url => {
2262
+ var arrayBuffer = await readAsync(url);
2263
+ assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`);
2264
+ return new Uint8Array(arrayBuffer);
2265
+ };
2266
+
2267
+ var FS_createDataFile = (...args) => FS.createDataFile(...args);
2268
+
2269
+ var preloadPlugins = [];
2270
+
2271
+ var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => {
2272
+ // Ensure plugins are ready.
2273
+ if (typeof Browser != "undefined") Browser.init();
2274
+ var handled = false;
2275
+ preloadPlugins.forEach(plugin => {
2276
+ if (handled) return;
2277
+ if (plugin["canHandle"](fullname)) {
2278
+ plugin["handle"](byteArray, fullname, finish, onerror);
2279
+ handled = true;
2280
+ }
2281
+ });
2282
+ return handled;
2283
+ };
2284
+
2285
+ var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => {
2286
+ // TODO we should allow people to just pass in a complete filename instead
2287
+ // of parent and name being that we just join them anyways
2288
+ var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
2289
+ var dep = getUniqueRunDependency(`cp ${fullname}`);
2290
+ // might have several active requests for the same fullname
2291
+ function processData(byteArray) {
2292
+ function finish(byteArray) {
2293
+ preFinish?.();
2294
+ if (!dontCreateFile) {
2295
+ FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
2296
+ }
2297
+ onload?.();
2298
+ removeRunDependency(dep);
2299
+ }
2300
+ if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => {
2301
+ onerror?.();
2302
+ removeRunDependency(dep);
2303
+ })) {
2304
+ return;
2305
+ }
2306
+ finish(byteArray);
2307
+ }
2308
+ addRunDependency(dep);
2309
+ if (typeof url == "string") {
2310
+ asyncLoad(url).then(processData, onerror);
2311
+ } else {
2312
+ processData(url);
2313
+ }
2314
+ };
2315
+
2025
2316
  var FS_modeStringToFlags = str => {
2026
2317
  var flagModes = {
2027
2318
  "r": 0,
@@ -2316,120 +2607,6 @@ var ERRNO_CODES = {
2316
2607
  "ESTRPIPE": 135
2317
2608
  };
2318
2609
 
2319
- var asyncLoad = async url => {
2320
- var arrayBuffer = await readAsync(url);
2321
- assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`);
2322
- return new Uint8Array(arrayBuffer);
2323
- };
2324
-
2325
- var FS_createDataFile = (...args) => FS.createDataFile(...args);
2326
-
2327
- var getUniqueRunDependency = id => {
2328
- var orig = id;
2329
- while (1) {
2330
- if (!runDependencyTracking[id]) return id;
2331
- id = orig + Math.random();
2332
- }
2333
- };
2334
-
2335
- var runDependencies = 0;
2336
-
2337
- var dependenciesFulfilled = null;
2338
-
2339
- var runDependencyTracking = {};
2340
-
2341
- var runDependencyWatcher = null;
2342
-
2343
- var removeRunDependency = id => {
2344
- runDependencies--;
2345
- Module["monitorRunDependencies"]?.(runDependencies);
2346
- assert(id, "removeRunDependency requires an ID");
2347
- assert(runDependencyTracking[id]);
2348
- delete runDependencyTracking[id];
2349
- if (runDependencies == 0) {
2350
- if (runDependencyWatcher !== null) {
2351
- clearInterval(runDependencyWatcher);
2352
- runDependencyWatcher = null;
2353
- }
2354
- if (dependenciesFulfilled) {
2355
- var callback = dependenciesFulfilled;
2356
- dependenciesFulfilled = null;
2357
- callback();
2358
- }
2359
- }
2360
- };
2361
-
2362
- var addRunDependency = id => {
2363
- runDependencies++;
2364
- Module["monitorRunDependencies"]?.(runDependencies);
2365
- assert(id, "addRunDependency requires an ID");
2366
- assert(!runDependencyTracking[id]);
2367
- runDependencyTracking[id] = 1;
2368
- if (runDependencyWatcher === null && globalThis.setInterval) {
2369
- // Check for missing dependencies every few seconds
2370
- runDependencyWatcher = setInterval(() => {
2371
- if (ABORT) {
2372
- clearInterval(runDependencyWatcher);
2373
- runDependencyWatcher = null;
2374
- return;
2375
- }
2376
- var shown = false;
2377
- for (var dep in runDependencyTracking) {
2378
- if (!shown) {
2379
- shown = true;
2380
- err("still waiting on run dependencies:");
2381
- }
2382
- err(`dependency: ${dep}`);
2383
- }
2384
- if (shown) {
2385
- err("(end of list)");
2386
- }
2387
- }, 1e4);
2388
- }
2389
- };
2390
-
2391
- var preloadPlugins = [];
2392
-
2393
- var FS_handledByPreloadPlugin = async (byteArray, fullname) => {
2394
- // Ensure plugins are ready.
2395
- if (typeof Browser != "undefined") Browser.init();
2396
- for (var plugin of preloadPlugins) {
2397
- if (plugin["canHandle"](fullname)) {
2398
- assert(plugin["handle"].constructor.name === "AsyncFunction", "Filesystem plugin handlers must be async functions (See #24914)");
2399
- return plugin["handle"](byteArray, fullname);
2400
- }
2401
- }
2402
- // In no plugin handled this file then return the original/unmodified
2403
- // byteArray.
2404
- return byteArray;
2405
- };
2406
-
2407
- var FS_preloadFile = async (parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish) => {
2408
- // TODO we should allow people to just pass in a complete filename instead
2409
- // of parent and name being that we just join them anyways
2410
- var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
2411
- var dep = getUniqueRunDependency(`cp ${fullname}`);
2412
- // might have several active requests for the same fullname
2413
- addRunDependency(dep);
2414
- try {
2415
- var byteArray = url;
2416
- if (typeof url == "string") {
2417
- byteArray = await asyncLoad(url);
2418
- }
2419
- byteArray = await FS_handledByPreloadPlugin(byteArray, fullname);
2420
- preFinish?.();
2421
- if (!dontCreateFile) {
2422
- FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
2423
- }
2424
- } finally {
2425
- removeRunDependency(dep);
2426
- }
2427
- };
2428
-
2429
- var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => {
2430
- FS_preloadFile(parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish).then(onload).catch(onerror);
2431
- };
2432
-
2433
2610
  var FS = {
2434
2611
  root: null,
2435
2612
  mounts: [],
@@ -2557,9 +2734,6 @@ var FS = {
2557
2734
  current_path = PATH.dirname(current_path);
2558
2735
  if (FS.isRoot(current)) {
2559
2736
  path = current_path + "/" + parts.slice(i + 1).join("/");
2560
- // We're making progress here, don't let many consecutive ..'s
2561
- // lead to ELOOP
2562
- nlinks--;
2563
2737
  continue linkloop;
2564
2738
  } else {
2565
2739
  current = current.parent;
@@ -3568,29 +3742,33 @@ var FS = {
3568
3742
  opts.flags = opts.flags || 0;
3569
3743
  opts.encoding = opts.encoding || "binary";
3570
3744
  if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
3571
- abort(`Invalid encoding type "${opts.encoding}"`);
3745
+ throw new Error(`Invalid encoding type "${opts.encoding}"`);
3572
3746
  }
3747
+ var ret;
3573
3748
  var stream = FS.open(path, opts.flags);
3574
3749
  var stat = FS.stat(path);
3575
3750
  var length = stat.size;
3576
3751
  var buf = new Uint8Array(length);
3577
3752
  FS.read(stream, buf, 0, length, 0);
3578
3753
  if (opts.encoding === "utf8") {
3579
- buf = UTF8ArrayToString(buf);
3754
+ ret = UTF8ArrayToString(buf);
3755
+ } else if (opts.encoding === "binary") {
3756
+ ret = buf;
3580
3757
  }
3581
3758
  FS.close(stream);
3582
- return buf;
3759
+ return ret;
3583
3760
  },
3584
3761
  writeFile(path, data, opts = {}) {
3585
3762
  opts.flags = opts.flags || 577;
3586
3763
  var stream = FS.open(path, opts.flags, opts.mode);
3587
3764
  if (typeof data == "string") {
3588
- data = new Uint8Array(intArrayFromString(data));
3589
- }
3590
- if (ArrayBuffer.isView(data)) {
3765
+ var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
3766
+ var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
3767
+ FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn);
3768
+ } else if (ArrayBuffer.isView(data)) {
3591
3769
  FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn);
3592
3770
  } else {
3593
- abort("Unsupported data type");
3771
+ throw new Error("Unsupported data type");
3594
3772
  }
3595
3773
  FS.close(stream);
3596
3774
  },
@@ -3896,12 +4074,13 @@ var FS = {
3896
4074
  },
3897
4075
  forceLoadFile(obj) {
3898
4076
  if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
3899
- if (globalThis.XMLHttpRequest) {
3900
- abort("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
4077
+ if (typeof XMLHttpRequest != "undefined") {
4078
+ throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
3901
4079
  } else {
3902
4080
  // Command-line.
3903
4081
  try {
3904
4082
  obj.contents = readBinary(obj.url);
4083
+ obj.usedBytes = obj.contents.length;
3905
4084
  } catch (e) {
3906
4085
  throw new FS.ErrnoError(29);
3907
4086
  }
@@ -3930,7 +4109,7 @@ var FS = {
3930
4109
  var xhr = new XMLHttpRequest;
3931
4110
  xhr.open("HEAD", url, false);
3932
4111
  xhr.send(null);
3933
- if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort("Couldn't load " + url + ". Status: " + xhr.status);
4112
+ if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
3934
4113
  var datalength = Number(xhr.getResponseHeader("Content-length"));
3935
4114
  var header;
3936
4115
  var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
@@ -3940,8 +4119,8 @@ var FS = {
3940
4119
  if (!hasByteServing) chunkSize = datalength;
3941
4120
  // Function to get a range from the remote URL.
3942
4121
  var doXHR = (from, to) => {
3943
- if (from > to) abort("invalid range (" + from + ", " + to + ") or no bytes requested!");
3944
- if (to > datalength - 1) abort("only " + datalength + " bytes available! programmer error!");
4122
+ if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
4123
+ if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!");
3945
4124
  // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
3946
4125
  var xhr = new XMLHttpRequest;
3947
4126
  xhr.open("GET", url, false);
@@ -3952,7 +4131,7 @@ var FS = {
3952
4131
  xhr.overrideMimeType("text/plain; charset=x-user-defined");
3953
4132
  }
3954
4133
  xhr.send(null);
3955
- if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort("Couldn't load " + url + ". Status: " + xhr.status);
4134
+ if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
3956
4135
  if (xhr.response !== undefined) {
3957
4136
  return new Uint8Array(/** @type{Array<number>} */ (xhr.response || []));
3958
4137
  }
@@ -3968,7 +4147,7 @@ var FS = {
3968
4147
  if (typeof lazyArray.chunks[chunkNum] == "undefined") {
3969
4148
  lazyArray.chunks[chunkNum] = doXHR(start, end);
3970
4149
  }
3971
- if (typeof lazyArray.chunks[chunkNum] == "undefined") abort("doXHR failed!");
4150
+ if (typeof lazyArray.chunks[chunkNum] == "undefined") throw new Error("doXHR failed!");
3972
4151
  return lazyArray.chunks[chunkNum];
3973
4152
  });
3974
4153
  if (usesGzip || !datalength) {
@@ -3996,8 +4175,8 @@ var FS = {
3996
4175
  return this._chunkSize;
3997
4176
  }
3998
4177
  }
3999
- if (globalThis.XMLHttpRequest) {
4000
- if (!ENVIRONMENT_IS_WORKER) abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");
4178
+ if (typeof XMLHttpRequest != "undefined") {
4179
+ if (!ENVIRONMENT_IS_WORKER) throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
4001
4180
  var lazyArray = new LazyUint8Array;
4002
4181
  var properties = {
4003
4182
  isDevice: false,
@@ -4119,64 +4298,64 @@ var SYSCALLS = {
4119
4298
  return dir + "/" + path;
4120
4299
  },
4121
4300
  writeStat(buf, stat) {
4122
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((buf) >> 2), "storing")] = stat.dev;
4301
+ SAFE_HEAP_STORE(((buf) >> 2) * 4, stat.dev, 4);
4123
4302
  checkInt32(stat.dev);
4124
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (4)) >> 2), "storing")] = stat.mode;
4303
+ SAFE_HEAP_STORE((((buf) + (4)) >> 2) * 4, stat.mode, 4);
4125
4304
  checkInt32(stat.mode);
4126
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (8)) >> 2), "storing")] = stat.nlink;
4305
+ SAFE_HEAP_STORE((((buf) + (8)) >> 2) * 4, stat.nlink, 4);
4127
4306
  checkInt32(stat.nlink);
4128
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (12)) >> 2), "storing")] = stat.uid;
4307
+ SAFE_HEAP_STORE((((buf) + (12)) >> 2) * 4, stat.uid, 4);
4129
4308
  checkInt32(stat.uid);
4130
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (16)) >> 2), "storing")] = stat.gid;
4309
+ SAFE_HEAP_STORE((((buf) + (16)) >> 2) * 4, stat.gid, 4);
4131
4310
  checkInt32(stat.gid);
4132
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (20)) >> 2), "storing")] = stat.rdev;
4311
+ SAFE_HEAP_STORE((((buf) + (20)) >> 2) * 4, stat.rdev, 4);
4133
4312
  checkInt32(stat.rdev);
4134
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (24)) >> 3), "storing")] = BigInt(stat.size);
4313
+ HEAP64[(((buf) + (24)) >> 3)] = BigInt(stat.size);
4135
4314
  checkInt64(stat.size);
4136
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((buf) + (32)) >> 2), "storing")] = 4096;
4315
+ SAFE_HEAP_STORE((((buf) + (32)) >> 2) * 4, 4096, 4);
4137
4316
  checkInt32(4096);
4138
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((buf) + (36)) >> 2), "storing")] = stat.blocks;
4317
+ SAFE_HEAP_STORE((((buf) + (36)) >> 2) * 4, stat.blocks, 4);
4139
4318
  checkInt32(stat.blocks);
4140
4319
  var atime = stat.atime.getTime();
4141
4320
  var mtime = stat.mtime.getTime();
4142
4321
  var ctime = stat.ctime.getTime();
4143
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (40)) >> 3), "storing")] = BigInt(Math.floor(atime / 1e3));
4322
+ HEAP64[(((buf) + (40)) >> 3)] = BigInt(Math.floor(atime / 1e3));
4144
4323
  checkInt64(Math.floor(atime / 1e3));
4145
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (48)) >> 2), "storing")] = (atime % 1e3) * 1e3 * 1e3;
4324
+ SAFE_HEAP_STORE((((buf) + (48)) >> 2) * 4, (atime % 1e3) * 1e3 * 1e3, 4);
4146
4325
  checkInt32((atime % 1e3) * 1e3 * 1e3);
4147
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (56)) >> 3), "storing")] = BigInt(Math.floor(mtime / 1e3));
4326
+ HEAP64[(((buf) + (56)) >> 3)] = BigInt(Math.floor(mtime / 1e3));
4148
4327
  checkInt64(Math.floor(mtime / 1e3));
4149
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (64)) >> 2), "storing")] = (mtime % 1e3) * 1e3 * 1e3;
4328
+ SAFE_HEAP_STORE((((buf) + (64)) >> 2) * 4, (mtime % 1e3) * 1e3 * 1e3, 4);
4150
4329
  checkInt32((mtime % 1e3) * 1e3 * 1e3);
4151
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (72)) >> 3), "storing")] = BigInt(Math.floor(ctime / 1e3));
4330
+ HEAP64[(((buf) + (72)) >> 3)] = BigInt(Math.floor(ctime / 1e3));
4152
4331
  checkInt64(Math.floor(ctime / 1e3));
4153
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (80)) >> 2), "storing")] = (ctime % 1e3) * 1e3 * 1e3;
4332
+ SAFE_HEAP_STORE((((buf) + (80)) >> 2) * 4, (ctime % 1e3) * 1e3 * 1e3, 4);
4154
4333
  checkInt32((ctime % 1e3) * 1e3 * 1e3);
4155
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (88)) >> 3), "storing")] = BigInt(stat.ino);
4334
+ HEAP64[(((buf) + (88)) >> 3)] = BigInt(stat.ino);
4156
4335
  checkInt64(stat.ino);
4157
4336
  return 0;
4158
4337
  },
4159
4338
  writeStatFs(buf, stats) {
4160
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (4)) >> 2), "storing")] = stats.bsize;
4339
+ SAFE_HEAP_STORE((((buf) + (4)) >> 2) * 4, stats.bsize, 4);
4161
4340
  checkInt32(stats.bsize);
4162
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (60)) >> 2), "storing")] = stats.bsize;
4341
+ SAFE_HEAP_STORE((((buf) + (40)) >> 2) * 4, stats.bsize, 4);
4163
4342
  checkInt32(stats.bsize);
4164
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (8)) >> 3), "storing")] = BigInt(stats.blocks);
4165
- checkInt64(stats.blocks);
4166
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (16)) >> 3), "storing")] = BigInt(stats.bfree);
4167
- checkInt64(stats.bfree);
4168
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (24)) >> 3), "storing")] = BigInt(stats.bavail);
4169
- checkInt64(stats.bavail);
4170
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (32)) >> 3), "storing")] = BigInt(stats.files);
4171
- checkInt64(stats.files);
4172
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((buf) + (40)) >> 3), "storing")] = BigInt(stats.ffree);
4173
- checkInt64(stats.ffree);
4174
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (48)) >> 2), "storing")] = stats.fsid;
4343
+ SAFE_HEAP_STORE((((buf) + (8)) >> 2) * 4, stats.blocks, 4);
4344
+ checkInt32(stats.blocks);
4345
+ SAFE_HEAP_STORE((((buf) + (12)) >> 2) * 4, stats.bfree, 4);
4346
+ checkInt32(stats.bfree);
4347
+ SAFE_HEAP_STORE((((buf) + (16)) >> 2) * 4, stats.bavail, 4);
4348
+ checkInt32(stats.bavail);
4349
+ SAFE_HEAP_STORE((((buf) + (20)) >> 2) * 4, stats.files, 4);
4350
+ checkInt32(stats.files);
4351
+ SAFE_HEAP_STORE((((buf) + (24)) >> 2) * 4, stats.ffree, 4);
4352
+ checkInt32(stats.ffree);
4353
+ SAFE_HEAP_STORE((((buf) + (28)) >> 2) * 4, stats.fsid, 4);
4175
4354
  checkInt32(stats.fsid);
4176
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (64)) >> 2), "storing")] = stats.flags;
4355
+ SAFE_HEAP_STORE((((buf) + (44)) >> 2) * 4, stats.flags, 4);
4177
4356
  checkInt32(stats.flags);
4178
4357
  // ST_NOSUID
4179
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((buf) + (56)) >> 2), "storing")] = stats.namelen;
4358
+ SAFE_HEAP_STORE((((buf) + (36)) >> 2) * 4, stats.namelen, 4);
4180
4359
  checkInt32(stats.namelen);
4181
4360
  },
4182
4361
  doMsync(addr, stream, len, flags, offset) {
@@ -4221,7 +4400,7 @@ function ___syscall_dup3(fd, newfd, flags) {
4221
4400
  /** @suppress {duplicate } */ var syscallGetVarargI = () => {
4222
4401
  assert(SYSCALLS.varargs != undefined);
4223
4402
  // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number.
4224
- var ret = HEAP32[SAFE_HEAP_INDEX(HEAP32, ((+SYSCALLS.varargs) >> 2), "loading")];
4403
+ var ret = SAFE_HEAP_LOAD(((+SYSCALLS.varargs) >> 2) * 4, 4, 0);
4225
4404
  SYSCALLS.varargs += 4;
4226
4405
  return ret;
4227
4406
  };
@@ -4268,7 +4447,7 @@ function ___syscall_fcntl64(fd, cmd, varargs) {
4268
4447
  var arg = syscallGetVarargP();
4269
4448
  var offset = 0;
4270
4449
  // We're always unlocked.
4271
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((arg) + (offset)) >> 1), "storing")] = 2;
4450
+ SAFE_HEAP_STORE((((arg) + (offset)) >> 1) * 2, 2, 2);
4272
4451
  checkInt16(2);
4273
4452
  return 0;
4274
4453
  }
@@ -4350,13 +4529,13 @@ function ___syscall_getdents64(fd, dirp, count) {
4350
4529
  8;
4351
4530
  }
4352
4531
  assert(id);
4353
- HEAP64[SAFE_HEAP_INDEX(HEAP64, ((dirp + pos) >> 3), "storing")] = BigInt(id);
4532
+ HEAP64[((dirp + pos) >> 3)] = BigInt(id);
4354
4533
  checkInt64(id);
4355
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((dirp + pos) + (8)) >> 3), "storing")] = BigInt((idx + 1) * struct_size);
4534
+ HEAP64[(((dirp + pos) + (8)) >> 3)] = BigInt((idx + 1) * struct_size);
4356
4535
  checkInt64((idx + 1) * struct_size);
4357
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((dirp + pos) + (16)) >> 1), "storing")] = 280;
4536
+ SAFE_HEAP_STORE((((dirp + pos) + (16)) >> 1) * 2, 280, 2);
4358
4537
  checkInt16(280);
4359
- HEAP8[SAFE_HEAP_INDEX(HEAP8, (dirp + pos) + (18), "storing")] = type;
4538
+ SAFE_HEAP_STORE((dirp + pos) + (18), type, 1);
4360
4539
  checkInt8(type);
4361
4540
  stringToUTF8(name, dirp + pos + 19, 256);
4362
4541
  pos += struct_size;
@@ -4387,16 +4566,16 @@ function ___syscall_ioctl(fd, op, varargs) {
4387
4566
  if (stream.tty.ops.ioctl_tcgets) {
4388
4567
  var termios = stream.tty.ops.ioctl_tcgets(stream);
4389
4568
  var argp = syscallGetVarargP();
4390
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((argp) >> 2), "storing")] = termios.c_iflag || 0;
4569
+ SAFE_HEAP_STORE(((argp) >> 2) * 4, termios.c_iflag || 0, 4);
4391
4570
  checkInt32(termios.c_iflag || 0);
4392
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((argp) + (4)) >> 2), "storing")] = termios.c_oflag || 0;
4571
+ SAFE_HEAP_STORE((((argp) + (4)) >> 2) * 4, termios.c_oflag || 0, 4);
4393
4572
  checkInt32(termios.c_oflag || 0);
4394
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((argp) + (8)) >> 2), "storing")] = termios.c_cflag || 0;
4573
+ SAFE_HEAP_STORE((((argp) + (8)) >> 2) * 4, termios.c_cflag || 0, 4);
4395
4574
  checkInt32(termios.c_cflag || 0);
4396
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((argp) + (12)) >> 2), "storing")] = termios.c_lflag || 0;
4575
+ SAFE_HEAP_STORE((((argp) + (12)) >> 2) * 4, termios.c_lflag || 0, 4);
4397
4576
  checkInt32(termios.c_lflag || 0);
4398
4577
  for (var i = 0; i < 32; i++) {
4399
- HEAP8[SAFE_HEAP_INDEX(HEAP8, (argp + i) + (17), "storing")] = termios.c_cc[i] || 0;
4578
+ SAFE_HEAP_STORE((argp + i) + (17), termios.c_cc[i] || 0, 1);
4400
4579
  checkInt8(termios.c_cc[i] || 0);
4401
4580
  }
4402
4581
  return 0;
@@ -4419,13 +4598,13 @@ function ___syscall_ioctl(fd, op, varargs) {
4419
4598
  if (!stream.tty) return -59;
4420
4599
  if (stream.tty.ops.ioctl_tcsets) {
4421
4600
  var argp = syscallGetVarargP();
4422
- var c_iflag = HEAP32[SAFE_HEAP_INDEX(HEAP32, ((argp) >> 2), "loading")];
4423
- var c_oflag = HEAP32[SAFE_HEAP_INDEX(HEAP32, (((argp) + (4)) >> 2), "loading")];
4424
- var c_cflag = HEAP32[SAFE_HEAP_INDEX(HEAP32, (((argp) + (8)) >> 2), "loading")];
4425
- var c_lflag = HEAP32[SAFE_HEAP_INDEX(HEAP32, (((argp) + (12)) >> 2), "loading")];
4601
+ var c_iflag = SAFE_HEAP_LOAD(((argp) >> 2) * 4, 4, 0);
4602
+ var c_oflag = SAFE_HEAP_LOAD((((argp) + (4)) >> 2) * 4, 4, 0);
4603
+ var c_cflag = SAFE_HEAP_LOAD((((argp) + (8)) >> 2) * 4, 4, 0);
4604
+ var c_lflag = SAFE_HEAP_LOAD((((argp) + (12)) >> 2) * 4, 4, 0);
4426
4605
  var c_cc = [];
4427
4606
  for (var i = 0; i < 32; i++) {
4428
- c_cc.push(HEAP8[SAFE_HEAP_INDEX(HEAP8, (argp + i) + (17), "loading")]);
4607
+ c_cc.push(SAFE_HEAP_LOAD((argp + i) + (17), 1, 0));
4429
4608
  }
4430
4609
  return stream.tty.ops.ioctl_tcsets(stream.tty, op, {
4431
4610
  c_iflag,
@@ -4442,7 +4621,7 @@ function ___syscall_ioctl(fd, op, varargs) {
4442
4621
  {
4443
4622
  if (!stream.tty) return -59;
4444
4623
  var argp = syscallGetVarargP();
4445
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((argp) >> 2), "storing")] = 0;
4624
+ SAFE_HEAP_STORE(((argp) >> 2) * 4, 0, 4);
4446
4625
  checkInt32(0);
4447
4626
  return 0;
4448
4627
  }
@@ -4453,7 +4632,6 @@ function ___syscall_ioctl(fd, op, varargs) {
4453
4632
  return -28;
4454
4633
  }
4455
4634
 
4456
- case 21537:
4457
4635
  case 21531:
4458
4636
  {
4459
4637
  var argp = syscallGetVarargP();
@@ -4468,9 +4646,9 @@ function ___syscall_ioctl(fd, op, varargs) {
4468
4646
  if (stream.tty.ops.ioctl_tiocgwinsz) {
4469
4647
  var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty);
4470
4648
  var argp = syscallGetVarargP();
4471
- HEAP16[SAFE_HEAP_INDEX(HEAP16, ((argp) >> 1), "storing")] = winsize[0];
4649
+ SAFE_HEAP_STORE(((argp) >> 1) * 2, winsize[0], 2);
4472
4650
  checkInt16(winsize[0]);
4473
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((argp) + (2)) >> 1), "storing")] = winsize[1];
4651
+ SAFE_HEAP_STORE((((argp) + (2)) >> 1) * 2, winsize[1], 2);
4474
4652
  checkInt16(winsize[1]);
4475
4653
  }
4476
4654
  return 0;
@@ -4751,9 +4929,9 @@ function ___syscall_pipe(fdPtr) {
4751
4929
  throw new FS.ErrnoError(21);
4752
4930
  }
4753
4931
  var res = PIPEFS.createPipe();
4754
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((fdPtr) >> 2), "storing")] = res.readable_fd;
4932
+ SAFE_HEAP_STORE(((fdPtr) >> 2) * 4, res.readable_fd, 4);
4755
4933
  checkInt32(res.readable_fd);
4756
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((fdPtr) + (4)) >> 2), "storing")] = res.writable_fd;
4934
+ SAFE_HEAP_STORE((((fdPtr) + (4)) >> 2) * 4, res.writable_fd, 4);
4757
4935
  checkInt32(res.writable_fd);
4758
4936
  return 0;
4759
4937
  } catch (e) {
@@ -4767,12 +4945,12 @@ function ___syscall_unlinkat(dirfd, path, flags) {
4767
4945
  try {
4768
4946
  path = SYSCALLS.getStr(path);
4769
4947
  path = SYSCALLS.calculateAt(dirfd, path);
4770
- if (!flags) {
4948
+ if (flags === 0) {
4771
4949
  FS.unlink(path);
4772
4950
  } else if (flags === 512) {
4773
4951
  FS.rmdir(path);
4774
4952
  } else {
4775
- return -28;
4953
+ abort("Invalid flags passed to unlinkat");
4776
4954
  }
4777
4955
  return 0;
4778
4956
  } catch (e) {
@@ -4812,14 +4990,7 @@ var handleException = e => {
4812
4990
  var maybeExit = () => {
4813
4991
  if (!keepRuntimeAlive()) {
4814
4992
  try {
4815
- if (ENVIRONMENT_IS_PTHREAD) {
4816
- // exit the current thread, but only if there is one active.
4817
- // TODO(https://github.com/emscripten-core/emscripten/issues/25076):
4818
- // Unify this check with the runtimeExited check above
4819
- if (_pthread_self()) __emscripten_thread_exit(EXITSTATUS);
4820
- return;
4821
- }
4822
- _exit(EXITSTATUS);
4993
+ if (ENVIRONMENT_IS_PTHREAD) __emscripten_thread_exit(EXITSTATUS); else _exit(EXITSTATUS);
4823
4994
  } catch (e) {
4824
4995
  handleException(e);
4825
4996
  }
@@ -4840,7 +5011,7 @@ var callUserCallback = func => {
4840
5011
  };
4841
5012
 
4842
5013
  var __emscripten_thread_mailbox_await = pthread_ptr => {
4843
- if (Atomics.waitAsync) {
5014
+ if (typeof Atomics.waitAsync === "function") {
4844
5015
  // Wait on the pthread's initial self-pointer field because it is easy and
4845
5016
  // safe to access from sending threads that need to notify the waiting
4846
5017
  // thread.
@@ -4853,13 +5024,9 @@ var __emscripten_thread_mailbox_await = pthread_ptr => {
4853
5024
  }
4854
5025
  };
4855
5026
 
4856
- var checkMailbox = () => callUserCallback(() => {
5027
+ var checkMailbox = () => {
4857
5028
  // Only check the mailbox if we have a live pthread runtime. We implement
4858
5029
  // pthread_self to return 0 if there is no live runtime.
4859
- // TODO(https://github.com/emscripten-core/emscripten/issues/25076):
4860
- // Is this check still needed? `callUserCallback` is supposed to
4861
- // ensure the runtime is alive, and if `_pthread_self` is NULL then the
4862
- // runtime certainly is *not* alive, so this should be a redundant check.
4863
5030
  var pthread_ptr = _pthread_self();
4864
5031
  if (pthread_ptr) {
4865
5032
  // If we are using Atomics.waitAsync as our notification mechanism, wait
@@ -4867,9 +5034,9 @@ var checkMailbox = () => callUserCallback(() => {
4867
5034
  // work that could otherwise arrive after we've finished processing the
4868
5035
  // mailbox and before we're ready for the next notification.
4869
5036
  __emscripten_thread_mailbox_await(pthread_ptr);
4870
- __emscripten_check_mailbox();
5037
+ callUserCallback(__emscripten_check_mailbox);
4871
5038
  }
4872
- });
5039
+ };
4873
5040
 
4874
5041
  var __emscripten_notify_mailbox_postmessage = (targetThread, currThreadId) => {
4875
5042
  if (targetThread == currThreadId) {
@@ -4902,12 +5069,12 @@ var __emscripten_receive_on_main_thread_js = (funcIndex, emAsmAddr, callingThrea
4902
5069
  proxiedJSCallArgs.length = numCallArgs;
4903
5070
  var b = ((args) >> 3);
4904
5071
  for (var i = 0; i < numCallArgs; i++) {
4905
- if (HEAP64[SAFE_HEAP_INDEX(HEAP64, b + 2 * i, "loading")]) {
5072
+ if (HEAP64[b + 2 * i]) {
4906
5073
  // It's a BigInt.
4907
- proxiedJSCallArgs[i] = HEAP64[SAFE_HEAP_INDEX(HEAP64, b + 2 * i + 1, "loading")];
5074
+ proxiedJSCallArgs[i] = HEAP64[b + 2 * i + 1];
4908
5075
  } else {
4909
5076
  // It's a Number.
4910
- proxiedJSCallArgs[i] = HEAPF64[SAFE_HEAP_INDEX(HEAPF64, b + 2 * i + 1, "loading")];
5077
+ proxiedJSCallArgs[i] = SAFE_HEAP_LOAD_D((b + 2 * i + 1) * 8, 8, 0);
4911
5078
  }
4912
5079
  }
4913
5080
  // Proxied JS library funcs use funcIndex and EM_ASM functions use emAsmAddr
@@ -4947,23 +5114,23 @@ var bigintToI53Checked = num => (num < INT53_MIN || num > INT53_MAX) ? NaN : Num
4947
5114
  function __gmtime_js(time, tmPtr) {
4948
5115
  time = bigintToI53Checked(time);
4949
5116
  var date = new Date(time * 1e3);
4950
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((tmPtr) >> 2), "storing")] = date.getUTCSeconds();
5117
+ SAFE_HEAP_STORE(((tmPtr) >> 2) * 4, date.getUTCSeconds(), 4);
4951
5118
  checkInt32(date.getUTCSeconds());
4952
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (4)) >> 2), "storing")] = date.getUTCMinutes();
5119
+ SAFE_HEAP_STORE((((tmPtr) + (4)) >> 2) * 4, date.getUTCMinutes(), 4);
4953
5120
  checkInt32(date.getUTCMinutes());
4954
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (8)) >> 2), "storing")] = date.getUTCHours();
5121
+ SAFE_HEAP_STORE((((tmPtr) + (8)) >> 2) * 4, date.getUTCHours(), 4);
4955
5122
  checkInt32(date.getUTCHours());
4956
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (12)) >> 2), "storing")] = date.getUTCDate();
5123
+ SAFE_HEAP_STORE((((tmPtr) + (12)) >> 2) * 4, date.getUTCDate(), 4);
4957
5124
  checkInt32(date.getUTCDate());
4958
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (16)) >> 2), "storing")] = date.getUTCMonth();
5125
+ SAFE_HEAP_STORE((((tmPtr) + (16)) >> 2) * 4, date.getUTCMonth(), 4);
4959
5126
  checkInt32(date.getUTCMonth());
4960
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (20)) >> 2), "storing")] = date.getUTCFullYear() - 1900;
5127
+ SAFE_HEAP_STORE((((tmPtr) + (20)) >> 2) * 4, date.getUTCFullYear() - 1900, 4);
4961
5128
  checkInt32(date.getUTCFullYear() - 1900);
4962
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (24)) >> 2), "storing")] = date.getUTCDay();
5129
+ SAFE_HEAP_STORE((((tmPtr) + (24)) >> 2) * 4, date.getUTCDay(), 4);
4963
5130
  checkInt32(date.getUTCDay());
4964
5131
  var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
4965
5132
  var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0;
4966
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (28)) >> 2), "storing")] = yday;
5133
+ SAFE_HEAP_STORE((((tmPtr) + (28)) >> 2) * 4, yday, 4);
4967
5134
  checkInt32(yday);
4968
5135
  }
4969
5136
 
@@ -4984,31 +5151,31 @@ var ydayFromDate = date => {
4984
5151
  function __localtime_js(time, tmPtr) {
4985
5152
  time = bigintToI53Checked(time);
4986
5153
  var date = new Date(time * 1e3);
4987
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((tmPtr) >> 2), "storing")] = date.getSeconds();
5154
+ SAFE_HEAP_STORE(((tmPtr) >> 2) * 4, date.getSeconds(), 4);
4988
5155
  checkInt32(date.getSeconds());
4989
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (4)) >> 2), "storing")] = date.getMinutes();
5156
+ SAFE_HEAP_STORE((((tmPtr) + (4)) >> 2) * 4, date.getMinutes(), 4);
4990
5157
  checkInt32(date.getMinutes());
4991
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (8)) >> 2), "storing")] = date.getHours();
5158
+ SAFE_HEAP_STORE((((tmPtr) + (8)) >> 2) * 4, date.getHours(), 4);
4992
5159
  checkInt32(date.getHours());
4993
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (12)) >> 2), "storing")] = date.getDate();
5160
+ SAFE_HEAP_STORE((((tmPtr) + (12)) >> 2) * 4, date.getDate(), 4);
4994
5161
  checkInt32(date.getDate());
4995
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (16)) >> 2), "storing")] = date.getMonth();
5162
+ SAFE_HEAP_STORE((((tmPtr) + (16)) >> 2) * 4, date.getMonth(), 4);
4996
5163
  checkInt32(date.getMonth());
4997
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (20)) >> 2), "storing")] = date.getFullYear() - 1900;
5164
+ SAFE_HEAP_STORE((((tmPtr) + (20)) >> 2) * 4, date.getFullYear() - 1900, 4);
4998
5165
  checkInt32(date.getFullYear() - 1900);
4999
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (24)) >> 2), "storing")] = date.getDay();
5166
+ SAFE_HEAP_STORE((((tmPtr) + (24)) >> 2) * 4, date.getDay(), 4);
5000
5167
  checkInt32(date.getDay());
5001
5168
  var yday = ydayFromDate(date) | 0;
5002
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (28)) >> 2), "storing")] = yday;
5169
+ SAFE_HEAP_STORE((((tmPtr) + (28)) >> 2) * 4, yday, 4);
5003
5170
  checkInt32(yday);
5004
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (36)) >> 2), "storing")] = -(date.getTimezoneOffset() * 60);
5171
+ SAFE_HEAP_STORE((((tmPtr) + (36)) >> 2) * 4, -(date.getTimezoneOffset() * 60), 4);
5005
5172
  checkInt32(-(date.getTimezoneOffset() * 60));
5006
5173
  // Attention: DST is in December in South, and some regions don't have DST at all.
5007
5174
  var start = new Date(date.getFullYear(), 0, 1);
5008
5175
  var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset();
5009
5176
  var winterOffset = start.getTimezoneOffset();
5010
5177
  var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0;
5011
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((tmPtr) + (32)) >> 2), "storing")] = dst;
5178
+ SAFE_HEAP_STORE((((tmPtr) + (32)) >> 2) * 4, dst, 4);
5012
5179
  checkInt32(dst);
5013
5180
  }
5014
5181
 
@@ -5031,8 +5198,9 @@ var __tzset_js = (timezone, daylight, std_name, dst_name) => {
5031
5198
  // Coordinated Universal Time (UTC) and local standard time."), the same
5032
5199
  // as returned by stdTimezoneOffset.
5033
5200
  // See http://pubs.opengroup.org/onlinepubs/009695399/functions/tzset.html
5034
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((timezone) >> 2), "storing")] = stdTimezoneOffset * 60;
5035
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((daylight) >> 2), "storing")] = Number(winterOffset != summerOffset);
5201
+ SAFE_HEAP_STORE(((timezone) >> 2) * 4, stdTimezoneOffset * 60, 4);
5202
+ checkInt32(stdTimezoneOffset * 60);
5203
+ SAFE_HEAP_STORE(((daylight) >> 2) * 4, Number(winterOffset != summerOffset), 4);
5036
5204
  checkInt32(Number(winterOffset != summerOffset));
5037
5205
  var extractZone = timezoneOffset => {
5038
5206
  // Why inverse sign?
@@ -5078,7 +5246,7 @@ function _clock_time_get(clk_id, ignored_precision, ptime) {
5078
5246
  }
5079
5247
  // "now" is in ms, and wasi times are in ns.
5080
5248
  var nsec = Math.round(now * 1e3 * 1e3);
5081
- HEAP64[SAFE_HEAP_INDEX(HEAP64, ((ptime) >> 3), "storing")] = BigInt(nsec);
5249
+ HEAP64[((ptime) >> 3)] = BigInt(nsec);
5082
5250
  checkInt64(nsec);
5083
5251
  return 0;
5084
5252
  }
@@ -5094,7 +5262,7 @@ var readEmAsmArgs = (sigPtr, buf) => {
5094
5262
  var ch;
5095
5263
  // Most arguments are i32s, so shift the buffer pointer so it is a plain
5096
5264
  // index into HEAP32.
5097
- while (ch = HEAPU8[SAFE_HEAP_INDEX(HEAPU8, sigPtr++, "loading")]) {
5265
+ while (ch = SAFE_HEAP_LOAD(sigPtr++, 1, 1)) {
5098
5266
  var chr = String.fromCharCode(ch);
5099
5267
  var validChars = [ "d", "f", "i", "p" ];
5100
5268
  // In WASM_BIGINT mode we support passing i64 values as bigint.
@@ -5106,7 +5274,7 @@ var readEmAsmArgs = (sigPtr, buf) => {
5106
5274
  wide &= (ch != 112);
5107
5275
  buf += wide && (buf % 8) ? 4 : 0;
5108
5276
  readEmAsmArgsArray.push(// Special case for pointers under wasm64 or CAN_ADDRESS_2GB mode.
5109
- ch == 112 ? HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((buf) >> 2), "loading")] : ch == 106 ? HEAP64[SAFE_HEAP_INDEX(HEAP64, ((buf) >> 3), "loading")] : ch == 105 ? HEAP32[SAFE_HEAP_INDEX(HEAP32, ((buf) >> 2), "loading")] : HEAPF64[SAFE_HEAP_INDEX(HEAPF64, ((buf) >> 3), "loading")]);
5277
+ ch == 112 ? SAFE_HEAP_LOAD(((buf) >> 2) * 4, 4, 1) : ch == 106 ? HEAP64[((buf) >> 3)] : ch == 105 ? SAFE_HEAP_LOAD(((buf) >> 2) * 4, 4, 0) : SAFE_HEAP_LOAD_D(((buf) >> 3) * 8, 8, 0));
5110
5278
  buf += wide ? 8 : 4;
5111
5279
  }
5112
5280
  return readEmAsmArgsArray;
@@ -5342,24 +5510,36 @@ var JSEvents = {
5342
5510
  }
5343
5511
  };
5344
5512
 
5345
- var fillBatteryEventData = (eventStruct, battery) => {
5346
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, ((eventStruct) >> 3), "storing")] = battery.chargingTime;
5347
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (8)) >> 3), "storing")] = battery.dischargingTime;
5348
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (16)) >> 3), "storing")] = battery.level;
5349
- HEAP8[SAFE_HEAP_INDEX(HEAP8, (eventStruct) + (24), "storing")] = battery.charging;
5350
- checkInt8(battery.charging);
5513
+ var fillBatteryEventData = (eventStruct, e) => {
5514
+ SAFE_HEAP_STORE_D(((eventStruct) >> 3) * 8, e.chargingTime, 8);
5515
+ SAFE_HEAP_STORE_D((((eventStruct) + (8)) >> 3) * 8, e.dischargingTime, 8);
5516
+ SAFE_HEAP_STORE_D((((eventStruct) + (16)) >> 3) * 8, e.level, 8);
5517
+ SAFE_HEAP_STORE((eventStruct) + (24), e.charging, 1);
5518
+ checkInt8(e.charging);
5519
+ };
5520
+
5521
+ var battery = () => navigator.battery || navigator.mozBattery || navigator.webkitBattery;
5522
+
5523
+ var maybeCStringToJsString = cString => cString > 2 ? UTF8ToString(cString) : cString;
5524
+
5525
+ /** @type {Object} */ var specialHTMLTargets = [ 0, typeof document != "undefined" ? document : 0, typeof window != "undefined" ? window : 0 ];
5526
+
5527
+ var findEventTarget = target => {
5528
+ target = maybeCStringToJsString(target);
5529
+ var domElement = specialHTMLTargets[target] || (typeof document != "undefined" ? document.querySelector(target) : null);
5530
+ return domElement;
5351
5531
  };
5352
5532
 
5353
- var registerBatteryEventCallback = (battery, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
5533
+ var registerBatteryEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
5354
5534
  targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
5355
5535
  JSEvents.batteryEvent ||= _malloc(32);
5356
5536
  var batteryEventHandlerFunc = (e = event) => {
5357
5537
  var batteryEvent = targetThread ? _malloc(32) : JSEvents.batteryEvent;
5358
- fillBatteryEventData(batteryEvent, battery);
5538
+ fillBatteryEventData(batteryEvent, battery());
5359
5539
  if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, batteryEvent, userData); else if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, batteryEvent, userData)) e.preventDefault();
5360
5540
  };
5361
5541
  var eventHandler = {
5362
- target: battery,
5542
+ target: findEventTarget(target),
5363
5543
  eventTypeString,
5364
5544
  callbackfunc,
5365
5545
  handlerFunc: batteryEventHandlerFunc,
@@ -5368,33 +5548,17 @@ var registerBatteryEventCallback = (battery, userData, useCapture, callbackfunc,
5368
5548
  return JSEvents.registerOrRemoveHandler(eventHandler);
5369
5549
  };
5370
5550
 
5371
- var hasBatteryAPI = () => typeof navigator != "undefined" && navigator.getBattery;
5372
-
5373
- var _emscripten_set_batterychargingchange_callback_on_thread = function(userData, callbackfunc, targetThread) {
5551
+ function _emscripten_set_batterychargingchange_callback_on_thread(userData, callbackfunc, targetThread) {
5374
5552
  if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(12, 0, 1, userData, callbackfunc, targetThread);
5375
- if (!hasBatteryAPI()) return -1;
5376
- navigator.getBattery().then(b => {
5377
- registerBatteryEventCallback(b, userData, true, callbackfunc, 29, "chargingchange", targetThread);
5378
- });
5379
- };
5553
+ if (!battery()) return -1;
5554
+ return registerBatteryEventCallback(battery(), userData, true, callbackfunc, 29, "chargingchange", targetThread);
5555
+ }
5380
5556
 
5381
- var _emscripten_set_batterylevelchange_callback_on_thread = function(userData, callbackfunc, targetThread) {
5557
+ function _emscripten_set_batterylevelchange_callback_on_thread(userData, callbackfunc, targetThread) {
5382
5558
  if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(13, 0, 1, userData, callbackfunc, targetThread);
5383
- if (!hasBatteryAPI()) return -1;
5384
- navigator.getBattery().then(b => {
5385
- registerBatteryEventCallback(b, userData, true, callbackfunc, 30, "levelchange", targetThread);
5386
- });
5387
- };
5388
-
5389
- var maybeCStringToJsString = cString => cString > 2 ? UTF8ToString(cString) : cString;
5390
-
5391
- /** @type {Object} */ var specialHTMLTargets = [ 0, typeof document != "undefined" ? document : 0, typeof window != "undefined" ? window : 0 ];
5392
-
5393
- var findEventTarget = target => {
5394
- target = maybeCStringToJsString(target);
5395
- var domElement = specialHTMLTargets[target] || (typeof document != "undefined" ? document.querySelector(target) : null);
5396
- return domElement;
5397
- };
5559
+ if (!battery()) return -1;
5560
+ return registerBatteryEventCallback(battery(), userData, true, callbackfunc, 30, "levelchange", targetThread);
5561
+ }
5398
5562
 
5399
5563
  var registerBeforeUnloadEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) => {
5400
5564
  var beforeUnloadEventHandlerFunc = (e = event) => {
@@ -5461,24 +5625,24 @@ var getBoundingClientRect = e => specialHTMLTargets.indexOf(e) < 0 ? e.getBoundi
5461
5625
 
5462
5626
  var fillMouseEventData = (eventStruct, e, target) => {
5463
5627
  assert(eventStruct % 4 == 0);
5464
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, ((eventStruct) >> 3), "storing")] = e.timeStamp;
5628
+ SAFE_HEAP_STORE_D(((eventStruct) >> 3) * 8, e.timeStamp, 8);
5465
5629
  var idx = ((eventStruct) >> 2);
5466
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 2, "storing")] = e.screenX;
5467
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 3, "storing")] = e.screenY;
5468
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 4, "storing")] = e.clientX;
5469
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 5, "storing")] = e.clientY;
5470
- HEAP8[SAFE_HEAP_INDEX(HEAP8, eventStruct + 24, "storing")] = e.ctrlKey;
5471
- HEAP8[SAFE_HEAP_INDEX(HEAP8, eventStruct + 25, "storing")] = e.shiftKey;
5472
- HEAP8[SAFE_HEAP_INDEX(HEAP8, eventStruct + 26, "storing")] = e.altKey;
5473
- HEAP8[SAFE_HEAP_INDEX(HEAP8, eventStruct + 27, "storing")] = e.metaKey;
5474
- HEAP16[SAFE_HEAP_INDEX(HEAP16, idx * 2 + 14, "storing")] = e.button;
5475
- HEAP16[SAFE_HEAP_INDEX(HEAP16, idx * 2 + 15, "storing")] = e.buttons;
5476
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 8, "storing")] = e["movementX"];
5477
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 9, "storing")] = e["movementY"];
5630
+ SAFE_HEAP_STORE((idx + 2) * 4, e.screenX, 4);
5631
+ SAFE_HEAP_STORE((idx + 3) * 4, e.screenY, 4);
5632
+ SAFE_HEAP_STORE((idx + 4) * 4, e.clientX, 4);
5633
+ SAFE_HEAP_STORE((idx + 5) * 4, e.clientY, 4);
5634
+ SAFE_HEAP_STORE(eventStruct + 24, e.ctrlKey, 1);
5635
+ SAFE_HEAP_STORE(eventStruct + 25, e.shiftKey, 1);
5636
+ SAFE_HEAP_STORE(eventStruct + 26, e.altKey, 1);
5637
+ SAFE_HEAP_STORE(eventStruct + 27, e.metaKey, 1);
5638
+ SAFE_HEAP_STORE((idx * 2 + 14) * 2, e.button, 2);
5639
+ SAFE_HEAP_STORE((idx * 2 + 15) * 2, e.buttons, 2);
5640
+ SAFE_HEAP_STORE((idx + 8) * 4, e["movementX"], 4);
5641
+ SAFE_HEAP_STORE((idx + 9) * 4, e["movementY"], 4);
5478
5642
  // Note: rect contains doubles (truncated to placate SAFE_HEAP, which is the same behaviour when writing to HEAP32 anyway)
5479
5643
  var rect = getBoundingClientRect(target);
5480
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 10, "storing")] = e.clientX - (rect.left | 0);
5481
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 11, "storing")] = e.clientY - (rect.top | 0);
5644
+ SAFE_HEAP_STORE((idx + 10) * 4, e.clientX - (rect.left | 0), 4);
5645
+ SAFE_HEAP_STORE((idx + 11) * 4, e.clientY - (rect.top | 0), 4);
5482
5646
  };
5483
5647
 
5484
5648
  var registerMouseEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
@@ -5524,15 +5688,15 @@ var fillDeviceMotionEventData = (eventStruct, e, target) => {
5524
5688
  a = a || {};
5525
5689
  ag = ag || {};
5526
5690
  rr = rr || {};
5527
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, ((eventStruct) >> 3), "storing")] = a["x"];
5528
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (8)) >> 3), "storing")] = a["y"];
5529
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (16)) >> 3), "storing")] = a["z"];
5530
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (24)) >> 3), "storing")] = ag["x"];
5531
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (32)) >> 3), "storing")] = ag["y"];
5532
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (40)) >> 3), "storing")] = ag["z"];
5533
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (48)) >> 3), "storing")] = rr["alpha"];
5534
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (56)) >> 3), "storing")] = rr["beta"];
5535
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (64)) >> 3), "storing")] = rr["gamma"];
5691
+ SAFE_HEAP_STORE_D(((eventStruct) >> 3) * 8, a["x"], 8);
5692
+ SAFE_HEAP_STORE_D((((eventStruct) + (8)) >> 3) * 8, a["y"], 8);
5693
+ SAFE_HEAP_STORE_D((((eventStruct) + (16)) >> 3) * 8, a["z"], 8);
5694
+ SAFE_HEAP_STORE_D((((eventStruct) + (24)) >> 3) * 8, ag["x"], 8);
5695
+ SAFE_HEAP_STORE_D((((eventStruct) + (32)) >> 3) * 8, ag["y"], 8);
5696
+ SAFE_HEAP_STORE_D((((eventStruct) + (40)) >> 3) * 8, ag["z"], 8);
5697
+ SAFE_HEAP_STORE_D((((eventStruct) + (48)) >> 3) * 8, rr["alpha"], 8);
5698
+ SAFE_HEAP_STORE_D((((eventStruct) + (56)) >> 3) * 8, rr["beta"], 8);
5699
+ SAFE_HEAP_STORE_D((((eventStruct) + (64)) >> 3) * 8, rr["gamma"], 8);
5536
5700
  };
5537
5701
 
5538
5702
  var registerDeviceMotionEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => {
@@ -5563,10 +5727,10 @@ function _emscripten_set_devicemotion_callback_on_thread(userData, useCapture, c
5563
5727
  }
5564
5728
 
5565
5729
  var fillDeviceOrientationEventData = (eventStruct, e, target) => {
5566
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, ((eventStruct) >> 3), "storing")] = e.alpha;
5567
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (8)) >> 3), "storing")] = e.beta;
5568
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct) + (16)) >> 3), "storing")] = e.gamma;
5569
- HEAP8[SAFE_HEAP_INDEX(HEAP8, (eventStruct) + (24), "storing")] = e.absolute;
5730
+ SAFE_HEAP_STORE_D(((eventStruct) >> 3) * 8, e.alpha, 8);
5731
+ SAFE_HEAP_STORE_D((((eventStruct) + (8)) >> 3) * 8, e.beta, 8);
5732
+ SAFE_HEAP_STORE_D((((eventStruct) + (16)) >> 3) * 8, e.gamma, 8);
5733
+ SAFE_HEAP_STORE((eventStruct) + (24), e.absolute, 1);
5570
5734
  checkInt8(e.absolute);
5571
5735
  };
5572
5736
 
@@ -5612,17 +5776,12 @@ function _emscripten_set_focusout_callback_on_thread(target, userData, useCaptur
5612
5776
  return registerFocusEventCallback(target, userData, useCapture, callbackfunc, 15, "focusout", targetThread);
5613
5777
  }
5614
5778
 
5615
- function getFullscreenElement() {
5616
- return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.webkitCurrentFullScreenElement || document.msFullscreenElement;
5617
- }
5618
-
5619
5779
  var fillFullscreenChangeEventData = eventStruct => {
5620
- var fullscreenElement = getFullscreenElement();
5780
+ var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
5621
5781
  var isFullscreen = !!fullscreenElement;
5622
- // Assigning a boolean to HEAP32 with expected type coercion.
5623
- /** @suppress{checkTypes} */ HEAP8[SAFE_HEAP_INDEX(HEAP8, eventStruct, "storing")] = isFullscreen;
5782
+ SAFE_HEAP_STORE(eventStruct, isFullscreen, 1);
5624
5783
  checkInt8(isFullscreen);
5625
- HEAP8[SAFE_HEAP_INDEX(HEAP8, (eventStruct) + (1), "storing")] = JSEvents.fullscreenEnabled();
5784
+ SAFE_HEAP_STORE((eventStruct) + (1), JSEvents.fullscreenEnabled(), 1);
5626
5785
  checkInt8(JSEvents.fullscreenEnabled());
5627
5786
  // If transitioning to fullscreen, report info about the element that is now fullscreen.
5628
5787
  // If transitioning to windowed mode, report info about the element that just was fullscreen.
@@ -5631,13 +5790,13 @@ var fillFullscreenChangeEventData = eventStruct => {
5631
5790
  var id = reportedElement?.id || "";
5632
5791
  stringToUTF8(nodeName, eventStruct + 2, 128);
5633
5792
  stringToUTF8(id, eventStruct + 130, 128);
5634
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (260)) >> 2), "storing")] = reportedElement ? reportedElement.clientWidth : 0;
5793
+ SAFE_HEAP_STORE((((eventStruct) + (260)) >> 2) * 4, reportedElement ? reportedElement.clientWidth : 0, 4);
5635
5794
  checkInt32(reportedElement ? reportedElement.clientWidth : 0);
5636
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (264)) >> 2), "storing")] = reportedElement ? reportedElement.clientHeight : 0;
5795
+ SAFE_HEAP_STORE((((eventStruct) + (264)) >> 2) * 4, reportedElement ? reportedElement.clientHeight : 0, 4);
5637
5796
  checkInt32(reportedElement ? reportedElement.clientHeight : 0);
5638
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (268)) >> 2), "storing")] = screen.width;
5797
+ SAFE_HEAP_STORE((((eventStruct) + (268)) >> 2) * 4, screen.width, 4);
5639
5798
  checkInt32(screen.width);
5640
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (272)) >> 2), "storing")] = screen.height;
5799
+ SAFE_HEAP_STORE((((eventStruct) + (272)) >> 2) * 4, screen.height, 4);
5641
5800
  checkInt32(screen.height);
5642
5801
  if (isFullscreen) {
5643
5802
  JSEvents.previousFullscreenElement = fullscreenElement;
@@ -5667,40 +5826,40 @@ function _emscripten_set_fullscreenchange_callback_on_thread(target, userData, u
5667
5826
  if (!JSEvents.fullscreenEnabled()) return -1;
5668
5827
  target = findEventTarget(target);
5669
5828
  if (!target) return -4;
5829
+ // Unprefixed Fullscreen API shipped in Chromium 71 (https://bugs.chromium.org/p/chromium/issues/detail?id=383813)
5670
5830
  // As of Safari 13.0.3 on macOS Catalina 10.15.1 still ships with prefixed webkitfullscreenchange. TODO: revisit this check once Safari ships unprefixed version.
5671
5831
  registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "webkitfullscreenchange", targetThread);
5672
5832
  return registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "fullscreenchange", targetThread);
5673
5833
  }
5674
5834
 
5675
5835
  var fillGamepadEventData = (eventStruct, e) => {
5676
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, ((eventStruct) >> 3), "storing")] = e.timestamp;
5836
+ SAFE_HEAP_STORE_D(((eventStruct) >> 3) * 8, e.timestamp, 8);
5677
5837
  for (var i = 0; i < e.axes.length; ++i) {
5678
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct + i * 8) + (16)) >> 3), "storing")] = e.axes[i];
5838
+ SAFE_HEAP_STORE_D((((eventStruct + i * 8) + (16)) >> 3) * 8, e.axes[i], 8);
5679
5839
  }
5680
5840
  for (var i = 0; i < e.buttons.length; ++i) {
5681
5841
  if (typeof e.buttons[i] == "object") {
5682
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct + i * 8) + (528)) >> 3), "storing")] = e.buttons[i].value;
5842
+ SAFE_HEAP_STORE_D((((eventStruct + i * 8) + (528)) >> 3) * 8, e.buttons[i].value, 8);
5683
5843
  } else {
5684
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((eventStruct + i * 8) + (528)) >> 3), "storing")] = e.buttons[i];
5844
+ SAFE_HEAP_STORE_D((((eventStruct + i * 8) + (528)) >> 3) * 8, e.buttons[i], 8);
5685
5845
  }
5686
5846
  }
5687
5847
  for (var i = 0; i < e.buttons.length; ++i) {
5688
5848
  if (typeof e.buttons[i] == "object") {
5689
- HEAP8[SAFE_HEAP_INDEX(HEAP8, (eventStruct + i) + (1040), "storing")] = e.buttons[i].pressed;
5849
+ SAFE_HEAP_STORE((eventStruct + i) + (1040), e.buttons[i].pressed, 1);
5690
5850
  checkInt8(e.buttons[i].pressed);
5691
5851
  } else {
5692
- // Assigning a boolean to HEAP32, that's ok, but Closure would like to warn about it:
5693
- /** @suppress {checkTypes} */ HEAP8[SAFE_HEAP_INDEX(HEAP8, (eventStruct + i) + (1040), "storing")] = e.buttons[i] == 1;
5852
+ SAFE_HEAP_STORE((eventStruct + i) + (1040), e.buttons[i] == 1, 1);
5694
5853
  checkInt8(e.buttons[i] == 1);
5695
5854
  }
5696
5855
  }
5697
- HEAP8[SAFE_HEAP_INDEX(HEAP8, (eventStruct) + (1104), "storing")] = e.connected;
5856
+ SAFE_HEAP_STORE((eventStruct) + (1104), e.connected, 1);
5698
5857
  checkInt8(e.connected);
5699
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (1108)) >> 2), "storing")] = e.index;
5858
+ SAFE_HEAP_STORE((((eventStruct) + (1108)) >> 2) * 4, e.index, 4);
5700
5859
  checkInt32(e.index);
5701
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (8)) >> 2), "storing")] = e.axes.length;
5860
+ SAFE_HEAP_STORE((((eventStruct) + (8)) >> 2) * 4, e.axes.length, 4);
5702
5861
  checkInt32(e.axes.length);
5703
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (12)) >> 2), "storing")] = e.buttons.length;
5862
+ SAFE_HEAP_STORE((((eventStruct) + (12)) >> 2) * 4, e.buttons.length, 4);
5704
5863
  checkInt32(e.buttons.length);
5705
5864
  stringToUTF8(e.id, eventStruct + 1112, 64);
5706
5865
  stringToUTF8(e.mapping, eventStruct + 1176, 64);
@@ -5755,17 +5914,17 @@ var registerKeyEventCallback = (target, userData, useCapture, callbackfunc, even
5755
5914
  assert(e);
5756
5915
  var keyEventData = targetThread ? _malloc(160) : JSEvents.keyEvent;
5757
5916
  // This allocated block is passed as satellite data to the proxied function call, so the call frees up the data block when done.
5758
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, ((keyEventData) >> 3), "storing")] = e.timeStamp;
5917
+ SAFE_HEAP_STORE_D(((keyEventData) >> 3) * 8, e.timeStamp, 8);
5759
5918
  var idx = ((keyEventData) >> 2);
5760
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 2, "storing")] = e.location;
5761
- HEAP8[SAFE_HEAP_INDEX(HEAP8, keyEventData + 12, "storing")] = e.ctrlKey;
5762
- HEAP8[SAFE_HEAP_INDEX(HEAP8, keyEventData + 13, "storing")] = e.shiftKey;
5763
- HEAP8[SAFE_HEAP_INDEX(HEAP8, keyEventData + 14, "storing")] = e.altKey;
5764
- HEAP8[SAFE_HEAP_INDEX(HEAP8, keyEventData + 15, "storing")] = e.metaKey;
5765
- HEAP8[SAFE_HEAP_INDEX(HEAP8, keyEventData + 16, "storing")] = e.repeat;
5766
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 5, "storing")] = e.charCode;
5767
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 6, "storing")] = e.keyCode;
5768
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx + 7, "storing")] = e.which;
5919
+ SAFE_HEAP_STORE((idx + 2) * 4, e.location, 4);
5920
+ SAFE_HEAP_STORE(keyEventData + 12, e.ctrlKey, 1);
5921
+ SAFE_HEAP_STORE(keyEventData + 13, e.shiftKey, 1);
5922
+ SAFE_HEAP_STORE(keyEventData + 14, e.altKey, 1);
5923
+ SAFE_HEAP_STORE(keyEventData + 15, e.metaKey, 1);
5924
+ SAFE_HEAP_STORE(keyEventData + 16, e.repeat, 1);
5925
+ SAFE_HEAP_STORE((idx + 5) * 4, e.charCode, 4);
5926
+ SAFE_HEAP_STORE((idx + 6) * 4, e.keyCode, 4);
5927
+ SAFE_HEAP_STORE((idx + 7) * 4, e.which, 4);
5769
5928
  stringToUTF8(e.key || "", keyEventData + 32, 32);
5770
5929
  stringToUTF8(e.code || "", keyEventData + 64, 32);
5771
5930
  stringToUTF8(e.char || "", keyEventData + 96, 32);
@@ -5858,9 +6017,9 @@ var fillOrientationChangeEventData = eventStruct => {
5858
6017
  // fallback for Safari earlier than 16.4 (March 2023)
5859
6018
  orientationAngle = window.orientation;
5860
6019
  }
5861
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((eventStruct) >> 2), "storing")] = orientationIndex;
6020
+ SAFE_HEAP_STORE(((eventStruct) >> 2) * 4, orientationIndex, 4);
5862
6021
  checkInt32(orientationIndex);
5863
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (4)) >> 2), "storing")] = orientationAngle;
6022
+ SAFE_HEAP_STORE((((eventStruct) + (4)) >> 2) * 4, orientationAngle, 4);
5864
6023
  checkInt32(orientationAngle);
5865
6024
  };
5866
6025
 
@@ -5889,10 +6048,9 @@ function _emscripten_set_orientationchange_callback_on_thread(userData, useCaptu
5889
6048
  }
5890
6049
 
5891
6050
  var fillPointerlockChangeEventData = eventStruct => {
5892
- var pointerLockElement = document.pointerLockElement;
6051
+ var pointerLockElement = document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement || document.msPointerLockElement;
5893
6052
  var isPointerlocked = !!pointerLockElement;
5894
- // Assigning a boolean to HEAP32 with expected type coercion.
5895
- /** @suppress{checkTypes} */ HEAP8[SAFE_HEAP_INDEX(HEAP8, eventStruct, "storing")] = isPointerlocked;
6053
+ SAFE_HEAP_STORE(eventStruct, isPointerlocked, 1);
5896
6054
  checkInt8(isPointerlocked);
5897
6055
  var nodeName = JSEvents.getNodeNameForTarget(pointerLockElement);
5898
6056
  var id = pointerLockElement?.id || "";
@@ -5918,13 +6076,17 @@ var registerPointerlockChangeEventCallback = (target, userData, useCapture, call
5918
6076
  return JSEvents.registerOrRemoveHandler(eventHandler);
5919
6077
  };
5920
6078
 
5921
- function _emscripten_set_pointerlockchange_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
6079
+ /** @suppress {missingProperties} */ function _emscripten_set_pointerlockchange_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
5922
6080
  if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(38, 0, 1, target, userData, useCapture, callbackfunc, targetThread);
5923
- if (!document.body?.requestPointerLock) {
6081
+ // TODO: Currently not supported in pthreads or in --proxy-to-worker mode. (In pthreads mode, document object is not defined)
6082
+ if (!document || !document.body || (!document.body.requestPointerLock && !document.body.mozRequestPointerLock && !document.body.webkitRequestPointerLock && !document.body.msRequestPointerLock)) {
5924
6083
  return -1;
5925
6084
  }
5926
6085
  target = findEventTarget(target);
5927
6086
  if (!target) return -4;
6087
+ registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "mozpointerlockchange", targetThread);
6088
+ registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "webkitpointerlockchange", targetThread);
6089
+ registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "mspointerlockchange", targetThread);
5928
6090
  return registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "pointerlockchange", targetThread);
5929
6091
  }
5930
6092
 
@@ -5943,13 +6105,17 @@ var registerPointerlockErrorEventCallback = (target, userData, useCapture, callb
5943
6105
  return JSEvents.registerOrRemoveHandler(eventHandler);
5944
6106
  };
5945
6107
 
5946
- function _emscripten_set_pointerlockerror_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
6108
+ /** @suppress {missingProperties} */ function _emscripten_set_pointerlockerror_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
5947
6109
  if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(39, 0, 1, target, userData, useCapture, callbackfunc, targetThread);
5948
- if (!document.body?.requestPointerLock) {
6110
+ // TODO: Currently not supported in pthreads or in --proxy-to-worker mode. (In pthreads mode, document object is not defined)
6111
+ if (!document || !document.body.requestPointerLock && !document.body.mozRequestPointerLock && !document.body.webkitRequestPointerLock && !document.body.msRequestPointerLock) {
5949
6112
  return -1;
5950
6113
  }
5951
6114
  target = findEventTarget(target);
5952
6115
  if (!target) return -4;
6116
+ registerPointerlockErrorEventCallback(target, userData, useCapture, callbackfunc, 38, "mozpointerlockerror", targetThread);
6117
+ registerPointerlockErrorEventCallback(target, userData, useCapture, callbackfunc, 38, "webkitpointerlockerror", targetThread);
6118
+ registerPointerlockErrorEventCallback(target, userData, useCapture, callbackfunc, 38, "mspointerlockerror", targetThread);
5953
6119
  return registerPointerlockErrorEventCallback(target, userData, useCapture, callbackfunc, 38, "pointerlockerror", targetThread);
5954
6120
  }
5955
6121
 
@@ -5972,25 +6138,25 @@ var registerUiEventCallback = (target, userData, useCapture, callbackfunc, event
5972
6138
  return;
5973
6139
  }
5974
6140
  var uiEvent = targetThread ? _malloc(36) : JSEvents.uiEvent;
5975
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((uiEvent) >> 2), "storing")] = 0;
6141
+ SAFE_HEAP_STORE(((uiEvent) >> 2) * 4, 0, 4);
5976
6142
  checkInt32(0);
5977
6143
  // always zero for resize and scroll
5978
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((uiEvent) + (4)) >> 2), "storing")] = b.clientWidth;
6144
+ SAFE_HEAP_STORE((((uiEvent) + (4)) >> 2) * 4, b.clientWidth, 4);
5979
6145
  checkInt32(b.clientWidth);
5980
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((uiEvent) + (8)) >> 2), "storing")] = b.clientHeight;
6146
+ SAFE_HEAP_STORE((((uiEvent) + (8)) >> 2) * 4, b.clientHeight, 4);
5981
6147
  checkInt32(b.clientHeight);
5982
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((uiEvent) + (12)) >> 2), "storing")] = innerWidth;
6148
+ SAFE_HEAP_STORE((((uiEvent) + (12)) >> 2) * 4, innerWidth, 4);
5983
6149
  checkInt32(innerWidth);
5984
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((uiEvent) + (16)) >> 2), "storing")] = innerHeight;
6150
+ SAFE_HEAP_STORE((((uiEvent) + (16)) >> 2) * 4, innerHeight, 4);
5985
6151
  checkInt32(innerHeight);
5986
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((uiEvent) + (20)) >> 2), "storing")] = outerWidth;
6152
+ SAFE_HEAP_STORE((((uiEvent) + (20)) >> 2) * 4, outerWidth, 4);
5987
6153
  checkInt32(outerWidth);
5988
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((uiEvent) + (24)) >> 2), "storing")] = outerHeight;
6154
+ SAFE_HEAP_STORE((((uiEvent) + (24)) >> 2) * 4, outerHeight, 4);
5989
6155
  checkInt32(outerHeight);
5990
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((uiEvent) + (28)) >> 2), "storing")] = pageXOffset | 0;
6156
+ SAFE_HEAP_STORE((((uiEvent) + (28)) >> 2) * 4, pageXOffset | 0, 4);
5991
6157
  checkInt32(pageXOffset | 0);
5992
6158
  // scroll offsets are float
5993
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((uiEvent) + (32)) >> 2), "storing")] = pageYOffset | 0;
6159
+ SAFE_HEAP_STORE((((uiEvent) + (32)) >> 2) * 4, pageYOffset | 0, 4);
5994
6160
  checkInt32(pageYOffset | 0);
5995
6161
  if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, uiEvent, userData); else if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, uiEvent, userData)) e.preventDefault();
5996
6162
  };
@@ -6040,34 +6206,34 @@ var registerTouchEventCallback = (target, userData, useCapture, callbackfunc, ev
6040
6206
  touches[t.identifier].onTarget = 1;
6041
6207
  }
6042
6208
  var touchEvent = targetThread ? _malloc(1552) : JSEvents.touchEvent;
6043
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, ((touchEvent) >> 3), "storing")] = e.timeStamp;
6044
- HEAP8[SAFE_HEAP_INDEX(HEAP8, touchEvent + 12, "storing")] = e.ctrlKey;
6045
- HEAP8[SAFE_HEAP_INDEX(HEAP8, touchEvent + 13, "storing")] = e.shiftKey;
6046
- HEAP8[SAFE_HEAP_INDEX(HEAP8, touchEvent + 14, "storing")] = e.altKey;
6047
- HEAP8[SAFE_HEAP_INDEX(HEAP8, touchEvent + 15, "storing")] = e.metaKey;
6209
+ SAFE_HEAP_STORE_D(((touchEvent) >> 3) * 8, e.timeStamp, 8);
6210
+ SAFE_HEAP_STORE(touchEvent + 12, e.ctrlKey, 1);
6211
+ SAFE_HEAP_STORE(touchEvent + 13, e.shiftKey, 1);
6212
+ SAFE_HEAP_STORE(touchEvent + 14, e.altKey, 1);
6213
+ SAFE_HEAP_STORE(touchEvent + 15, e.metaKey, 1);
6048
6214
  var idx = touchEvent + 16;
6049
6215
  var targetRect = getBoundingClientRect(target);
6050
6216
  var numTouches = 0;
6051
6217
  for (let t of Object.values(touches)) {
6052
6218
  var idx32 = ((idx) >> 2);
6053
6219
  // Pre-shift the ptr to index to HEAP32 to save code size
6054
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 0, "storing")] = t.identifier;
6055
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 1, "storing")] = t.screenX;
6056
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 2, "storing")] = t.screenY;
6057
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 3, "storing")] = t.clientX;
6058
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 4, "storing")] = t.clientY;
6059
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 5, "storing")] = t.pageX;
6060
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 6, "storing")] = t.pageY;
6061
- HEAP8[SAFE_HEAP_INDEX(HEAP8, idx + 28, "storing")] = t.isChanged;
6062
- HEAP8[SAFE_HEAP_INDEX(HEAP8, idx + 29, "storing")] = t.onTarget;
6063
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 8, "storing")] = t.clientX - (targetRect.left | 0);
6064
- HEAP32[SAFE_HEAP_INDEX(HEAP32, idx32 + 9, "storing")] = t.clientY - (targetRect.top | 0);
6220
+ SAFE_HEAP_STORE((idx32 + 0) * 4, t.identifier, 4);
6221
+ SAFE_HEAP_STORE((idx32 + 1) * 4, t.screenX, 4);
6222
+ SAFE_HEAP_STORE((idx32 + 2) * 4, t.screenY, 4);
6223
+ SAFE_HEAP_STORE((idx32 + 3) * 4, t.clientX, 4);
6224
+ SAFE_HEAP_STORE((idx32 + 4) * 4, t.clientY, 4);
6225
+ SAFE_HEAP_STORE((idx32 + 5) * 4, t.pageX, 4);
6226
+ SAFE_HEAP_STORE((idx32 + 6) * 4, t.pageY, 4);
6227
+ SAFE_HEAP_STORE(idx + 28, t.isChanged, 1);
6228
+ SAFE_HEAP_STORE(idx + 29, t.onTarget, 1);
6229
+ SAFE_HEAP_STORE((idx32 + 8) * 4, t.clientX - (targetRect.left | 0), 4);
6230
+ SAFE_HEAP_STORE((idx32 + 9) * 4, t.clientY - (targetRect.top | 0), 4);
6065
6231
  idx += 48;
6066
6232
  if (++numTouches > 31) {
6067
6233
  break;
6068
6234
  }
6069
6235
  }
6070
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((touchEvent) + (8)) >> 2), "storing")] = numTouches;
6236
+ SAFE_HEAP_STORE((((touchEvent) + (8)) >> 2) * 4, numTouches, 4);
6071
6237
  checkInt32(numTouches);
6072
6238
  if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, touchEvent, userData); else if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, touchEvent, userData)) e.preventDefault();
6073
6239
  };
@@ -6105,10 +6271,9 @@ function _emscripten_set_touchstart_callback_on_thread(target, userData, useCapt
6105
6271
  var fillVisibilityChangeEventData = eventStruct => {
6106
6272
  var visibilityStates = [ "hidden", "visible", "prerender", "unloaded" ];
6107
6273
  var visibilityState = visibilityStates.indexOf(document.visibilityState);
6108
- // Assigning a boolean to HEAP32 with expected type coercion.
6109
- /** @suppress{checkTypes} */ HEAP8[SAFE_HEAP_INDEX(HEAP8, eventStruct, "storing")] = document.hidden;
6274
+ SAFE_HEAP_STORE(eventStruct, document.hidden, 1);
6110
6275
  checkInt8(document.hidden);
6111
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventStruct) + (4)) >> 2), "storing")] = visibilityState;
6276
+ SAFE_HEAP_STORE((((eventStruct) + (4)) >> 2) * 4, visibilityState, 4);
6112
6277
  checkInt32(visibilityState);
6113
6278
  };
6114
6279
 
@@ -6146,10 +6311,10 @@ var registerWheelEventCallback = (target, userData, useCapture, callbackfunc, ev
6146
6311
  var wheelEvent = targetThread ? _malloc(96) : JSEvents.wheelEvent;
6147
6312
  // This allocated block is passed as satellite data to the proxied function call, so the call frees up the data block when done.
6148
6313
  fillMouseEventData(wheelEvent, e, target);
6149
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((wheelEvent) + (64)) >> 3), "storing")] = e["deltaX"];
6150
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((wheelEvent) + (72)) >> 3), "storing")] = e["deltaY"];
6151
- HEAPF64[SAFE_HEAP_INDEX(HEAPF64, (((wheelEvent) + (80)) >> 3), "storing")] = e["deltaZ"];
6152
- HEAP32[SAFE_HEAP_INDEX(HEAP32, (((wheelEvent) + (88)) >> 2), "storing")] = e["deltaMode"];
6314
+ SAFE_HEAP_STORE_D((((wheelEvent) + (64)) >> 3) * 8, e["deltaX"], 8);
6315
+ SAFE_HEAP_STORE_D((((wheelEvent) + (72)) >> 3) * 8, e["deltaY"], 8);
6316
+ SAFE_HEAP_STORE_D((((wheelEvent) + (80)) >> 3) * 8, e["deltaZ"], 8);
6317
+ SAFE_HEAP_STORE((((wheelEvent) + (88)) >> 2) * 4, e["deltaMode"], 4);
6153
6318
  checkInt32(e["deltaMode"]);
6154
6319
  if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, wheelEvent, userData); else if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, wheelEvent, userData)) e.preventDefault();
6155
6320
  };
@@ -6176,64 +6341,63 @@ function _emscripten_set_wheel_callback_on_thread(target, userData, useCapture,
6176
6341
  }
6177
6342
 
6178
6343
  var Fetch = {
6179
- async openDatabase(dbname, dbversion) {
6180
- return new Promise((resolve, reject) => {
6181
- try {
6182
- var openRequest = indexedDB.open(dbname, dbversion);
6183
- } catch (e) {
6184
- return reject(e);
6344
+ openDatabase(dbname, dbversion, onsuccess, onerror) {
6345
+ try {
6346
+ var openRequest = indexedDB.open(dbname, dbversion);
6347
+ } catch (e) {
6348
+ return onerror(e);
6349
+ }
6350
+ openRequest.onupgradeneeded = event => {
6351
+ var db = /** @type {IDBDatabase} */ (event.target.result);
6352
+ if (db.objectStoreNames.contains("FILES")) {
6353
+ db.deleteObjectStore("FILES");
6185
6354
  }
6186
- openRequest.onupgradeneeded = event => {
6187
- var db = /** @type {IDBDatabase} */ (event.target.result);
6188
- if (db.objectStoreNames.contains("FILES")) {
6189
- db.deleteObjectStore("FILES");
6190
- }
6191
- db.createObjectStore("FILES");
6192
- };
6193
- openRequest.onsuccess = event => resolve(event.target.result);
6194
- openRequest.onerror = reject;
6195
- });
6355
+ db.createObjectStore("FILES");
6356
+ };
6357
+ openRequest.onsuccess = event => onsuccess(event.target.result);
6358
+ openRequest.onerror = onerror;
6196
6359
  },
6197
- async init() {
6360
+ init() {
6198
6361
  Fetch.xhrs = new HandleAllocator;
6199
6362
  if (ENVIRONMENT_IS_PTHREAD) return;
6200
- addRunDependency("library_fetch_init");
6201
- try {
6202
- var db = await Fetch.openDatabase("emscripten_filesystem", 1);
6363
+ var onsuccess = db => {
6203
6364
  Fetch.dbInstance = db;
6204
- } catch (e) {
6365
+ removeRunDependency("library_fetch_init");
6366
+ };
6367
+ var onerror = () => {
6205
6368
  Fetch.dbInstance = false;
6206
- } finally {
6207
6369
  removeRunDependency("library_fetch_init");
6208
- }
6370
+ };
6371
+ addRunDependency("library_fetch_init");
6372
+ Fetch.openDatabase("emscripten_filesystem", 1, onsuccess, onerror);
6209
6373
  }
6210
6374
  };
6211
6375
 
6212
6376
  function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6213
- var url = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (8)) >> 2), "loading")];
6377
+ var url = SAFE_HEAP_LOAD((((fetch) + (8)) >> 2) * 4, 4, 1);
6214
6378
  if (!url) {
6215
- onerror(fetch, "no url specified!");
6379
+ onerror(fetch, 0, "no url specified!");
6216
6380
  return;
6217
6381
  }
6218
6382
  var url_ = UTF8ToString(url);
6219
6383
  var fetch_attr = fetch + 108;
6220
6384
  var requestMethod = UTF8ToString(fetch_attr + 0);
6221
6385
  requestMethod ||= "GET";
6222
- var timeoutMsecs = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (56)) >> 2), "loading")];
6223
- var userName = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (68)) >> 2), "loading")];
6224
- var password = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (72)) >> 2), "loading")];
6225
- var requestHeaders = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (76)) >> 2), "loading")];
6226
- var overriddenMimeType = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (80)) >> 2), "loading")];
6227
- var dataPtr = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (84)) >> 2), "loading")];
6228
- var dataLength = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (88)) >> 2), "loading")];
6229
- var fetchAttributes = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (52)) >> 2), "loading")];
6386
+ var timeoutMsecs = SAFE_HEAP_LOAD((((fetch_attr) + (56)) >> 2) * 4, 4, 1);
6387
+ var userName = SAFE_HEAP_LOAD((((fetch_attr) + (68)) >> 2) * 4, 4, 1);
6388
+ var password = SAFE_HEAP_LOAD((((fetch_attr) + (72)) >> 2) * 4, 4, 1);
6389
+ var requestHeaders = SAFE_HEAP_LOAD((((fetch_attr) + (76)) >> 2) * 4, 4, 1);
6390
+ var overriddenMimeType = SAFE_HEAP_LOAD((((fetch_attr) + (80)) >> 2) * 4, 4, 1);
6391
+ var dataPtr = SAFE_HEAP_LOAD((((fetch_attr) + (84)) >> 2) * 4, 4, 1);
6392
+ var dataLength = SAFE_HEAP_LOAD((((fetch_attr) + (88)) >> 2) * 4, 4, 1);
6393
+ var fetchAttributes = SAFE_HEAP_LOAD((((fetch_attr) + (52)) >> 2) * 4, 4, 1);
6230
6394
  var fetchAttrLoadToMemory = !!(fetchAttributes & 1);
6231
6395
  var fetchAttrStreamData = !!(fetchAttributes & 2);
6232
6396
  var fetchAttrSynchronous = !!(fetchAttributes & 64);
6233
6397
  var userNameStr = userName ? UTF8ToString(userName) : undefined;
6234
6398
  var passwordStr = password ? UTF8ToString(password) : undefined;
6235
6399
  var xhr = new XMLHttpRequest;
6236
- xhr.withCredentials = !!HEAPU8[SAFE_HEAP_INDEX(HEAPU8, (fetch_attr) + (60), "loading")];
6400
+ xhr.withCredentials = !!SAFE_HEAP_LOAD((fetch_attr) + (60), 1, 1);
6237
6401
  xhr.open(requestMethod, url_, !fetchAttrSynchronous, userNameStr, passwordStr);
6238
6402
  if (!fetchAttrSynchronous) xhr.timeout = timeoutMsecs;
6239
6403
  // XHR timeout field is only accessible in async XHRs, and must be set after .open() but before .send().
@@ -6247,9 +6411,9 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6247
6411
  }
6248
6412
  if (requestHeaders) {
6249
6413
  for (;;) {
6250
- var key = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((requestHeaders) >> 2), "loading")];
6414
+ var key = SAFE_HEAP_LOAD(((requestHeaders) >> 2) * 4, 4, 1);
6251
6415
  if (!key) break;
6252
- var value = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((requestHeaders) + (4)) >> 2), "loading")];
6416
+ var value = SAFE_HEAP_LOAD((((requestHeaders) + (4)) >> 2) * 4, 4, 1);
6253
6417
  if (!value) break;
6254
6418
  requestHeaders += 8;
6255
6419
  var keyStr = UTF8ToString(key);
@@ -6258,7 +6422,7 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6258
6422
  }
6259
6423
  }
6260
6424
  var id = Fetch.xhrs.allocate(xhr);
6261
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((fetch) >> 2), "storing")] = id;
6425
+ SAFE_HEAP_STORE(((fetch) >> 2) * 4, id, 4);
6262
6426
  checkInt32(id);
6263
6427
  var data = (dataPtr && dataLength) ? HEAPU8.slice(dataPtr, dataPtr + dataLength) : null;
6264
6428
  // TODO: Support specifying custom headers to the request.
@@ -6269,7 +6433,7 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6269
6433
  function saveResponseAndStatus() {
6270
6434
  var ptr = 0;
6271
6435
  var ptrLen = 0;
6272
- if (xhr.response && fetchAttrLoadToMemory && HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (12)) >> 2), "loading")] === 0) {
6436
+ if (xhr.response && fetchAttrLoadToMemory && SAFE_HEAP_LOAD((((fetch) + (12)) >> 2) * 4, 4, 1) === 0) {
6273
6437
  ptrLen = xhr.response.byteLength;
6274
6438
  }
6275
6439
  if (ptrLen > 0) {
@@ -6278,7 +6442,7 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6278
6442
  ptr = _malloc(ptrLen);
6279
6443
  HEAPU8.set(new Uint8Array(/** @type{Array<number>} */ (xhr.response)), ptr);
6280
6444
  }
6281
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (12)) >> 2), "storing")] = ptr;
6445
+ SAFE_HEAP_STORE((((fetch) + (12)) >> 2) * 4, ptr, 4);
6282
6446
  writeI53ToI64(fetch + 16, ptrLen);
6283
6447
  writeI53ToI64(fetch + 24, 0);
6284
6448
  var len = xhr.response ? xhr.response.byteLength : 0;
@@ -6288,17 +6452,11 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6288
6452
  // the most recent XHR.onprogress handler.
6289
6453
  writeI53ToI64(fetch + 32, len);
6290
6454
  }
6291
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = xhr.readyState;
6455
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, xhr.readyState, 2);
6292
6456
  checkInt16(xhr.readyState);
6293
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = xhr.status;
6457
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, xhr.status, 2);
6294
6458
  checkInt16(xhr.status);
6295
6459
  if (xhr.statusText) stringToUTF8(xhr.statusText, fetch + 44, 64);
6296
- if (fetchAttrSynchronous) {
6297
- // The response url pointer malloc()ed here has the same lifetime as the emscripten_fetch_t structure itself has, and is
6298
- // freed when emscripten_fetch_close() is called.
6299
- var ruPtr = stringToNewUTF8(xhr.responseURL);
6300
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (200)) >> 2), "storing")] = ruPtr;
6301
- }
6302
6460
  }
6303
6461
  xhr.onload = e => {
6304
6462
  // check if xhr was aborted by user and don't try to call back
@@ -6307,9 +6465,9 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6307
6465
  }
6308
6466
  saveResponseAndStatus();
6309
6467
  if (xhr.status >= 200 && xhr.status < 300) {
6310
- onsuccess(fetch, xhr, e);
6468
+ onsuccess?.(fetch, xhr, e);
6311
6469
  } else {
6312
- onerror(fetch, e);
6470
+ onerror?.(fetch, xhr, e);
6313
6471
  }
6314
6472
  };
6315
6473
  xhr.onerror = e => {
@@ -6318,14 +6476,14 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6318
6476
  return;
6319
6477
  }
6320
6478
  saveResponseAndStatus();
6321
- onerror(fetch, e);
6479
+ onerror?.(fetch, xhr, e);
6322
6480
  };
6323
6481
  xhr.ontimeout = e => {
6324
6482
  // check if xhr was aborted by user and don't try to call back
6325
6483
  if (!Fetch.xhrs.has(id)) {
6326
6484
  return;
6327
6485
  }
6328
- onerror(fetch, e);
6486
+ onerror?.(fetch, xhr, e);
6329
6487
  };
6330
6488
  xhr.onprogress = e => {
6331
6489
  // check if xhr was aborted by user and don't try to call back
@@ -6340,20 +6498,21 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6340
6498
  ptr = _malloc(ptrLen);
6341
6499
  HEAPU8.set(new Uint8Array(/** @type{Array<number>} */ (xhr.response)), ptr);
6342
6500
  }
6343
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (12)) >> 2), "storing")] = ptr;
6501
+ SAFE_HEAP_STORE((((fetch) + (12)) >> 2) * 4, ptr, 4);
6344
6502
  writeI53ToI64(fetch + 16, ptrLen);
6345
6503
  writeI53ToI64(fetch + 24, e.loaded - ptrLen);
6346
6504
  writeI53ToI64(fetch + 32, e.total);
6347
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = xhr.readyState;
6505
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, xhr.readyState, 2);
6348
6506
  checkInt16(xhr.readyState);
6349
- var status = xhr.status;
6350
6507
  // If loading files from a source that does not give HTTP status code, assume success if we get data bytes
6351
- if (xhr.readyState >= 3 && xhr.status === 0 && e.loaded > 0) status = 200;
6352
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = status;
6353
- checkInt16(status);
6508
+ if (xhr.readyState >= 3 && xhr.status === 0 && e.loaded > 0) xhr.status = 200;
6509
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, xhr.status, 2);
6510
+ checkInt16(xhr.status);
6354
6511
  if (xhr.statusText) stringToUTF8(xhr.statusText, fetch + 44, 64);
6355
- onprogress(fetch, e);
6356
- _free(ptr);
6512
+ onprogress?.(fetch, xhr, e);
6513
+ if (ptr) {
6514
+ _free(ptr);
6515
+ }
6357
6516
  };
6358
6517
  xhr.onreadystatechange = e => {
6359
6518
  // check if xhr was aborted by user and don't try to call back
@@ -6361,47 +6520,34 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
6361
6520
  runtimeKeepalivePop();
6362
6521
  return;
6363
6522
  }
6364
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = xhr.readyState;
6523
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, xhr.readyState, 2);
6365
6524
  checkInt16(xhr.readyState);
6366
6525
  if (xhr.readyState >= 2) {
6367
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = xhr.status;
6526
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, xhr.status, 2);
6368
6527
  checkInt16(xhr.status);
6369
6528
  }
6370
- if (!fetchAttrSynchronous && (xhr.readyState === 2 && xhr.responseURL.length > 0)) {
6371
- // The response url pointer malloc()ed here has the same lifetime as the emscripten_fetch_t structure itself has, and is
6372
- // freed when emscripten_fetch_close() is called.
6373
- var ruPtr = stringToNewUTF8(xhr.responseURL);
6374
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (200)) >> 2), "storing")] = ruPtr;
6375
- }
6376
- onreadystatechange(fetch, e);
6529
+ onreadystatechange?.(fetch, xhr, e);
6377
6530
  };
6378
6531
  try {
6379
6532
  xhr.send(data);
6380
6533
  } catch (e) {
6381
- onerror(fetch, e);
6534
+ onerror?.(fetch, xhr, e);
6382
6535
  }
6383
6536
  }
6384
6537
 
6385
- var readI53FromI64 = ptr => HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((ptr) >> 2), "loading")] + HEAP32[SAFE_HEAP_INDEX(HEAP32, (((ptr) + (4)) >> 2), "loading")] * 4294967296;
6538
+ var readI53FromI64 = ptr => SAFE_HEAP_LOAD(((ptr) >> 2) * 4, 4, 1) + SAFE_HEAP_LOAD((((ptr) + (4)) >> 2) * 4, 4, 0) * 4294967296;
6386
6539
 
6387
- var readI53FromU64 = ptr => HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((ptr) >> 2), "loading")] + HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((ptr) + (4)) >> 2), "loading")] * 4294967296;
6540
+ var readI53FromU64 = ptr => SAFE_HEAP_LOAD(((ptr) >> 2) * 4, 4, 1) + SAFE_HEAP_LOAD((((ptr) + (4)) >> 2) * 4, 4, 1) * 4294967296;
6388
6541
 
6389
6542
  var writeI53ToI64 = (ptr, num) => {
6390
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((ptr) >> 2), "storing")] = num;
6543
+ SAFE_HEAP_STORE(((ptr) >> 2) * 4, num, 4);
6391
6544
  checkInt32(num);
6392
- var lower = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((ptr) >> 2), "loading")];
6393
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((ptr) + (4)) >> 2), "storing")] = (num - lower) / 4294967296;
6545
+ var lower = SAFE_HEAP_LOAD(((ptr) >> 2) * 4, 4, 1);
6546
+ SAFE_HEAP_STORE((((ptr) + (4)) >> 2) * 4, (num - lower) / 4294967296, 4);
6394
6547
  checkInt32((num - lower) / 4294967296);
6395
6548
  var deserialized = (num >= 0) ? readI53FromU64(ptr) : readI53FromI64(ptr);
6396
6549
  var offset = ((ptr) >> 2);
6397
- if (deserialized != num) warnOnce(`writeI53ToI64() out of range: serialized JS Number ${num} to Wasm heap as bytes lo=${ptrToString(HEAPU32[SAFE_HEAP_INDEX(HEAPU32, offset, "loading")])}, hi=${ptrToString(HEAPU32[SAFE_HEAP_INDEX(HEAPU32, offset + 1, "loading")])}, which deserializes back to ${deserialized} instead!`);
6398
- };
6399
-
6400
- var stringToNewUTF8 = str => {
6401
- var size = lengthBytesUTF8(str) + 1;
6402
- var ret = _malloc(size);
6403
- if (ret) stringToUTF8(str, ret, size);
6404
- return ret;
6550
+ if (deserialized != num) warnOnce(`writeI53ToI64() out of range: serialized JS Number ${num} to Wasm heap as bytes lo=${ptrToString(SAFE_HEAP_LOAD(offset * 4, 4, 1))}, hi=${ptrToString(SAFE_HEAP_LOAD((offset + 1) * 4, 4, 1))}, which deserializes back to ${deserialized} instead!`);
6405
6551
  };
6406
6552
 
6407
6553
  function fetchCacheData(/** @type {IDBDatabase} */ db, fetch, data, onsuccess, onerror) {
@@ -6410,18 +6556,18 @@ function fetchCacheData(/** @type {IDBDatabase} */ db, fetch, data, onsuccess, o
6410
6556
  return;
6411
6557
  }
6412
6558
  var fetch_attr = fetch + 108;
6413
- var destinationPath = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (64)) >> 2), "loading")];
6414
- destinationPath ||= HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (8)) >> 2), "loading")];
6559
+ var destinationPath = SAFE_HEAP_LOAD((((fetch_attr) + (64)) >> 2) * 4, 4, 1);
6560
+ destinationPath ||= SAFE_HEAP_LOAD((((fetch) + (8)) >> 2) * 4, 4, 1);
6415
6561
  var destinationPathStr = UTF8ToString(destinationPath);
6416
6562
  try {
6417
6563
  var transaction = db.transaction([ "FILES" ], "readwrite");
6418
6564
  var packages = transaction.objectStore("FILES");
6419
6565
  var putRequest = packages.put(data, destinationPathStr);
6420
6566
  putRequest.onsuccess = event => {
6421
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = 4;
6567
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, 4, 2);
6422
6568
  checkInt16(4);
6423
6569
  // Mimic XHR readyState 4 === 'DONE: The operation is complete'
6424
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = 200;
6570
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, 200, 2);
6425
6571
  checkInt16(200);
6426
6572
  // Mimic XHR HTTP status code 200 "OK"
6427
6573
  stringToUTF8("OK", fetch + 44, 64);
@@ -6431,10 +6577,10 @@ function fetchCacheData(/** @type {IDBDatabase} */ db, fetch, data, onsuccess, o
6431
6577
  // Most likely we got an error if IndexedDB is unwilling to store any more data for this page.
6432
6578
  // TODO: Can we identify and break down different IndexedDB-provided errors and convert those
6433
6579
  // to more HTTP status codes for more information?
6434
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = 4;
6580
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, 4, 2);
6435
6581
  checkInt16(4);
6436
6582
  // Mimic XHR readyState 4 === 'DONE: The operation is complete'
6437
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = 413;
6583
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, 413, 2);
6438
6584
  checkInt16(413);
6439
6585
  // Mimic XHR HTTP status code 413 "Payload Too Large"
6440
6586
  stringToUTF8("Payload Too Large", fetch + 44, 64);
@@ -6451,8 +6597,8 @@ function fetchLoadCachedData(db, fetch, onsuccess, onerror) {
6451
6597
  return;
6452
6598
  }
6453
6599
  var fetch_attr = fetch + 108;
6454
- var path = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (64)) >> 2), "loading")];
6455
- path ||= HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (8)) >> 2), "loading")];
6600
+ var path = SAFE_HEAP_LOAD((((fetch_attr) + (64)) >> 2) * 4, 4, 1);
6601
+ path ||= SAFE_HEAP_LOAD((((fetch) + (8)) >> 2) * 4, 4, 1);
6456
6602
  var pathStr = UTF8ToString(path);
6457
6603
  try {
6458
6604
  var transaction = db.transaction([ "FILES" ], "readonly");
@@ -6466,24 +6612,24 @@ function fetchLoadCachedData(db, fetch, onsuccess, onerror) {
6466
6612
  // freed when emscripten_fetch_close() is called.
6467
6613
  var ptr = _malloc(len);
6468
6614
  HEAPU8.set(new Uint8Array(value), ptr);
6469
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (12)) >> 2), "storing")] = ptr;
6615
+ SAFE_HEAP_STORE((((fetch) + (12)) >> 2) * 4, ptr, 4);
6470
6616
  writeI53ToI64(fetch + 16, len);
6471
6617
  writeI53ToI64(fetch + 24, 0);
6472
6618
  writeI53ToI64(fetch + 32, len);
6473
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = 4;
6619
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, 4, 2);
6474
6620
  checkInt16(4);
6475
6621
  // Mimic XHR readyState 4 === 'DONE: The operation is complete'
6476
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = 200;
6622
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, 200, 2);
6477
6623
  checkInt16(200);
6478
6624
  // Mimic XHR HTTP status code 200 "OK"
6479
6625
  stringToUTF8("OK", fetch + 44, 64);
6480
6626
  onsuccess(fetch, 0, value);
6481
6627
  } else {
6482
6628
  // Succeeded to load, but the load came back with the value of undefined, treat that as an error since we never store undefined in db.
6483
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = 4;
6629
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, 4, 2);
6484
6630
  checkInt16(4);
6485
6631
  // Mimic XHR readyState 4 === 'DONE: The operation is complete'
6486
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = 404;
6632
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, 404, 2);
6487
6633
  checkInt16(404);
6488
6634
  // Mimic XHR HTTP status code 404 "Not Found"
6489
6635
  stringToUTF8("Not Found", fetch + 44, 64);
@@ -6491,10 +6637,10 @@ function fetchLoadCachedData(db, fetch, onsuccess, onerror) {
6491
6637
  }
6492
6638
  };
6493
6639
  getRequest.onerror = error => {
6494
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = 4;
6640
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, 4, 2);
6495
6641
  checkInt16(4);
6496
6642
  // Mimic XHR readyState 4 === 'DONE: The operation is complete'
6497
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = 404;
6643
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, 404, 2);
6498
6644
  checkInt16(404);
6499
6645
  // Mimic XHR HTTP status code 404 "Not Found"
6500
6646
  stringToUTF8("Not Found", fetch + 44, 64);
@@ -6511,8 +6657,8 @@ function fetchDeleteCachedData(db, fetch, onsuccess, onerror) {
6511
6657
  return;
6512
6658
  }
6513
6659
  var fetch_attr = fetch + 108;
6514
- var path = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (64)) >> 2), "loading")];
6515
- path ||= HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (8)) >> 2), "loading")];
6660
+ var path = SAFE_HEAP_LOAD((((fetch_attr) + (64)) >> 2) * 4, 4, 1);
6661
+ path ||= SAFE_HEAP_LOAD((((fetch) + (8)) >> 2) * 4, 4, 1);
6516
6662
  var pathStr = UTF8ToString(path);
6517
6663
  try {
6518
6664
  var transaction = db.transaction([ "FILES" ], "readwrite");
@@ -6520,24 +6666,24 @@ function fetchDeleteCachedData(db, fetch, onsuccess, onerror) {
6520
6666
  var request = packages.delete(pathStr);
6521
6667
  request.onsuccess = event => {
6522
6668
  var value = event.target.result;
6523
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch) + (12)) >> 2), "storing")] = 0;
6669
+ SAFE_HEAP_STORE((((fetch) + (12)) >> 2) * 4, 0, 4);
6524
6670
  writeI53ToI64(fetch + 16, 0);
6525
6671
  writeI53ToI64(fetch + 24, 0);
6526
6672
  writeI53ToI64(fetch + 32, 0);
6527
6673
  // Mimic XHR readyState 4 === 'DONE: The operation is complete'
6528
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = 4;
6674
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, 4, 2);
6529
6675
  checkInt16(4);
6530
6676
  // Mimic XHR HTTP status code 200 "OK"
6531
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = 200;
6677
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, 200, 2);
6532
6678
  checkInt16(200);
6533
6679
  stringToUTF8("OK", fetch + 44, 64);
6534
6680
  onsuccess(fetch, 0, value);
6535
6681
  };
6536
6682
  request.onerror = error => {
6537
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (40)) >> 1), "storing")] = 4;
6683
+ SAFE_HEAP_STORE((((fetch) + (40)) >> 1) * 2, 4, 2);
6538
6684
  checkInt16(4);
6539
6685
  // Mimic XHR readyState 4 === 'DONE: The operation is complete'
6540
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((fetch) + (42)) >> 1), "storing")] = 404;
6686
+ SAFE_HEAP_STORE((((fetch) + (42)) >> 1) * 2, 404, 2);
6541
6687
  checkInt16(404);
6542
6688
  // Mimic XHR HTTP status code 404 "Not Found"
6543
6689
  stringToUTF8("Not Found", fetch + 44, 64);
@@ -6553,11 +6699,11 @@ function _emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readysta
6553
6699
  // response.
6554
6700
  runtimeKeepalivePush();
6555
6701
  var fetch_attr = fetch + 108;
6556
- var onsuccess = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (36)) >> 2), "loading")];
6557
- var onerror = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (40)) >> 2), "loading")];
6558
- var onprogress = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (44)) >> 2), "loading")];
6559
- var onreadystatechange = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (48)) >> 2), "loading")];
6560
- var fetchAttributes = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (52)) >> 2), "loading")];
6702
+ var onsuccess = SAFE_HEAP_LOAD((((fetch_attr) + (36)) >> 2) * 4, 4, 1);
6703
+ var onerror = SAFE_HEAP_LOAD((((fetch_attr) + (40)) >> 2) * 4, 4, 1);
6704
+ var onprogress = SAFE_HEAP_LOAD((((fetch_attr) + (44)) >> 2) * 4, 4, 1);
6705
+ var onreadystatechange = SAFE_HEAP_LOAD((((fetch_attr) + (48)) >> 2) * 4, 4, 1);
6706
+ var fetchAttributes = SAFE_HEAP_LOAD((((fetch_attr) + (52)) >> 2) * 4, 4, 1);
6561
6707
  var fetchAttrSynchronous = !!(fetchAttributes & 64);
6562
6708
  function doCallback(f) {
6563
6709
  if (fetchAttrSynchronous) {
@@ -6572,18 +6718,18 @@ function _emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readysta
6572
6718
  if (onsuccess) (a1 => dynCall_vi(onsuccess, a1))(fetch); else successcb?.(fetch);
6573
6719
  });
6574
6720
  };
6575
- var reportProgress = (fetch, e) => {
6721
+ var reportProgress = (fetch, xhr, e) => {
6576
6722
  doCallback(() => {
6577
6723
  if (onprogress) (a1 => dynCall_vi(onprogress, a1))(fetch); else progresscb?.(fetch);
6578
6724
  });
6579
6725
  };
6580
- var reportError = (fetch, e) => {
6726
+ var reportError = (fetch, xhr, e) => {
6581
6727
  runtimeKeepalivePop();
6582
6728
  doCallback(() => {
6583
6729
  if (onerror) (a1 => dynCall_vi(onerror, a1))(fetch); else errorcb?.(fetch);
6584
6730
  });
6585
6731
  };
6586
- var reportReadyStateChange = (fetch, e) => {
6732
+ var reportReadyStateChange = (fetch, xhr, e) => {
6587
6733
  doCallback(() => {
6588
6734
  if (onreadystatechange) (a1 => dynCall_vi(onreadystatechange, a1))(fetch); else readystatechangecb?.(fetch);
6589
6735
  });
@@ -6615,8 +6761,8 @@ function _emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readysta
6615
6761
  var fetchAttrNoDownload = !!(fetchAttributes & 32);
6616
6762
  if (requestMethod === "EM_IDB_STORE") {
6617
6763
  // TODO(?): Here we perform a clone of the data, because storing shared typed arrays to IndexedDB does not seem to be allowed.
6618
- var ptr = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (84)) >> 2), "loading")];
6619
- var size = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((fetch_attr) + (88)) >> 2), "loading")];
6764
+ var ptr = SAFE_HEAP_LOAD((((fetch_attr) + (84)) >> 2) * 4, 4, 1);
6765
+ var size = SAFE_HEAP_LOAD((((fetch_attr) + (88)) >> 2) * 4, 4, 1);
6620
6766
  fetchCacheData(Fetch.dbInstance, fetch, HEAPU8.slice(ptr, ptr + size), reportSuccess, reportError);
6621
6767
  } else if (requestMethod === "EM_IDB_DELETE") {
6622
6768
  fetchDeleteCachedData(Fetch.dbInstance, fetch, reportSuccess, reportError);
@@ -6644,7 +6790,7 @@ var WS = {
6644
6790
  // Singleton event pointer. Use EmscriptenWebSocketCloseEvent, which is
6645
6791
  // the largest event struct
6646
6792
  this.socketEvent ||= _malloc(520);
6647
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((this.socketEvent) >> 2), "storing")] = socketId;
6793
+ SAFE_HEAP_STORE(((this.socketEvent) >> 2) * 4, socketId, 4);
6648
6794
  checkInt32(socketId);
6649
6795
  return this.socketEvent;
6650
6796
  }
@@ -6683,7 +6829,7 @@ function _emscripten_websocket_get_buffered_amount(socketId, bufferedAmount) {
6683
6829
  if (!socket) {
6684
6830
  return -3;
6685
6831
  }
6686
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((bufferedAmount) >> 2), "storing")] = socket.bufferedAmount;
6832
+ SAFE_HEAP_STORE(((bufferedAmount) >> 2) * 4, socket.bufferedAmount, 4);
6687
6833
  return 0;
6688
6834
  }
6689
6835
 
@@ -6705,7 +6851,7 @@ function _emscripten_websocket_get_extensions_length(socketId, extensionsLength)
6705
6851
  return -3;
6706
6852
  }
6707
6853
  if (!extensionsLength) return -5;
6708
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((extensionsLength) >> 2), "storing")] = lengthBytesUTF8(socket.extensions) + 1;
6854
+ SAFE_HEAP_STORE(((extensionsLength) >> 2) * 4, lengthBytesUTF8(socket.extensions) + 1, 4);
6709
6855
  checkInt32(lengthBytesUTF8(socket.extensions) + 1);
6710
6856
  return 0;
6711
6857
  }
@@ -6728,7 +6874,7 @@ function _emscripten_websocket_get_protocol_length(socketId, protocolLength) {
6728
6874
  return -3;
6729
6875
  }
6730
6876
  if (!protocolLength) return -5;
6731
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((protocolLength) >> 2), "storing")] = lengthBytesUTF8(socket.protocol) + 1;
6877
+ SAFE_HEAP_STORE(((protocolLength) >> 2) * 4, lengthBytesUTF8(socket.protocol) + 1, 4);
6732
6878
  checkInt32(lengthBytesUTF8(socket.protocol) + 1);
6733
6879
  return 0;
6734
6880
  }
@@ -6739,7 +6885,7 @@ function _emscripten_websocket_get_ready_state(socketId, readyState) {
6739
6885
  if (!socket) {
6740
6886
  return -3;
6741
6887
  }
6742
- HEAP16[SAFE_HEAP_INDEX(HEAP16, ((readyState) >> 1), "storing")] = socket.readyState;
6888
+ SAFE_HEAP_STORE(((readyState) >> 1) * 2, socket.readyState, 2);
6743
6889
  checkInt16(socket.readyState);
6744
6890
  return 0;
6745
6891
  }
@@ -6762,7 +6908,7 @@ function _emscripten_websocket_get_url_length(socketId, urlLength) {
6762
6908
  return -3;
6763
6909
  }
6764
6910
  if (!urlLength) return -5;
6765
- HEAP32[SAFE_HEAP_INDEX(HEAP32, ((urlLength) >> 2), "storing")] = lengthBytesUTF8(socket.url) + 1;
6911
+ SAFE_HEAP_STORE(((urlLength) >> 2) * 4, lengthBytesUTF8(socket.url) + 1, 4);
6766
6912
  checkInt32(lengthBytesUTF8(socket.url) + 1);
6767
6913
  return 0;
6768
6914
  }
@@ -6774,14 +6920,14 @@ function _emscripten_websocket_is_supported() {
6774
6920
 
6775
6921
  function _emscripten_websocket_new(createAttributes) {
6776
6922
  if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(59, 0, 1, createAttributes);
6777
- if (!globalThis.WebSocket) {
6923
+ if (typeof WebSocket == "undefined") {
6778
6924
  return -1;
6779
6925
  }
6780
6926
  if (!createAttributes) {
6781
6927
  return -5;
6782
6928
  }
6783
- var url = UTF8ToString(HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((createAttributes) >> 2), "loading")]);
6784
- var protocols = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((createAttributes) + (4)) >> 2), "loading")];
6929
+ var url = UTF8ToString(SAFE_HEAP_LOAD(((createAttributes) >> 2) * 4, 4, 1));
6930
+ var protocols = SAFE_HEAP_LOAD((((createAttributes) + (4)) >> 2) * 4, 4, 1);
6785
6931
  // TODO: Add support for createOnMainThread==false; currently all WebSocket connections are created on the main thread.
6786
6932
  // var createOnMainThread = HEAP8[createAttributes+2];
6787
6933
  var socket = protocols ? new WebSocket(url, UTF8ToString(protocols).split(",")) : new WebSocket(url);
@@ -6823,8 +6969,8 @@ function _emscripten_websocket_set_onclose_callback_on_thread(socketId, userData
6823
6969
  }
6824
6970
  socket.onclose = function(e) {
6825
6971
  var eventPtr = WS.getSocketEvent(socketId);
6826
- HEAP8[SAFE_HEAP_INDEX(HEAP8, (eventPtr) + (4), "storing")] = e.wasClean;
6827
- checkInt8(e.wasClean), HEAP16[SAFE_HEAP_INDEX(HEAP16, (((eventPtr) + (6)) >> 1), "storing")] = e.code;
6972
+ SAFE_HEAP_STORE((eventPtr) + (4), e.wasClean, 1);
6973
+ checkInt8(e.wasClean), SAFE_HEAP_STORE((((eventPtr) + (6)) >> 1) * 2, e.code, 2);
6828
6974
  checkInt16(e.code), stringToUTF8(e.reason, eventPtr + 8, 512);
6829
6975
  ((a1, a2, a3) => dynCall_iiii(callbackFunc, a1, a2, a3))(0, eventPtr, userData);
6830
6976
  };
@@ -6844,6 +6990,13 @@ function _emscripten_websocket_set_onerror_callback_on_thread(socketId, userData
6844
6990
  return 0;
6845
6991
  }
6846
6992
 
6993
+ var stringToNewUTF8 = str => {
6994
+ var size = lengthBytesUTF8(str) + 1;
6995
+ var ret = _malloc(size);
6996
+ if (ret) stringToUTF8(str, ret, size);
6997
+ return ret;
6998
+ };
6999
+
6847
7000
  function _emscripten_websocket_set_onmessage_callback_on_thread(socketId, userData, callbackFunc, thread) {
6848
7001
  if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(64, 0, 1, socketId, userData, callbackFunc, thread);
6849
7002
  var socket = WS.getSocket(socketId);
@@ -6861,8 +7014,8 @@ function _emscripten_websocket_set_onmessage_callback_on_thread(socketId, userDa
6861
7014
  HEAP8.set(new Uint8Array(e.data), buf);
6862
7015
  }
6863
7016
  var eventPtr = WS.getSocketEvent(socketId);
6864
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((eventPtr) + (4)) >> 2), "storing")] = buf, HEAP32[SAFE_HEAP_INDEX(HEAP32, (((eventPtr) + (8)) >> 2), "storing")] = len;
6865
- checkInt32(len), HEAP8[SAFE_HEAP_INDEX(HEAP8, (eventPtr) + (12), "storing")] = isText;
7017
+ SAFE_HEAP_STORE((((eventPtr) + (4)) >> 2) * 4, buf, 4), SAFE_HEAP_STORE((((eventPtr) + (8)) >> 2) * 4, len, 4);
7018
+ checkInt32(len), SAFE_HEAP_STORE((eventPtr) + (12), isText, 1);
6866
7019
  checkInt8(isText), ((a1, a2, a3) => dynCall_iiii(callbackFunc, a1, a2, a3))(0, eventPtr, userData);
6867
7020
  _free(buf);
6868
7021
  };
@@ -6893,7 +7046,7 @@ var getEnvStrings = () => {
6893
7046
  if (!getEnvStrings.strings) {
6894
7047
  // Default values.
6895
7048
  // Browser language detection #8751
6896
- var lang = ((typeof navigator == "object" && navigator.language) || "C").replace("-", "_") + ".UTF-8";
7049
+ var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "C").replace("-", "_") + ".UTF-8";
6897
7050
  var env = {
6898
7051
  "USER": "web_user",
6899
7052
  "LOGNAME": "web_user",
@@ -6925,7 +7078,8 @@ function _environ_get(__environ, environ_buf) {
6925
7078
  var envp = 0;
6926
7079
  for (var string of getEnvStrings()) {
6927
7080
  var ptr = environ_buf + bufSize;
6928
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((__environ) + (envp)) >> 2), "storing")] = ptr;
7081
+ SAFE_HEAP_STORE((((__environ) + (envp)) >> 2) * 4, ptr, 4);
7082
+ checkInt32(ptr);
6929
7083
  bufSize += stringToUTF8(string, ptr, Infinity) + 1;
6930
7084
  envp += 4;
6931
7085
  }
@@ -6935,13 +7089,13 @@ function _environ_get(__environ, environ_buf) {
6935
7089
  function _environ_sizes_get(penviron_count, penviron_buf_size) {
6936
7090
  if (ENVIRONMENT_IS_PTHREAD) return proxyToMainThread(67, 0, 1, penviron_count, penviron_buf_size);
6937
7091
  var strings = getEnvStrings();
6938
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((penviron_count) >> 2), "storing")] = strings.length;
7092
+ SAFE_HEAP_STORE(((penviron_count) >> 2) * 4, strings.length, 4);
6939
7093
  checkInt32(strings.length);
6940
7094
  var bufSize = 0;
6941
7095
  for (var string of strings) {
6942
7096
  bufSize += lengthBytesUTF8(string) + 1;
6943
7097
  }
6944
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((penviron_buf_size) >> 2), "storing")] = bufSize;
7098
+ SAFE_HEAP_STORE(((penviron_buf_size) >> 2) * 4, bufSize, 4);
6945
7099
  checkInt32(bufSize);
6946
7100
  return 0;
6947
7101
  }
@@ -6970,13 +7124,13 @@ function _fd_fdstat_get(fd, pbuf) {
6970
7124
  // assume is a character device, like the mouse, we have special APIs for).
6971
7125
  var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4;
6972
7126
  }
6973
- HEAP8[SAFE_HEAP_INDEX(HEAP8, pbuf, "storing")] = type;
7127
+ SAFE_HEAP_STORE(pbuf, type, 1);
6974
7128
  checkInt8(type);
6975
- HEAP16[SAFE_HEAP_INDEX(HEAP16, (((pbuf) + (2)) >> 1), "storing")] = flags;
7129
+ SAFE_HEAP_STORE((((pbuf) + (2)) >> 1) * 2, flags, 2);
6976
7130
  checkInt16(flags);
6977
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((pbuf) + (8)) >> 3), "storing")] = BigInt(rightsBase);
7131
+ HEAP64[(((pbuf) + (8)) >> 3)] = BigInt(rightsBase);
6978
7132
  checkInt64(rightsBase);
6979
- HEAP64[SAFE_HEAP_INDEX(HEAP64, (((pbuf) + (16)) >> 3), "storing")] = BigInt(rightsInheriting);
7133
+ HEAP64[(((pbuf) + (16)) >> 3)] = BigInt(rightsInheriting);
6980
7134
  checkInt64(rightsInheriting);
6981
7135
  return 0;
6982
7136
  } catch (e) {
@@ -6988,8 +7142,8 @@ function _fd_fdstat_get(fd, pbuf) {
6988
7142
  /** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => {
6989
7143
  var ret = 0;
6990
7144
  for (var i = 0; i < iovcnt; i++) {
6991
- var ptr = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((iov) >> 2), "loading")];
6992
- var len = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((iov) + (4)) >> 2), "loading")];
7145
+ var ptr = SAFE_HEAP_LOAD(((iov) >> 2) * 4, 4, 1);
7146
+ var len = SAFE_HEAP_LOAD((((iov) + (4)) >> 2) * 4, 4, 1);
6993
7147
  iov += 8;
6994
7148
  var curr = FS.read(stream, HEAP8, ptr, len, offset);
6995
7149
  if (curr < 0) return -1;
@@ -7004,7 +7158,7 @@ function _fd_read(fd, iov, iovcnt, pnum) {
7004
7158
  try {
7005
7159
  var stream = SYSCALLS.getStreamFromFD(fd);
7006
7160
  var num = doReadv(stream, iov, iovcnt);
7007
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((pnum) >> 2), "storing")] = num;
7161
+ SAFE_HEAP_STORE(((pnum) >> 2) * 4, num, 4);
7008
7162
  checkInt32(num);
7009
7163
  return 0;
7010
7164
  } catch (e) {
@@ -7020,7 +7174,7 @@ function _fd_seek(fd, offset, whence, newOffset) {
7020
7174
  if (isNaN(offset)) return 61;
7021
7175
  var stream = SYSCALLS.getStreamFromFD(fd);
7022
7176
  FS.llseek(stream, offset, whence);
7023
- HEAP64[SAFE_HEAP_INDEX(HEAP64, ((newOffset) >> 3), "storing")] = BigInt(stream.position);
7177
+ HEAP64[((newOffset) >> 3)] = BigInt(stream.position);
7024
7178
  checkInt64(stream.position);
7025
7179
  if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null;
7026
7180
  // reset readdir state
@@ -7034,8 +7188,8 @@ function _fd_seek(fd, offset, whence, newOffset) {
7034
7188
  /** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => {
7035
7189
  var ret = 0;
7036
7190
  for (var i = 0; i < iovcnt; i++) {
7037
- var ptr = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((iov) >> 2), "loading")];
7038
- var len = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, (((iov) + (4)) >> 2), "loading")];
7191
+ var ptr = SAFE_HEAP_LOAD(((iov) >> 2) * 4, 4, 1);
7192
+ var len = SAFE_HEAP_LOAD((((iov) + (4)) >> 2) * 4, 4, 1);
7039
7193
  iov += 8;
7040
7194
  var curr = FS.write(stream, HEAP8, ptr, len, offset);
7041
7195
  if (curr < 0) return -1;
@@ -7053,7 +7207,7 @@ function _fd_write(fd, iov, iovcnt, pnum) {
7053
7207
  try {
7054
7208
  var stream = SYSCALLS.getStreamFromFD(fd);
7055
7209
  var num = doWritev(stream, iov, iovcnt);
7056
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((pnum) >> 2), "storing")] = num;
7210
+ SAFE_HEAP_STORE(((pnum) >> 2) * 4, num, 4);
7057
7211
  checkInt32(num);
7058
7212
  return 0;
7059
7213
  } catch (e) {
@@ -7084,7 +7238,7 @@ var writeArrayToMemory = (array, buffer) => {
7084
7238
  /**
7085
7239
  * @param {string|null=} returnType
7086
7240
  * @param {Array=} argTypes
7087
- * @param {Array=} args
7241
+ * @param {Arguments|Array=} args
7088
7242
  * @param {Object=} opts
7089
7243
  */ var ccall = (ident, returnType, argTypes, args, opts) => {
7090
7244
  // For fast lookup of conversion functions
@@ -7140,9 +7294,9 @@ var writeArrayToMemory = (array, buffer) => {
7140
7294
  * @param {Object=} opts
7141
7295
  */ var cwrap = (ident, returnType, argTypes, opts) => (...args) => ccall(ident, returnType, argTypes, args);
7142
7296
 
7143
- FS.createPreloadedFile = FS_createPreloadedFile;
7297
+ PThread.init();
7144
7298
 
7145
- FS.preloadFile = FS_preloadFile;
7299
+ FS.createPreloadedFile = FS_createPreloadedFile;
7146
7300
 
7147
7301
  FS.staticInit();
7148
7302
 
@@ -7178,13 +7332,6 @@ Fetch.init();
7178
7332
  assert(typeof Module["TOTAL_MEMORY"] == "undefined", "Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY");
7179
7333
  assert(typeof Module["ENVIRONMENT"] == "undefined", "Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)");
7180
7334
  assert(typeof Module["STACK_SIZE"] == "undefined", "STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time");
7181
- if (Module["preInit"]) {
7182
- if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ];
7183
- while (Module["preInit"].length > 0) {
7184
- Module["preInit"].shift()();
7185
- }
7186
- }
7187
- consumedModuleProp("preInit");
7188
7335
  }
7189
7336
 
7190
7337
  // Begin runtime exports
@@ -7196,11 +7343,11 @@ Module["stringToNewUTF8"] = stringToNewUTF8;
7196
7343
 
7197
7344
  Module["FS"] = FS;
7198
7345
 
7199
- var missingLibrarySymbols = [ "writeI53ToI64Clamped", "writeI53ToI64Signaling", "writeI53ToU64Clamped", "writeI53ToU64Signaling", "convertI32PairToI53", "convertI32PairToI53Checked", "convertU32PairToI53", "getTempRet0", "setTempRet0", "createNamedFunction", "zeroMemory", "growMemory", "withStackSave", "inetPton4", "inetNtop4", "inetPton6", "inetNtop6", "readSockaddr", "writeSockaddr", "runMainThreadEmAsm", "jstoi_q", "autoResumeAudioContext", "dynCallLegacy", "getDynCaller", "dynCall", "asmjsMangle", "alignMemory", "getNativeTypeSize", "addOnInit", "addOnPostCtor", "addOnPreMain", "STACK_SIZE", "STACK_ALIGN", "POINTER_SIZE", "ASSERTIONS", "convertJsFunctionToWasm", "getEmptyTableSlot", "updateTableMap", "getFunctionAddress", "addFunction", "removeFunction", "intArrayToString", "AsciiToString", "stringToAscii", "UTF16ToString", "stringToUTF16", "lengthBytesUTF16", "UTF32ToString", "stringToUTF32", "lengthBytesUTF32", "JSEvents_requestFullscreen", "JSEvents_resizeCanvasForFullscreen", "registerRestoreOldStyle", "hideEverythingExceptGivenElement", "restoreHiddenElements", "setLetterbox", "softFullscreenResizeWebGLRenderTarget", "doRequestFullscreen", "requestPointerLock", "setCanvasElementSizeCallingThread", "setCanvasElementSizeMainThread", "setCanvasElementSize", "getCanvasSizeCallingThread", "getCanvasSizeMainThread", "getCanvasElementSize", "jsStackTrace", "getCallstack", "convertPCtoSourceLocation", "wasiRightsToMuslOFlags", "wasiOFlagsToMuslOFlags", "safeSetTimeout", "setImmediateWrapped", "safeRequestAnimationFrame", "clearImmediateWrapped", "registerPostMainLoop", "registerPreMainLoop", "getPromise", "idsToPromises", "makePromiseCallback", "ExceptionInfo", "findMatchingCatch", "Browser_asyncPrepareDataCounter", "arraySum", "addDays", "getSocketFromFD", "getSocketAddress", "FS_mkdirTree", "_setNetworkCallback", "heapObjectForWebGLType", "toTypedArrayIndex", "webgl_enable_ANGLE_instanced_arrays", "webgl_enable_OES_vertex_array_object", "webgl_enable_WEBGL_draw_buffers", "webgl_enable_WEBGL_multi_draw", "webgl_enable_EXT_polygon_offset_clamp", "webgl_enable_EXT_clip_control", "webgl_enable_WEBGL_polygon_mode", "emscriptenWebGLGet", "computeUnpackAlignedImageSize", "colorChannelsInGlTextureFormat", "emscriptenWebGLGetTexPixelData", "emscriptenWebGLGetUniform", "webglGetUniformLocation", "webglPrepareUniformLocationsBeforeFirstUse", "webglGetLeftBracePos", "emscriptenWebGLGetVertexAttrib", "__glGetActiveAttribOrUniform", "writeGLArray", "emscripten_webgl_destroy_context_before_on_calling_thread", "registerWebGlEventCallback", "runAndAbortIfError", "ALLOC_NORMAL", "ALLOC_STACK", "allocate", "writeStringToMemory", "writeAsciiToMemory", "demangle", "stackTrace" ];
7346
+ var missingLibrarySymbols = [ "writeI53ToI64Clamped", "writeI53ToI64Signaling", "writeI53ToU64Clamped", "writeI53ToU64Signaling", "convertI32PairToI53", "convertI32PairToI53Checked", "convertU32PairToI53", "getTempRet0", "setTempRet0", "zeroMemory", "growMemory", "inetPton4", "inetNtop4", "inetPton6", "inetNtop6", "readSockaddr", "writeSockaddr", "emscriptenLog", "runMainThreadEmAsm", "jstoi_q", "listenOnce", "autoResumeAudioContext", "dynCallLegacy", "getDynCaller", "dynCall", "asmjsMangle", "alignMemory", "getNativeTypeSize", "addOnInit", "addOnPostCtor", "addOnPreMain", "STACK_SIZE", "STACK_ALIGN", "POINTER_SIZE", "ASSERTIONS", "uleb128Encode", "sigToWasmTypes", "generateFuncType", "convertJsFunctionToWasm", "getEmptyTableSlot", "updateTableMap", "getFunctionAddress", "addFunction", "removeFunction", "reallyNegative", "strLen", "reSign", "formatString", "intArrayToString", "AsciiToString", "stringToAscii", "UTF16ToString", "stringToUTF16", "lengthBytesUTF16", "UTF32ToString", "stringToUTF32", "lengthBytesUTF32", "JSEvents_requestFullscreen", "JSEvents_resizeCanvasForFullscreen", "registerRestoreOldStyle", "hideEverythingExceptGivenElement", "restoreHiddenElements", "setLetterbox", "softFullscreenResizeWebGLRenderTarget", "doRequestFullscreen", "requestPointerLock", "setCanvasElementSizeCallingThread", "setCanvasElementSizeMainThread", "setCanvasElementSize", "getCanvasSizeCallingThread", "getCanvasSizeMainThread", "getCanvasElementSize", "jsStackTrace", "getCallstack", "convertPCtoSourceLocation", "wasiRightsToMuslOFlags", "wasiOFlagsToMuslOFlags", "safeSetTimeout", "setImmediateWrapped", "safeRequestAnimationFrame", "clearImmediateWrapped", "registerPostMainLoop", "registerPreMainLoop", "getPromise", "idsToPromises", "makePromiseCallback", "ExceptionInfo", "findMatchingCatch", "Browser_asyncPrepareDataCounter", "arraySum", "addDays", "getSocketFromFD", "getSocketAddress", "FS_mkdirTree", "_setNetworkCallback", "heapObjectForWebGLType", "toTypedArrayIndex", "webgl_enable_ANGLE_instanced_arrays", "webgl_enable_OES_vertex_array_object", "webgl_enable_WEBGL_draw_buffers", "webgl_enable_WEBGL_multi_draw", "webgl_enable_EXT_polygon_offset_clamp", "webgl_enable_EXT_clip_control", "webgl_enable_WEBGL_polygon_mode", "emscriptenWebGLGet", "computeUnpackAlignedImageSize", "colorChannelsInGlTextureFormat", "emscriptenWebGLGetTexPixelData", "emscriptenWebGLGetUniform", "webglGetUniformLocation", "webglPrepareUniformLocationsBeforeFirstUse", "webglGetLeftBracePos", "emscriptenWebGLGetVertexAttrib", "__glGetActiveAttribOrUniform", "writeGLArray", "emscripten_webgl_destroy_context_before_on_calling_thread", "registerWebGlEventCallback", "runAndAbortIfError", "ALLOC_NORMAL", "ALLOC_STACK", "allocate", "writeStringToMemory", "writeAsciiToMemory", "demangle", "stackTrace" ];
7200
7347
 
7201
7348
  missingLibrarySymbols.forEach(missingLibrarySymbol);
7202
7349
 
7203
- var unexportedSymbols = [ "run", "out", "err", "callMain", "abort", "wasmMemory", "wasmExports", "HEAPF32", "HEAPF64", "HEAP8", "HEAPU8", "HEAP16", "HEAPU16", "HEAP32", "HEAPU32", "HEAP64", "HEAPU64", "writeStackCookie", "checkStackCookie", "writeI53ToI64", "readI53FromI64", "readI53FromU64", "INT53_MAX", "INT53_MIN", "bigintToI53Checked", "stackSave", "stackRestore", "stackAlloc", "ptrToString", "exitJS", "getHeapMax", "abortOnCannotGrowMemory", "ENV", "ERRNO_CODES", "strError", "DNS", "Protocols", "Sockets", "timers", "warnOnce", "readEmAsmArgsArray", "readEmAsmArgs", "runEmAsmFunction", "getExecutableName", "handleException", "keepRuntimeAlive", "runtimeKeepalivePush", "runtimeKeepalivePop", "callUserCallback", "maybeExit", "asyncLoad", "mmapAlloc", "HandleAllocator", "wasmTable", "getUniqueRunDependency", "noExitRuntime", "addRunDependency", "removeRunDependency", "addOnPreRun", "addOnExit", "addOnPostRun", "freeTableIndexes", "functionsInTableMap", "setValue", "getValue", "PATH", "PATH_FS", "UTF8Decoder", "UTF8ArrayToString", "UTF8ToString", "stringToUTF8Array", "stringToUTF8", "lengthBytesUTF8", "intArrayFromString", "UTF16Decoder", "stringToUTF8OnStack", "writeArrayToMemory", "JSEvents", "registerKeyEventCallback", "specialHTMLTargets", "maybeCStringToJsString", "findEventTarget", "findCanvasEventTarget", "getBoundingClientRect", "fillMouseEventData", "registerMouseEventCallback", "registerWheelEventCallback", "registerUiEventCallback", "registerFocusEventCallback", "fillDeviceOrientationEventData", "registerDeviceOrientationEventCallback", "fillDeviceMotionEventData", "registerDeviceMotionEventCallback", "screenOrientation", "fillOrientationChangeEventData", "registerOrientationChangeEventCallback", "fillFullscreenChangeEventData", "registerFullscreenChangeEventCallback", "currentFullscreenStrategy", "restoreOldWindowedStyle", "fillPointerlockChangeEventData", "registerPointerlockChangeEventCallback", "registerPointerlockErrorEventCallback", "fillVisibilityChangeEventData", "registerVisibilityChangeEventCallback", "registerTouchEventCallback", "fillGamepadEventData", "registerGamepadEventCallback", "registerBeforeUnloadEventCallback", "fillBatteryEventData", "registerBatteryEventCallback", "UNWIND_CACHE", "ExitStatus", "getEnvStrings", "checkWasiClock", "doReadv", "doWritev", "initRandomFill", "randomFill", "emSetImmediate", "emClearImmediate_deps", "emClearImmediate", "promiseMap", "makePromise", "uncaughtExceptionCount", "exceptionLast", "exceptionCaught", "Browser", "requestFullscreen", "requestFullScreen", "setCanvasSize", "getUserMedia", "createContext", "getPreloadedImageData__data", "wget", "MONTH_DAYS_REGULAR", "MONTH_DAYS_LEAP", "MONTH_DAYS_REGULAR_CUMULATIVE", "MONTH_DAYS_LEAP_CUMULATIVE", "isLeapYear", "ydayFromDate", "SYSCALLS", "preloadPlugins", "FS_createPreloadedFile", "FS_preloadFile", "FS_modeStringToFlags", "FS_getMode", "FS_stdin_getChar_buffer", "FS_stdin_getChar", "FS_unlink", "FS_createPath", "FS_createDevice", "FS_readFile", "FS_root", "FS_mounts", "FS_devices", "FS_streams", "FS_nextInode", "FS_nameTable", "FS_currentPath", "FS_initialized", "FS_ignorePermissions", "FS_filesystems", "FS_syncFSRequests", "FS_readFiles", "FS_lookupPath", "FS_getPath", "FS_hashName", "FS_hashAddNode", "FS_hashRemoveNode", "FS_lookupNode", "FS_createNode", "FS_destroyNode", "FS_isRoot", "FS_isMountpoint", "FS_isFile", "FS_isDir", "FS_isLink", "FS_isChrdev", "FS_isBlkdev", "FS_isFIFO", "FS_isSocket", "FS_flagsToPermissionString", "FS_nodePermissions", "FS_mayLookup", "FS_mayCreate", "FS_mayDelete", "FS_mayOpen", "FS_checkOpExists", "FS_nextfd", "FS_getStreamChecked", "FS_getStream", "FS_createStream", "FS_closeStream", "FS_dupStream", "FS_doSetAttr", "FS_chrdev_stream_ops", "FS_major", "FS_minor", "FS_makedev", "FS_registerDevice", "FS_getDevice", "FS_getMounts", "FS_syncfs", "FS_mount", "FS_unmount", "FS_lookup", "FS_mknod", "FS_statfs", "FS_statfsStream", "FS_statfsNode", "FS_create", "FS_mkdir", "FS_mkdev", "FS_symlink", "FS_rename", "FS_rmdir", "FS_readdir", "FS_readlink", "FS_stat", "FS_fstat", "FS_lstat", "FS_doChmod", "FS_chmod", "FS_lchmod", "FS_fchmod", "FS_doChown", "FS_chown", "FS_lchown", "FS_fchown", "FS_doTruncate", "FS_truncate", "FS_ftruncate", "FS_utime", "FS_open", "FS_close", "FS_isClosed", "FS_llseek", "FS_read", "FS_write", "FS_mmap", "FS_msync", "FS_ioctl", "FS_writeFile", "FS_cwd", "FS_chdir", "FS_createDefaultDirectories", "FS_createDefaultDevices", "FS_createSpecialDirectories", "FS_createStandardStreams", "FS_staticInit", "FS_init", "FS_quit", "FS_findObject", "FS_analyzePath", "FS_createFile", "FS_createDataFile", "FS_forceLoadFile", "FS_createLazyFile", "FS_absolutePath", "FS_createFolder", "FS_createLink", "FS_joinPath", "FS_mmapAlloc", "FS_standardizePath", "MEMFS", "TTY", "PIPEFS", "SOCKFS", "tempFixedLengthArray", "miniTempWebGLFloatBuffers", "miniTempWebGLIntBuffers", "GL", "AL", "GLUT", "EGL", "GLEW", "IDBStore", "SDL", "SDL_gfx", "allocateUTF8", "allocateUTF8OnStack", "print", "printErr", "jstoi_s", "PThread", "terminateWorker", "cleanupThread", "registerTLSInit", "spawnThread", "exitOnMainThread", "proxyToMainThread", "proxiedJSCallArgs", "invokeEntryPoint", "checkMailbox", "webSockets", "WS", "WORKERFS", "Fetch", "fetchDeleteCachedData", "fetchLoadCachedData", "fetchCacheData", "fetchXHR" ];
7350
+ var unexportedSymbols = [ "run", "addRunDependency", "removeRunDependency", "out", "err", "callMain", "abort", "wasmMemory", "wasmExports", "HEAPF32", "HEAPF64", "HEAP8", "HEAPU8", "HEAP16", "HEAPU16", "HEAP32", "HEAPU32", "HEAP64", "HEAPU64", "writeStackCookie", "checkStackCookie", "writeI53ToI64", "readI53FromI64", "readI53FromU64", "INT53_MAX", "INT53_MIN", "bigintToI53Checked", "stackSave", "stackRestore", "stackAlloc", "ptrToString", "exitJS", "getHeapMax", "abortOnCannotGrowMemory", "ENV", "ERRNO_CODES", "strError", "DNS", "Protocols", "Sockets", "timers", "warnOnce", "readEmAsmArgsArray", "readEmAsmArgs", "runEmAsmFunction", "getExecutableName", "handleException", "keepRuntimeAlive", "runtimeKeepalivePush", "runtimeKeepalivePop", "callUserCallback", "maybeExit", "asyncLoad", "mmapAlloc", "HandleAllocator", "wasmTable", "noExitRuntime", "addOnPreRun", "addOnExit", "addOnPostRun", "getCFunc", "freeTableIndexes", "functionsInTableMap", "unSign", "setValue", "getValue", "PATH", "PATH_FS", "UTF8Decoder", "UTF8ArrayToString", "UTF8ToString", "stringToUTF8Array", "stringToUTF8", "lengthBytesUTF8", "intArrayFromString", "UTF16Decoder", "stringToUTF8OnStack", "writeArrayToMemory", "JSEvents", "registerKeyEventCallback", "specialHTMLTargets", "maybeCStringToJsString", "findEventTarget", "findCanvasEventTarget", "getBoundingClientRect", "fillMouseEventData", "registerMouseEventCallback", "registerWheelEventCallback", "registerUiEventCallback", "registerFocusEventCallback", "fillDeviceOrientationEventData", "registerDeviceOrientationEventCallback", "fillDeviceMotionEventData", "registerDeviceMotionEventCallback", "screenOrientation", "fillOrientationChangeEventData", "registerOrientationChangeEventCallback", "fillFullscreenChangeEventData", "registerFullscreenChangeEventCallback", "currentFullscreenStrategy", "restoreOldWindowedStyle", "fillPointerlockChangeEventData", "registerPointerlockChangeEventCallback", "registerPointerlockErrorEventCallback", "fillVisibilityChangeEventData", "registerVisibilityChangeEventCallback", "registerTouchEventCallback", "fillGamepadEventData", "registerGamepadEventCallback", "registerBeforeUnloadEventCallback", "fillBatteryEventData", "battery", "registerBatteryEventCallback", "UNWIND_CACHE", "ExitStatus", "getEnvStrings", "checkWasiClock", "doReadv", "doWritev", "initRandomFill", "randomFill", "emSetImmediate", "emClearImmediate_deps", "emClearImmediate", "promiseMap", "makePromise", "uncaughtExceptionCount", "exceptionLast", "exceptionCaught", "Browser", "getPreloadedImageData__data", "wget", "MONTH_DAYS_REGULAR", "MONTH_DAYS_LEAP", "MONTH_DAYS_REGULAR_CUMULATIVE", "MONTH_DAYS_LEAP_CUMULATIVE", "isLeapYear", "ydayFromDate", "SYSCALLS", "preloadPlugins", "FS_createPreloadedFile", "FS_modeStringToFlags", "FS_getMode", "FS_stdin_getChar_buffer", "FS_stdin_getChar", "FS_unlink", "FS_createPath", "FS_createDevice", "FS_readFile", "FS_root", "FS_mounts", "FS_devices", "FS_streams", "FS_nextInode", "FS_nameTable", "FS_currentPath", "FS_initialized", "FS_ignorePermissions", "FS_filesystems", "FS_syncFSRequests", "FS_readFiles", "FS_lookupPath", "FS_getPath", "FS_hashName", "FS_hashAddNode", "FS_hashRemoveNode", "FS_lookupNode", "FS_createNode", "FS_destroyNode", "FS_isRoot", "FS_isMountpoint", "FS_isFile", "FS_isDir", "FS_isLink", "FS_isChrdev", "FS_isBlkdev", "FS_isFIFO", "FS_isSocket", "FS_flagsToPermissionString", "FS_nodePermissions", "FS_mayLookup", "FS_mayCreate", "FS_mayDelete", "FS_mayOpen", "FS_checkOpExists", "FS_nextfd", "FS_getStreamChecked", "FS_getStream", "FS_createStream", "FS_closeStream", "FS_dupStream", "FS_doSetAttr", "FS_chrdev_stream_ops", "FS_major", "FS_minor", "FS_makedev", "FS_registerDevice", "FS_getDevice", "FS_getMounts", "FS_syncfs", "FS_mount", "FS_unmount", "FS_lookup", "FS_mknod", "FS_statfs", "FS_statfsStream", "FS_statfsNode", "FS_create", "FS_mkdir", "FS_mkdev", "FS_symlink", "FS_rename", "FS_rmdir", "FS_readdir", "FS_readlink", "FS_stat", "FS_fstat", "FS_lstat", "FS_doChmod", "FS_chmod", "FS_lchmod", "FS_fchmod", "FS_doChown", "FS_chown", "FS_lchown", "FS_fchown", "FS_doTruncate", "FS_truncate", "FS_ftruncate", "FS_utime", "FS_open", "FS_close", "FS_isClosed", "FS_llseek", "FS_read", "FS_write", "FS_mmap", "FS_msync", "FS_ioctl", "FS_writeFile", "FS_cwd", "FS_chdir", "FS_createDefaultDirectories", "FS_createDefaultDevices", "FS_createSpecialDirectories", "FS_createStandardStreams", "FS_staticInit", "FS_init", "FS_quit", "FS_findObject", "FS_analyzePath", "FS_createFile", "FS_createDataFile", "FS_forceLoadFile", "FS_createLazyFile", "FS_absolutePath", "FS_createFolder", "FS_createLink", "FS_joinPath", "FS_mmapAlloc", "FS_standardizePath", "MEMFS", "TTY", "PIPEFS", "SOCKFS", "tempFixedLengthArray", "miniTempWebGLFloatBuffers", "miniTempWebGLIntBuffers", "GL", "AL", "GLUT", "EGL", "GLEW", "IDBStore", "SDL", "SDL_gfx", "allocateUTF8", "allocateUTF8OnStack", "print", "printErr", "jstoi_s", "PThread", "terminateWorker", "cleanupThread", "registerTLSInit", "spawnThread", "exitOnMainThread", "proxyToMainThread", "proxiedJSCallArgs", "invokeEntryPoint", "checkMailbox", "webSockets", "WS", "WORKERFS", "Fetch", "fetchDeleteCachedData", "fetchLoadCachedData", "fetchCacheData", "fetchXHR" ];
7204
7351
 
7205
7352
  unexportedSymbols.forEach(unexportedRuntimeSymbol);
7206
7353
 
@@ -7219,19 +7366,19 @@ function checkIncomingModuleAPI() {
7219
7366
  }
7220
7367
 
7221
7368
  var ASM_CONSTS = {
7222
- 78367: ($0, $1) => {
7369
+ 77455: ($0, $1) => {
7223
7370
  promiseMap.get($0).resolve($1);
7224
7371
  },
7225
- 78403: ($0, $1) => {
7372
+ 77491: ($0, $1) => {
7226
7373
  promiseMap.get($0).reject($1);
7227
7374
  },
7228
- 78438: ($0, $1) => {
7375
+ 77526: ($0, $1) => {
7229
7376
  promiseMap.get($0).resolve(UTF8ToString($1));
7230
7377
  },
7231
- 78488: ($0, $1) => {
7378
+ 77576: ($0, $1) => {
7232
7379
  promiseMap.get($0).reject(UTF8ToString($1));
7233
7380
  },
7234
- 78537: $0 => {
7381
+ 77625: $0 => {
7235
7382
  Module["onTrackedObjectDelete"]($0);
7236
7383
  }
7237
7384
  };
@@ -7240,11 +7387,11 @@ function js_tracked_eval(code, size, debug) {
7240
7387
  const keys = Module["onRunTrackedJs"](UTF8ToString(code), debug);
7241
7388
  const error = keys === null;
7242
7389
  if (error) {
7243
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, size / HEAPU32.BYTES_PER_ELEMENT, "storing")] = 0;
7390
+ SAFE_HEAP_STORE(size / HEAPU32.BYTES_PER_ELEMENT * 4, 0, 4);
7244
7391
  return 0;
7245
7392
  }
7246
7393
  const ptr = Module["_malloc"](keys.length * HEAPU32.BYTES_PER_ELEMENT);
7247
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, size / HEAPU32.BYTES_PER_ELEMENT, "storing")] = keys.length;
7394
+ SAFE_HEAP_STORE(size / HEAPU32.BYTES_PER_ELEMENT * 4, keys.length, 4);
7248
7395
  HEAPU32.set(keys, ptr / HEAPU32.BYTES_PER_ELEMENT);
7249
7396
  return ptr;
7250
7397
  }
@@ -7279,120 +7426,30 @@ function js_get_tracked_objects(keys_ptr, keys_n, sizes, statuses, objects_n, st
7279
7426
  byteSize = lengthBytesUTF8(object);
7280
7427
  stringsN += 1;
7281
7428
  }
7282
- HEAPU8[SAFE_HEAP_INDEX(HEAPU8, statusPtr / HEAPU8.BYTES_PER_ELEMENT + i, "storing")] = status;
7283
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, sizesPtr / HEAPU32.BYTES_PER_ELEMENT + i, "storing")] = byteSize;
7429
+ SAFE_HEAP_STORE(statusPtr / HEAPU8.BYTES_PER_ELEMENT + i, status, 1);
7430
+ SAFE_HEAP_STORE((sizesPtr / HEAPU32.BYTES_PER_ELEMENT + i) * 4, byteSize, 4);
7284
7431
  allByteSize += byteSize;
7285
7432
  }
7286
7433
  const stringsPtr = Module["_malloc"](allByteSize * HEAPU8.BYTES_PER_ELEMENT);
7287
7434
  let currentStringsPtr = stringsPtr;
7288
7435
  for (let i = 0; i < n; ++i) {
7289
- const status = HEAPU8[SAFE_HEAP_INDEX(HEAPU8, statusPtr / HEAPU8.BYTES_PER_ELEMENT + i, "loading")];
7436
+ const status = SAFE_HEAP_LOAD(statusPtr / HEAPU8.BYTES_PER_ELEMENT + i, 1, 1);
7290
7437
  if (status !== OK) {
7291
7438
  continue;
7292
7439
  }
7293
7440
  const string = objects[i];
7294
- const size = HEAPU32[SAFE_HEAP_INDEX(HEAPU32, sizesPtr / HEAPU32.BYTES_PER_ELEMENT + i, "loading")];
7441
+ const size = SAFE_HEAP_LOAD((sizesPtr / HEAPU32.BYTES_PER_ELEMENT + i) * 4, 4, 1);
7295
7442
  stringToUTF8(string, currentStringsPtr, size + 1);
7296
7443
  currentStringsPtr += size;
7297
7444
  }
7298
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, statuses / HEAPU32.BYTES_PER_ELEMENT, "storing")] = statusPtr;
7299
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, sizes / HEAPU32.BYTES_PER_ELEMENT, "storing")] = sizesPtr;
7300
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, objects_n / HEAPU32.BYTES_PER_ELEMENT, "storing")] = n;
7301
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, strings_n / HEAPU32.BYTES_PER_ELEMENT, "storing")] = stringsN;
7302
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, all_byte_size / HEAPU32.BYTES_PER_ELEMENT, "storing")] = allByteSize;
7445
+ SAFE_HEAP_STORE(statuses / HEAPU32.BYTES_PER_ELEMENT * 4, statusPtr, 4);
7446
+ SAFE_HEAP_STORE(sizes / HEAPU32.BYTES_PER_ELEMENT * 4, sizesPtr, 4);
7447
+ SAFE_HEAP_STORE(objects_n / HEAPU32.BYTES_PER_ELEMENT * 4, n, 4);
7448
+ SAFE_HEAP_STORE(strings_n / HEAPU32.BYTES_PER_ELEMENT * 4, stringsN, 4);
7449
+ SAFE_HEAP_STORE(all_byte_size / HEAPU32.BYTES_PER_ELEMENT * 4, allByteSize, 4);
7303
7450
  return stringsPtr;
7304
7451
  }
7305
7452
 
7306
- // Imports from the Wasm binary.
7307
- Module["_cast"] = makeInvalidEarlyAccess("_cast");
7308
-
7309
- Module["_call"] = makeInvalidEarlyAccess("_call");
7310
-
7311
- Module["_next_tracked_object_key"] = makeInvalidEarlyAccess("_next_tracked_object_key");
7312
-
7313
- Module["_main"] = makeInvalidEarlyAccess("_main");
7314
-
7315
- var _free = makeInvalidEarlyAccess("_free");
7316
-
7317
- var _malloc = Module["_malloc"] = makeInvalidEarlyAccess("_malloc");
7318
-
7319
- var _fflush = makeInvalidEarlyAccess("_fflush");
7320
-
7321
- var _pthread_self = makeInvalidEarlyAccess("_pthread_self");
7322
-
7323
- var __emscripten_proxy_main = Module["__emscripten_proxy_main"] = makeInvalidEarlyAccess("__emscripten_proxy_main");
7324
-
7325
- var _emscripten_stack_get_base = makeInvalidEarlyAccess("_emscripten_stack_get_base");
7326
-
7327
- var _emscripten_stack_get_end = makeInvalidEarlyAccess("_emscripten_stack_get_end");
7328
-
7329
- var __emscripten_run_callback_on_thread = makeInvalidEarlyAccess("__emscripten_run_callback_on_thread");
7330
-
7331
- var __emscripten_thread_init = makeInvalidEarlyAccess("__emscripten_thread_init");
7332
-
7333
- var __emscripten_thread_crashed = makeInvalidEarlyAccess("__emscripten_thread_crashed");
7334
-
7335
- var __emscripten_run_js_on_main_thread = makeInvalidEarlyAccess("__emscripten_run_js_on_main_thread");
7336
-
7337
- var __emscripten_thread_free_data = makeInvalidEarlyAccess("__emscripten_thread_free_data");
7338
-
7339
- var __emscripten_thread_exit = makeInvalidEarlyAccess("__emscripten_thread_exit");
7340
-
7341
- var _strerror = makeInvalidEarlyAccess("_strerror");
7342
-
7343
- var __emscripten_check_mailbox = makeInvalidEarlyAccess("__emscripten_check_mailbox");
7344
-
7345
- var _sbrk = makeInvalidEarlyAccess("_sbrk");
7346
-
7347
- var _emscripten_stack_init = makeInvalidEarlyAccess("_emscripten_stack_init");
7348
-
7349
- var _emscripten_stack_set_limits = makeInvalidEarlyAccess("_emscripten_stack_set_limits");
7350
-
7351
- var __emscripten_stack_restore = makeInvalidEarlyAccess("__emscripten_stack_restore");
7352
-
7353
- var __emscripten_stack_alloc = makeInvalidEarlyAccess("__emscripten_stack_alloc");
7354
-
7355
- var _emscripten_stack_get_current = makeInvalidEarlyAccess("_emscripten_stack_get_current");
7356
-
7357
- var dynCall_iiii = makeInvalidEarlyAccess("dynCall_iiii");
7358
-
7359
- var dynCall_ii = makeInvalidEarlyAccess("dynCall_ii");
7360
-
7361
- var dynCall_vi = makeInvalidEarlyAccess("dynCall_vi");
7362
-
7363
- function assignWasmExports(wasmExports) {
7364
- Module["_cast"] = createExportWrapper("cast", 2);
7365
- Module["_call"] = createExportWrapper("call", 2);
7366
- Module["_next_tracked_object_key"] = createExportWrapper("next_tracked_object_key", 0);
7367
- Module["_main"] = createExportWrapper("__main_argc_argv", 2);
7368
- _free = createExportWrapper("free", 1);
7369
- _malloc = Module["_malloc"] = createExportWrapper("malloc", 1);
7370
- _fflush = createExportWrapper("fflush", 1);
7371
- _pthread_self = createExportWrapper("pthread_self", 0);
7372
- __emscripten_proxy_main = Module["__emscripten_proxy_main"] = createExportWrapper("_emscripten_proxy_main", 2);
7373
- _emscripten_stack_get_base = wasmExports["emscripten_stack_get_base"];
7374
- _emscripten_stack_get_end = wasmExports["emscripten_stack_get_end"];
7375
- __emscripten_run_callback_on_thread = createExportWrapper("_emscripten_run_callback_on_thread", 5);
7376
- __emscripten_thread_init = createExportWrapper("_emscripten_thread_init", 6);
7377
- __emscripten_thread_crashed = createExportWrapper("_emscripten_thread_crashed", 0);
7378
- __emscripten_run_js_on_main_thread = createExportWrapper("_emscripten_run_js_on_main_thread", 5);
7379
- __emscripten_thread_free_data = createExportWrapper("_emscripten_thread_free_data", 1);
7380
- __emscripten_thread_exit = createExportWrapper("_emscripten_thread_exit", 1);
7381
- _strerror = createExportWrapper("strerror", 1);
7382
- __emscripten_check_mailbox = createExportWrapper("_emscripten_check_mailbox", 0);
7383
- _sbrk = createExportWrapper("sbrk", 1);
7384
- _emscripten_stack_init = wasmExports["emscripten_stack_init"];
7385
- _emscripten_stack_set_limits = wasmExports["emscripten_stack_set_limits"];
7386
- wasmExports["emscripten_stack_get_free"];
7387
- __emscripten_stack_restore = wasmExports["_emscripten_stack_restore"];
7388
- __emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"];
7389
- _emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"];
7390
- dynCall_iiii = createExportWrapper("dynCall_iiii", 4);
7391
- dynCall_ii = createExportWrapper("dynCall_ii", 2);
7392
- dynCall_vi = createExportWrapper("dynCall_vi", 2);
7393
- wasmExports["__indirect_function_table"];
7394
- }
7395
-
7396
7453
  var wasmImports;
7397
7454
 
7398
7455
  function assignWasmImports() {
@@ -7502,6 +7559,96 @@ function assignWasmImports() {
7502
7559
  };
7503
7560
  }
7504
7561
 
7562
+ var wasmExports = await createWasm();
7563
+
7564
+ Module["_cast"] = createExportWrapper("cast", 2);
7565
+
7566
+ Module["_call"] = createExportWrapper("call", 2);
7567
+
7568
+ Module["_next_tracked_object_key"] = createExportWrapper("next_tracked_object_key", 0);
7569
+
7570
+ Module["_main"] = createExportWrapper("__main_argc_argv", 2);
7571
+
7572
+ var _free = createExportWrapper("free", 1);
7573
+
7574
+ var _malloc = Module["_malloc"] = createExportWrapper("malloc", 1);
7575
+
7576
+ var _fflush = createExportWrapper("fflush", 1);
7577
+
7578
+ var _pthread_self = () => (_pthread_self = wasmExports["pthread_self"])();
7579
+
7580
+ var __emscripten_proxy_main = Module["__emscripten_proxy_main"] = createExportWrapper("_emscripten_proxy_main", 2);
7581
+
7582
+ var _emscripten_stack_get_base = () => (_emscripten_stack_get_base = wasmExports["emscripten_stack_get_base"])();
7583
+
7584
+ var _emscripten_stack_get_end = () => (_emscripten_stack_get_end = wasmExports["emscripten_stack_get_end"])();
7585
+
7586
+ var __emscripten_run_callback_on_thread = createExportWrapper("_emscripten_run_callback_on_thread", 5);
7587
+
7588
+ var __emscripten_thread_init = createExportWrapper("_emscripten_thread_init", 6);
7589
+
7590
+ var __emscripten_thread_crashed = createExportWrapper("_emscripten_thread_crashed", 0);
7591
+
7592
+ var __emscripten_run_on_main_thread_js = createExportWrapper("_emscripten_run_on_main_thread_js", 5);
7593
+
7594
+ var __emscripten_thread_free_data = createExportWrapper("_emscripten_thread_free_data", 1);
7595
+
7596
+ var __emscripten_thread_exit = createExportWrapper("_emscripten_thread_exit", 1);
7597
+
7598
+ var _strerror = createExportWrapper("strerror", 1);
7599
+
7600
+ var __emscripten_check_mailbox = createExportWrapper("_emscripten_check_mailbox", 0);
7601
+
7602
+ var _sbrk = createExportWrapper("sbrk", 1);
7603
+
7604
+ var _emscripten_stack_init = () => (_emscripten_stack_init = wasmExports["emscripten_stack_init"])();
7605
+
7606
+ var _emscripten_stack_set_limits = (a0, a1) => (_emscripten_stack_set_limits = wasmExports["emscripten_stack_set_limits"])(a0, a1);
7607
+
7608
+ var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0);
7609
+
7610
+ var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0);
7611
+
7612
+ var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])();
7613
+
7614
+ Module["dynCall_vii"] = createExportWrapper("dynCall_vii", 3);
7615
+
7616
+ Module["dynCall_iii"] = createExportWrapper("dynCall_iii", 3);
7617
+
7618
+ Module["dynCall_jjj"] = createExportWrapper("dynCall_jjj", 3);
7619
+
7620
+ Module["dynCall_iiiiiiiii"] = createExportWrapper("dynCall_iiiiiiiii", 9);
7621
+
7622
+ Module["dynCall_iiiiii"] = createExportWrapper("dynCall_iiiiii", 6);
7623
+
7624
+ var dynCall_iiii = Module["dynCall_iiii"] = createExportWrapper("dynCall_iiii", 4);
7625
+
7626
+ Module["dynCall_iiiii"] = createExportWrapper("dynCall_iiiii", 5);
7627
+
7628
+ Module["dynCall_iiiiiii"] = createExportWrapper("dynCall_iiiiiii", 7);
7629
+
7630
+ var dynCall_ii = Module["dynCall_ii"] = createExportWrapper("dynCall_ii", 2);
7631
+
7632
+ Module["dynCall_viiii"] = createExportWrapper("dynCall_viiii", 5);
7633
+
7634
+ Module["dynCall_dd"] = createExportWrapper("dynCall_dd", 2);
7635
+
7636
+ Module["dynCall_ddd"] = createExportWrapper("dynCall_ddd", 3);
7637
+
7638
+ var dynCall_vi = Module["dynCall_vi"] = createExportWrapper("dynCall_vi", 2);
7639
+
7640
+ Module["dynCall_viii"] = createExportWrapper("dynCall_viii", 4);
7641
+
7642
+ Module["dynCall_iiiiiiii"] = createExportWrapper("dynCall_iiiiiiii", 8);
7643
+
7644
+ Module["dynCall_i"] = createExportWrapper("dynCall_i", 1);
7645
+
7646
+ Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji", 4);
7647
+
7648
+ Module["dynCall_v"] = createExportWrapper("dynCall_v", 1);
7649
+
7650
+ Module["dynCall_iidiiii"] = createExportWrapper("dynCall_iidiiii", 7);
7651
+
7505
7652
  // include: postamble.js
7506
7653
  // === Auto-generated postamble setup entry stuff ===
7507
7654
  var calledRun;
@@ -7518,10 +7665,10 @@ function callMain(args = []) {
7518
7665
  var argv = stackAlloc((argc + 1) * 4);
7519
7666
  var argv_ptr = argv;
7520
7667
  args.forEach(arg => {
7521
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((argv_ptr) >> 2), "storing")] = stringToUTF8OnStack(arg);
7668
+ SAFE_HEAP_STORE(((argv_ptr) >> 2) * 4, stringToUTF8OnStack(arg), 4);
7522
7669
  argv_ptr += 4;
7523
7670
  });
7524
- HEAPU32[SAFE_HEAP_INDEX(HEAPU32, ((argv_ptr) >> 2), "storing")] = 0;
7671
+ SAFE_HEAP_STORE(((argv_ptr) >> 2) * 4, 0, 4);
7525
7672
  try {
7526
7673
  var ret = entryFunction(argc, argv);
7527
7674
  // if we're not running an evented main loop, it's time to exit
@@ -7549,7 +7696,7 @@ function run(args = arguments_) {
7549
7696
  return;
7550
7697
  }
7551
7698
  if ((ENVIRONMENT_IS_PTHREAD)) {
7552
- readyPromiseResolve?.(Module);
7699
+ readyPromiseResolve(Module);
7553
7700
  initRuntime();
7554
7701
  return;
7555
7702
  }
@@ -7569,7 +7716,7 @@ function run(args = arguments_) {
7569
7716
  if (ABORT) return;
7570
7717
  initRuntime();
7571
7718
  preMain();
7572
- readyPromiseResolve?.(Module);
7719
+ readyPromiseResolve(Module);
7573
7720
  Module["onRuntimeInitialized"]?.();
7574
7721
  consumedModuleProp("onRuntimeInitialized");
7575
7722
  var noInitialRun = Module["noInitialRun"] || false;
@@ -7628,32 +7775,27 @@ function checkUnflushedContent() {
7628
7775
  }
7629
7776
  }
7630
7777
 
7631
- var wasmExports;
7632
-
7633
- if ((!(ENVIRONMENT_IS_PTHREAD))) {
7634
- // Call createWasm on startup if we are the main thread.
7635
- // Worker threads call this once they receive the module via postMessage
7636
- // In modularize mode the generated code is within a factory function so we
7637
- // can use await here (since it's not top-level-await).
7638
- wasmExports = await (createWasm());
7639
- run();
7778
+ function preInit() {
7779
+ if (Module["preInit"]) {
7780
+ if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ];
7781
+ while (Module["preInit"].length > 0) {
7782
+ Module["preInit"].shift()();
7783
+ }
7784
+ }
7785
+ consumedModuleProp("preInit");
7640
7786
  }
7641
7787
 
7788
+ preInit();
7789
+
7790
+ run();
7791
+
7642
7792
  // end include: postamble.js
7643
7793
  // include: postamble_modularize.js
7644
7794
  // In MODULARIZE mode we wrap the generated code in a factory function
7645
7795
  // and return either the Module itself, or a promise of the module.
7646
7796
  // We assign to the `moduleRtn` global here and configure closure to see
7647
7797
  // this as and extern so it won't get minified.
7648
- if (runtimeInitialized) {
7649
- moduleRtn = Module;
7650
- } else {
7651
- // Set up the promise that indicates the Module is initialized
7652
- moduleRtn = new Promise((resolve, reject) => {
7653
- readyPromiseResolve = resolve;
7654
- readyPromiseReject = reject;
7655
- });
7656
- }
7798
+ moduleRtn = readyPromise;
7657
7799
 
7658
7800
  // Assertion for attempting to access module properties on the incoming
7659
7801
  // moduleArg. In the past we used this object as the prototype of the module
@@ -7674,13 +7816,10 @@ for (const prop of Object.keys(Module)) {
7674
7816
 
7675
7817
  return moduleRtn;
7676
7818
  }
7677
-
7678
- // Create code for detecting if we are running in a pthread.
7679
- // Normally this detection is done when the module is itself run but
7680
- // when running in MODULARIZE mode we need use this to know if we should
7681
- // run the module constructor on startup (true only for pthreads).
7819
+ );
7820
+ })();
7682
7821
  var isPthread = globalThis.self?.name?.startsWith('em-pthread');
7683
-
7822
+ // When running as a pthread, construct a new instance on startup
7684
7823
  isPthread && Module();
7685
7824
 
7686
7825
  export { Module as default };