Spaces:
Running
Running
| // This code implements the `-sMODULARIZE` settings by taking the generated | |
| // JS program code (INNER_JS_CODE) and wrapping it in a factory function. | |
| // Single threaded MINIMAL_RUNTIME programs do not need access to | |
| // document.currentScript, so a simple export declaration is enough. | |
| var createGameModule = (() => { | |
| // When MODULARIZE this JS may be executed later, | |
| // after document.currentScript is gone, so we save it. | |
| // In EXPORT_ES6 mode we can just use 'import.meta.url'. | |
| var _scriptName = globalThis.document?.currentScript?.src; | |
| return async function(moduleArg = {}) { | |
| var moduleRtn; | |
| // include: shell.js | |
| // include: minimum_runtime_check.js | |
| (function() { | |
| // "30.0.0" -> 300000 | |
| function humanReadableVersionToPacked(str) { | |
| str = str.split('-')[0]; // Remove any trailing part from e.g. "12.53.3-alpha" | |
| var vers = str.split('.').slice(0, 3); | |
| while(vers.length < 3) vers.push('00'); | |
| vers = vers.map((n, i, arr) => n.padStart(2, '0')); | |
| return vers.join(''); | |
| } | |
| // 300000 -> "30.0.0" | |
| var packedVersionToHumanReadable = n => [n / 10000 | 0, (n / 100 | 0) % 100, n % 100].join('.'); | |
| var TARGET_NOT_SUPPORTED = 2147483647; | |
| // Note: We use a typeof check here instead of optional chaining using | |
| // globalThis because older browsers might not have globalThis defined. | |
| var currentNodeVersion = typeof process !== 'undefined' && process.versions?.node ? humanReadableVersionToPacked(process.versions.node) : TARGET_NOT_SUPPORTED; | |
| if (currentNodeVersion < 160000) { | |
| throw new Error(`This emscripten-generated code requires node v${ packedVersionToHumanReadable(160000) } (detected v${packedVersionToHumanReadable(currentNodeVersion)})`); | |
| } | |
| var userAgent = typeof navigator !== 'undefined' && navigator.userAgent; | |
| if (!userAgent) { | |
| return; | |
| } | |
| var currentSafariVersion = userAgent.includes("Safari/") && userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/) ? humanReadableVersionToPacked(userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/)[1]) : TARGET_NOT_SUPPORTED; | |
| if (currentSafariVersion < 150000) { | |
| throw new Error(`This emscripten-generated code requires Safari v${ packedVersionToHumanReadable(150000) } (detected v${currentSafariVersion})`); | |
| } | |
| var currentFirefoxVersion = userAgent.match(/Firefox\/(\d+(?:\.\d+)?)/) ? parseFloat(userAgent.match(/Firefox\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED; | |
| if (currentFirefoxVersion < 79) { | |
| throw new Error(`This emscripten-generated code requires Firefox v79 (detected v${currentFirefoxVersion})`); | |
| } | |
| var currentChromeVersion = userAgent.match(/Chrome\/(\d+(?:\.\d+)?)/) ? parseFloat(userAgent.match(/Chrome\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED; | |
| if (currentChromeVersion < 85) { | |
| throw new Error(`This emscripten-generated code requires Chrome v85 (detected v${currentChromeVersion})`); | |
| } | |
| })(); | |
| // end include: minimum_runtime_check.js | |
| // The Module object: Our interface to the outside world. We import | |
| // and export values on it. There are various ways Module can be used: | |
| // 1. Not defined. We create it here | |
| // 2. A function parameter, function(moduleArg) => Promise<Module> | |
| // 3. pre-run appended it, var Module = {}; ..generated code.. | |
| // 4. External script tag defines var Module. | |
| // We need to check if Module already exists (e.g. case 3 above). | |
| // Substitution will be replaced with actual code on later stage of the build, | |
| // this way Closure Compiler will not mangle it (e.g. case 4. above). | |
| // Note that if you want to run closure, and also to use Module | |
| // after the generated code, you will need to define var Module = {}; | |
| // before the code. Then that object will be used in the code, and you | |
| // can continue to use Module afterwards as well. | |
| var Module = moduleArg; | |
| // Determine the runtime environment we are in. You can customize this by | |
| // setting the ENVIRONMENT setting at compile time (see settings.js). | |
| // Attempt to auto-detect the environment | |
| var ENVIRONMENT_IS_WEB = !!globalThis.window; | |
| var ENVIRONMENT_IS_WORKER = !!globalThis.WorkerGlobalScope; | |
| // N.b. Electron.js environment is simultaneously a NODE-environment, but | |
| // also a web environment. | |
| var ENVIRONMENT_IS_NODE = globalThis.process?.versions?.node && globalThis.process?.type != 'renderer'; | |
| var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; | |
| // --pre-jses are emitted after the Module integration code, so that they can | |
| // refer to Module (if they choose; they can also define Module) | |
| var arguments_ = []; | |
| var thisProgram = './this.program'; | |
| var quit_ = (status, toThrow) => { | |
| throw toThrow; | |
| }; | |
| if (typeof __filename != 'undefined') { // Node | |
| _scriptName = __filename; | |
| } else | |
| if (ENVIRONMENT_IS_WORKER) { | |
| _scriptName = self.location.href; | |
| } | |
| // `/` should be present at the end if `scriptDirectory` is not empty | |
| var scriptDirectory = ''; | |
| function locateFile(path) { | |
| if (Module['locateFile']) { | |
| return Module['locateFile'](path, scriptDirectory); | |
| } | |
| return scriptDirectory + path; | |
| } | |
| // Hooks that are implemented differently in different runtime environments. | |
| var readAsync, readBinary; | |
| if (ENVIRONMENT_IS_NODE) { | |
| const isNode = globalThis.process?.versions?.node && globalThis.process?.type != 'renderer'; | |
| if (!isNode) 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?)'); | |
| // These modules will usually be used on Node.js. Load them eagerly to avoid | |
| // the complexity of lazy-loading. | |
| var fs = require('fs'); | |
| scriptDirectory = __dirname + '/'; | |
| // include: node_shell_read.js | |
| readBinary = (filename) => { | |
| // We need to re-wrap `file://` strings to URLs. | |
| filename = isFileURI(filename) ? new URL(filename) : filename; | |
| var ret = fs.readFileSync(filename); | |
| assert(Buffer.isBuffer(ret)); | |
| return ret; | |
| }; | |
| readAsync = async (filename, binary = true) => { | |
| // See the comment in the `readBinary` function. | |
| filename = isFileURI(filename) ? new URL(filename) : filename; | |
| var ret = fs.readFileSync(filename, binary ? undefined : 'utf8'); | |
| assert(binary ? Buffer.isBuffer(ret) : typeof ret == 'string'); | |
| return ret; | |
| }; | |
| // end include: node_shell_read.js | |
| if (process.argv.length > 1) { | |
| thisProgram = process.argv[1].replace(/\\/g, '/'); | |
| } | |
| arguments_ = process.argv.slice(2); | |
| quit_ = (status, toThrow) => { | |
| process.exitCode = status; | |
| throw toThrow; | |
| }; | |
| } else | |
| if (ENVIRONMENT_IS_SHELL) { | |
| } else | |
| // Note that this includes Node.js workers when relevant (pthreads is enabled). | |
| // Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and | |
| // ENVIRONMENT_IS_NODE. | |
| if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { | |
| try { | |
| scriptDirectory = new URL('.', _scriptName).href; // includes trailing slash | |
| } catch { | |
| // Must be a `blob:` or `data:` URL (e.g. `blob:http://site.com/etc/etc`), we cannot | |
| // infer anything from them. | |
| } | |
| 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?)'); | |
| { | |
| // include: web_or_worker_shell_read.js | |
| if (ENVIRONMENT_IS_WORKER) { | |
| readBinary = (url) => { | |
| var xhr = new XMLHttpRequest(); | |
| xhr.open('GET', url, false); | |
| xhr.responseType = 'arraybuffer'; | |
| xhr.send(null); | |
| return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); | |
| }; | |
| } | |
| readAsync = async (url) => { | |
| // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. | |
| // See https://github.com/github/fetch/pull/92#issuecomment-140665932 | |
| // Cordova or Electron apps are typically loaded from a file:// url. | |
| // So use XHR on webview if URL is a file URL. | |
| if (isFileURI(url)) { | |
| return new Promise((resolve, reject) => { | |
| var xhr = new XMLHttpRequest(); | |
| xhr.open('GET', url, true); | |
| xhr.responseType = 'arraybuffer'; | |
| xhr.onload = () => { | |
| if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 | |
| resolve(xhr.response); | |
| return; | |
| } | |
| reject(xhr.status); | |
| }; | |
| xhr.onerror = reject; | |
| xhr.send(null); | |
| }); | |
| } | |
| var response = await fetch(url, { credentials: 'same-origin' }); | |
| if (response.ok) { | |
| return response.arrayBuffer(); | |
| } | |
| throw new Error(response.status + ' : ' + response.url); | |
| }; | |
| // end include: web_or_worker_shell_read.js | |
| } | |
| } else | |
| { | |
| throw new Error('environment detection error'); | |
| } | |
| var out = console.log.bind(console); | |
| var err = console.error.bind(console); | |
| var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; | |
| var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; | |
| var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; | |
| var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; | |
| var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; | |
| var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; | |
| var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; | |
| var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; | |
| // perform assertions in shell.js after we set up out() and err(), as otherwise | |
| // if an assertion fails it cannot print the message | |
| assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.'); | |
| // end include: shell.js | |
| // include: preamble.js | |
| // === Preamble library stuff === | |
| // Documentation for the public APIs defined in this file must be updated in: | |
| // site/source/docs/api_reference/preamble.js.rst | |
| // A prebuilt local version of the documentation is available at: | |
| // site/build/text/docs/api_reference/preamble.js.txt | |
| // You can also build docs locally as HTML or other formats in site/ | |
| // An online HTML version (which may be of a different version of Emscripten) | |
| // is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html | |
| var wasmBinary; | |
| if (!globalThis.WebAssembly) { | |
| err('no native wasm support detected'); | |
| } | |
| // Wasm globals | |
| //======================================== | |
| // Runtime essentials | |
| //======================================== | |
| // whether we are quitting the application. no code should run after this. | |
| // set in exit() and abort() | |
| var ABORT = false; | |
| // set by exit() and abort(). Passed to 'onExit' handler. | |
| // NOTE: This is also used as the process return code code in shell environments | |
| // but only when noExitRuntime is false. | |
| var EXITSTATUS; | |
| // In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we | |
| // don't define it at all in release modes. This matches the behaviour of | |
| // MINIMAL_RUNTIME. | |
| // TODO(sbc): Make this the default even without STRICT enabled. | |
| /** @type {function(*, string=)} */ | |
| function assert(condition, text) { | |
| if (!condition) { | |
| abort('Assertion failed' + (text ? ': ' + text : '')); | |
| } | |
| } | |
| // We used to include malloc/free by default in the past. Show a helpful error in | |
| // builds with assertions. | |
| /** | |
| * Indicates whether filename is delivered via file protocol (as opposed to http/https) | |
| * @noinline | |
| */ | |
| var isFileURI = (filename) => filename.startsWith('file://'); | |
| // include: runtime_common.js | |
| // include: runtime_stack_check.js | |
| // Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. | |
| function writeStackCookie() { | |
| var max = _emscripten_stack_get_end(); | |
| assert((max & 3) == 0); | |
| // If the stack ends at address zero we write our cookies 4 bytes into the | |
| // stack. This prevents interference with SAFE_HEAP and ASAN which also | |
| // monitor writes to address zero. | |
| if (max == 0) { | |
| max += 4; | |
| } | |
| // The stack grow downwards towards _emscripten_stack_get_end. | |
| // We write cookies to the final two words in the stack and detect if they are | |
| // ever overwritten. | |
| HEAPU32[((max)>>2)] = 0x02135467; | |
| HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; | |
| // Also test the global address 0 for integrity. | |
| HEAPU32[((0)>>2)] = 1668509029; | |
| } | |
| function checkStackCookie() { | |
| if (ABORT) return; | |
| var max = _emscripten_stack_get_end(); | |
| // See writeStackCookie(). | |
| if (max == 0) { | |
| max += 4; | |
| } | |
| var cookie1 = HEAPU32[((max)>>2)]; | |
| var cookie2 = HEAPU32[(((max)+(4))>>2)]; | |
| if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { | |
| abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); | |
| } | |
| // Also test the global address 0 for integrity. | |
| if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) { | |
| abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); | |
| } | |
| } | |
| // end include: runtime_stack_check.js | |
| // include: runtime_exceptions.js | |
| // end include: runtime_exceptions.js | |
| // include: runtime_debug.js | |
| var runtimeDebug = true; // Switch to false at runtime to disable logging at the right times | |
| // Used by XXXXX_DEBUG settings to output debug messages. | |
| function dbg(...args) { | |
| if (!runtimeDebug && typeof runtimeDebug != 'undefined') return; | |
| // TODO(sbc): Make this configurable somehow. Its not always convenient for | |
| // logging to show up as warnings. | |
| console.warn(...args); | |
| } | |
| // Endianness check | |
| (() => { | |
| var h16 = new Int16Array(1); | |
| var h8 = new Int8Array(h16.buffer); | |
| h16[0] = 0x6373; | |
| if (h8[0] !== 0x73 || h8[1] !== 0x63) abort('Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'); | |
| })(); | |
| function consumedModuleProp(prop) { | |
| if (!Object.getOwnPropertyDescriptor(Module, prop)) { | |
| Object.defineProperty(Module, prop, { | |
| configurable: true, | |
| set() { | |
| abort(`Attempt to set \`Module.${prop}\` after it has already been processed. This can happen, for example, when code is injected via '--post-js' rather than '--pre-js'`); | |
| } | |
| }); | |
| } | |
| } | |
| function makeInvalidEarlyAccess(name) { | |
| return () => assert(false, `call to '${name}' via reference taken before Wasm module initialization`); | |
| } | |
| function ignoredModuleProp(prop) { | |
| if (Object.getOwnPropertyDescriptor(Module, prop)) { | |
| abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); | |
| } | |
| } | |
| // forcing the filesystem exports a few things by default | |
| function isExportedByForceFilesystem(name) { | |
| 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. | |
| name === 'FS_createLazyFile' || | |
| name === 'FS_createDevice' || | |
| name === 'removeRunDependency'; | |
| } | |
| function missingLibrarySymbol(sym) { | |
| // Any symbol that is not included from the JS library is also (by definition) | |
| // not exported on the Module object. | |
| unexportedRuntimeSymbol(sym); | |
| } | |
| function unexportedRuntimeSymbol(sym) { | |
| if (!Object.getOwnPropertyDescriptor(Module, sym)) { | |
| Object.defineProperty(Module, sym, { | |
| configurable: true, | |
| get() { | |
| var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`; | |
| if (isExportedByForceFilesystem(sym)) { | |
| msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; | |
| } | |
| abort(msg); | |
| }, | |
| }); | |
| } | |
| } | |
| // end include: runtime_debug.js | |
| var readyPromiseResolve, readyPromiseReject; | |
| // Memory management | |
| var | |
| /** @type {!Int8Array} */ | |
| HEAP8, | |
| /** @type {!Uint8Array} */ | |
| HEAPU8, | |
| /** @type {!Int16Array} */ | |
| HEAP16, | |
| /** @type {!Uint16Array} */ | |
| HEAPU16, | |
| /** @type {!Int32Array} */ | |
| HEAP32, | |
| /** @type {!Uint32Array} */ | |
| HEAPU32, | |
| /** @type {!Float32Array} */ | |
| HEAPF32, | |
| /** @type {!Float64Array} */ | |
| HEAPF64; | |
| // BigInt64Array type is not correctly defined in closure | |
| var | |
| /** not-@type {!BigInt64Array} */ | |
| HEAP64, | |
| /* BigUint64Array type is not correctly defined in closure | |
| /** not-@type {!BigUint64Array} */ | |
| HEAPU64; | |
| var runtimeInitialized = false; | |
| function updateMemoryViews() { | |
| var b = wasmMemory.buffer; | |
| HEAP8 = new Int8Array(b); | |
| HEAP16 = new Int16Array(b); | |
| Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); | |
| HEAPU16 = new Uint16Array(b); | |
| HEAP32 = new Int32Array(b); | |
| Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); | |
| Module['HEAPF32'] = HEAPF32 = new Float32Array(b); | |
| HEAPF64 = new Float64Array(b); | |
| HEAP64 = new BigInt64Array(b); | |
| HEAPU64 = new BigUint64Array(b); | |
| } | |
| // include: memoryprofiler.js | |
| // end include: memoryprofiler.js | |
| // end include: runtime_common.js | |
| assert(globalThis.Int32Array && globalThis.Float64Array && Int32Array.prototype.subarray && Int32Array.prototype.set, | |
| 'JS engine does not provide full typed array support'); | |
| function preRun() { | |
| if (Module['preRun']) { | |
| if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; | |
| while (Module['preRun'].length) { | |
| addOnPreRun(Module['preRun'].shift()); | |
| } | |
| } | |
| consumedModuleProp('preRun'); | |
| // Begin ATPRERUNS hooks | |
| callRuntimeCallbacks(onPreRuns); | |
| // End ATPRERUNS hooks | |
| } | |
| function initRuntime() { | |
| assert(!runtimeInitialized); | |
| runtimeInitialized = true; | |
| checkStackCookie(); | |
| // No ATINITS hooks | |
| wasmExports['__wasm_call_ctors'](); | |
| // No ATPOSTCTORS hooks | |
| } | |
| function postRun() { | |
| checkStackCookie(); | |
| // PThreads reuse the runtime from the main thread. | |
| if (Module['postRun']) { | |
| if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; | |
| while (Module['postRun'].length) { | |
| addOnPostRun(Module['postRun'].shift()); | |
| } | |
| } | |
| consumedModuleProp('postRun'); | |
| // Begin ATPOSTRUNS hooks | |
| callRuntimeCallbacks(onPostRuns); | |
| // End ATPOSTRUNS hooks | |
| } | |
| /** @param {string|number=} what */ | |
| function abort(what) { | |
| Module['onAbort']?.(what); | |
| what = 'Aborted(' + what + ')'; | |
| // TODO(sbc): Should we remove printing and leave it up to whoever | |
| // catches the exception? | |
| err(what); | |
| ABORT = true; | |
| // Use a wasm runtime error, because a JS error might be seen as a foreign | |
| // exception, which means we'd run destructors on it. We need the error to | |
| // simply make the program stop. | |
| // FIXME This approach does not work in Wasm EH because it currently does not assume | |
| // all RuntimeErrors are from traps; it decides whether a RuntimeError is from | |
| // a trap or not based on a hidden field within the object. So at the moment | |
| // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that | |
| // allows this in the wasm spec. | |
| // Suppress closure compiler warning here. Closure compiler's builtin extern | |
| // definition for WebAssembly.RuntimeError claims it takes no arguments even | |
| // though it can. | |
| // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. | |
| /** @suppress {checkTypes} */ | |
| var e = new WebAssembly.RuntimeError(what); | |
| readyPromiseReject?.(e); | |
| // Throw the error whether or not MODULARIZE is set because abort is used | |
| // in code paths apart from instantiation where an exception is expected | |
| // to be thrown when abort is called. | |
| throw e; | |
| } | |
| // show errors on likely calls to FS when it was not included | |
| var FS = { | |
| error() { | |
| abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM'); | |
| }, | |
| init() { FS.error() }, | |
| createDataFile() { FS.error() }, | |
| createPreloadedFile() { FS.error() }, | |
| createLazyFile() { FS.error() }, | |
| open() { FS.error() }, | |
| mkdev() { FS.error() }, | |
| registerDevice() { FS.error() }, | |
| analyzePath() { FS.error() }, | |
| ErrnoError() { FS.error() }, | |
| }; | |
| function createExportWrapper(name, nargs) { | |
| return (...args) => { | |
| assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); | |
| var f = wasmExports[name]; | |
| assert(f, `exported native function \`${name}\` not found`); | |
| // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled. | |
| assert(args.length <= nargs, `native function \`${name}\` called with ${args.length} args but expects ${nargs}`); | |
| return f(...args); | |
| }; | |
| } | |
| var wasmBinaryFile; | |
| function findWasmBinary() { | |
| return locateFile('game.wasm'); | |
| } | |
| function getBinarySync(file) { | |
| if (file == wasmBinaryFile && wasmBinary) { | |
| return new Uint8Array(wasmBinary); | |
| } | |
| if (readBinary) { | |
| return readBinary(file); | |
| } | |
| // Throwing a plain string here, even though it not normally adviables since | |
| // this gets turning into an `abort` in instantiateArrayBuffer. | |
| throw 'both async and sync fetching of the wasm failed'; | |
| } | |
| async function getWasmBinary(binaryFile) { | |
| // If we don't have the binary yet, load it asynchronously using readAsync. | |
| if (!wasmBinary) { | |
| // Fetch the binary using readAsync | |
| try { | |
| var response = await readAsync(binaryFile); | |
| return new Uint8Array(response); | |
| } catch { | |
| // Fall back to getBinarySync below; | |
| } | |
| } | |
| // Otherwise, getBinarySync should be able to get it synchronously | |
| return getBinarySync(binaryFile); | |
| } | |
| async function instantiateArrayBuffer(binaryFile, imports) { | |
| try { | |
| var binary = await getWasmBinary(binaryFile); | |
| var instance = await WebAssembly.instantiate(binary, imports); | |
| return instance; | |
| } catch (reason) { | |
| err(`failed to asynchronously prepare wasm: ${reason}`); | |
| // Warn on some common problems. | |
| if (isFileURI(binaryFile)) { | |
| 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`); | |
| } | |
| abort(reason); | |
| } | |
| } | |
| async function instantiateAsync(binary, binaryFile, imports) { | |
| if (!binary | |
| // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. | |
| && !isFileURI(binaryFile) | |
| // Avoid instantiateStreaming() on Node.js environment for now, as while | |
| // Node.js v18.1.0 implements it, it does not have a full fetch() | |
| // implementation yet. | |
| // | |
| // Reference: | |
| // https://github.com/emscripten-core/emscripten/pull/16917 | |
| && !ENVIRONMENT_IS_NODE | |
| ) { | |
| try { | |
| var response = fetch(binaryFile, { credentials: 'same-origin' }); | |
| var instantiationResult = await WebAssembly.instantiateStreaming(response, imports); | |
| return instantiationResult; | |
| } catch (reason) { | |
| // We expect the most common failure cause to be a bad MIME type for the binary, | |
| // in which case falling back to ArrayBuffer instantiation should work. | |
| err(`wasm streaming compile failed: ${reason}`); | |
| err('falling back to ArrayBuffer instantiation'); | |
| // fall back of instantiateArrayBuffer below | |
| }; | |
| } | |
| return instantiateArrayBuffer(binaryFile, imports); | |
| } | |
| function getWasmImports() { | |
| // prepare imports | |
| var imports = { | |
| 'env': wasmImports, | |
| 'wasi_snapshot_preview1': wasmImports, | |
| }; | |
| return imports; | |
| } | |
| // Create the wasm instance. | |
| // Receives the wasm imports, returns the exports. | |
| async function createWasm() { | |
| // Load the wasm module and create an instance of using native support in the JS engine. | |
| // handle a generated wasm instance, receiving its exports and | |
| // performing other necessary setup | |
| /** @param {WebAssembly.Module=} module*/ | |
| function receiveInstance(instance, module) { | |
| wasmExports = instance.exports; | |
| assignWasmExports(wasmExports); | |
| updateMemoryViews(); | |
| return wasmExports; | |
| } | |
| // Prefer streaming instantiation if available. | |
| // Async compilation can be confusing when an error on the page overwrites Module | |
| // (for example, if the order of elements is wrong, and the one defining Module is | |
| // later), so we save Module and check it later. | |
| var trueModule = Module; | |
| function receiveInstantiationResult(result) { | |
| // 'result' is a ResultObject object which has both the module and instance. | |
| // receiveInstance() will swap in the exports (to Module.asm) so they can be called | |
| assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); | |
| trueModule = null; | |
| // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. | |
| // When the regression is fixed, can restore the above PTHREADS-enabled path. | |
| return receiveInstance(result['instance']); | |
| } | |
| var info = getWasmImports(); | |
| // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback | |
| // to manually instantiate the Wasm module themselves. This allows pages to | |
| // run the instantiation parallel to any other async startup actions they are | |
| // performing. | |
| // Also pthreads and wasm workers initialize the wasm instance through this | |
| // path. | |
| if (Module['instantiateWasm']) { | |
| return new Promise((resolve, reject) => { | |
| try { | |
| Module['instantiateWasm'](info, (inst, mod) => { | |
| resolve(receiveInstance(inst, mod)); | |
| }); | |
| } catch(e) { | |
| err(`Module.instantiateWasm callback failed with error: ${e}`); | |
| reject(e); | |
| } | |
| }); | |
| } | |
| wasmBinaryFile ??= findWasmBinary(); | |
| var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info); | |
| var exports = receiveInstantiationResult(result); | |
| return exports; | |
| } | |
| // end include: preamble.js | |
| // Begin JS library code | |
| class ExitStatus { | |
| name = 'ExitStatus'; | |
| constructor(status) { | |
| this.message = `Program terminated with exit(${status})`; | |
| this.status = status; | |
| } | |
| } | |
| var callRuntimeCallbacks = (callbacks) => { | |
| while (callbacks.length > 0) { | |
| // Pass the module as the first argument. | |
| callbacks.shift()(Module); | |
| } | |
| }; | |
| var onPostRuns = []; | |
| var addOnPostRun = (cb) => onPostRuns.push(cb); | |
| var onPreRuns = []; | |
| var addOnPreRun = (cb) => onPreRuns.push(cb); | |
| /** | |
| * @param {number} ptr | |
| * @param {string} type | |
| */ | |
| function getValue(ptr, type = 'i8') { | |
| if (type.endsWith('*')) type = '*'; | |
| switch (type) { | |
| case 'i1': return HEAP8[ptr]; | |
| case 'i8': return HEAP8[ptr]; | |
| case 'i16': return HEAP16[((ptr)>>1)]; | |
| case 'i32': return HEAP32[((ptr)>>2)]; | |
| case 'i64': return HEAP64[((ptr)>>3)]; | |
| case 'float': return HEAPF32[((ptr)>>2)]; | |
| case 'double': return HEAPF64[((ptr)>>3)]; | |
| case '*': return HEAPU32[((ptr)>>2)]; | |
| default: abort(`invalid type for getValue: ${type}`); | |
| } | |
| } | |
| var noExitRuntime = true; | |
| var ptrToString = (ptr) => { | |
| assert(typeof ptr === 'number', `ptrToString expects a number, got ${typeof ptr}`); | |
| // Convert to 32-bit unsigned value | |
| ptr >>>= 0; | |
| return '0x' + ptr.toString(16).padStart(8, '0'); | |
| }; | |
| /** | |
| * @param {number} ptr | |
| * @param {number} value | |
| * @param {string} type | |
| */ | |
| function setValue(ptr, value, type = 'i8') { | |
| if (type.endsWith('*')) type = '*'; | |
| switch (type) { | |
| case 'i1': HEAP8[ptr] = value; break; | |
| case 'i8': HEAP8[ptr] = value; break; | |
| case 'i16': HEAP16[((ptr)>>1)] = value; break; | |
| case 'i32': HEAP32[((ptr)>>2)] = value; break; | |
| case 'i64': HEAP64[((ptr)>>3)] = BigInt(value); break; | |
| case 'float': HEAPF32[((ptr)>>2)] = value; break; | |
| case 'double': HEAPF64[((ptr)>>3)] = value; break; | |
| case '*': HEAPU32[((ptr)>>2)] = value; break; | |
| default: abort(`invalid type for setValue: ${type}`); | |
| } | |
| } | |
| var stackRestore = (val) => __emscripten_stack_restore(val); | |
| var stackSave = () => _emscripten_stack_get_current(); | |
| var warnOnce = (text) => { | |
| warnOnce.shown ||= {}; | |
| if (!warnOnce.shown[text]) { | |
| warnOnce.shown[text] = 1; | |
| if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text; | |
| err(text); | |
| } | |
| }; | |
| var __abort_js = () => | |
| abort('native code called abort()'); | |
| var __emscripten_throw_longjmp = () => { | |
| throw Infinity; | |
| }; | |
| var _emscripten_get_now = () => performance.now(); | |
| var _emscripten_date_now = () => Date.now(); | |
| var nowIsMonotonic = 1; | |
| var checkWasiClock = (clock_id) => clock_id >= 0 && clock_id <= 3; | |
| var INT53_MAX = 9007199254740992; | |
| var INT53_MIN = -9007199254740992; | |
| var bigintToI53Checked = (num) => (num < INT53_MIN || num > INT53_MAX) ? NaN : Number(num); | |
| function _clock_time_get(clk_id, ignored_precision, ptime) { | |
| ignored_precision = bigintToI53Checked(ignored_precision); | |
| if (!checkWasiClock(clk_id)) { | |
| return 28; | |
| } | |
| var now; | |
| // all wasi clocks but realtime are monotonic | |
| if (clk_id === 0) { | |
| now = _emscripten_date_now(); | |
| } else if (nowIsMonotonic) { | |
| now = _emscripten_get_now(); | |
| } else { | |
| return 52; | |
| } | |
| // "now" is in ms, and wasi times are in ns. | |
| var nsec = Math.round(now * 1000 * 1000); | |
| HEAP64[((ptime)>>3)] = BigInt(nsec); | |
| return 0; | |
| ; | |
| } | |
| var getHeapMax = () => | |
| // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate | |
| // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side | |
| // for any code that deals with heap sizes, which would require special | |
| // casing all heap size related code to treat 0 specially. | |
| 67108864; | |
| var alignMemory = (size, alignment) => { | |
| assert(alignment, "alignment argument is required"); | |
| return Math.ceil(size / alignment) * alignment; | |
| }; | |
| var growMemory = (size) => { | |
| var oldHeapSize = wasmMemory.buffer.byteLength; | |
| var pages = ((size - oldHeapSize + 65535) / 65536) | 0; | |
| try { | |
| // round size grow request up to wasm page size (fixed 64KB per spec) | |
| wasmMemory.grow(pages); // .grow() takes a delta compared to the previous size | |
| updateMemoryViews(); | |
| return 1 /*success*/; | |
| } catch(e) { | |
| err(`growMemory: Attempted to grow heap from ${oldHeapSize} bytes to ${size} bytes, but got error: ${e}`); | |
| } | |
| // implicit 0 return to save code size (caller will cast "undefined" into 0 | |
| // anyhow) | |
| }; | |
| var _emscripten_resize_heap = (requestedSize) => { | |
| var oldSize = HEAPU8.length; | |
| // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. | |
| requestedSize >>>= 0; | |
| // With multithreaded builds, races can happen (another thread might increase the size | |
| // in between), so return a failure, and let the caller retry. | |
| assert(requestedSize > oldSize); | |
| // Memory resize rules: | |
| // 1. Always increase heap size to at least the requested size, rounded up | |
| // to next page multiple. | |
| // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap | |
| // geometrically: increase the heap size according to | |
| // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most | |
| // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). | |
| // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap | |
| // linearly: increase the heap size by at least | |
| // MEMORY_GROWTH_LINEAR_STEP bytes. | |
| // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by | |
| // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest | |
| // 4. If we were unable to allocate as much memory, it may be due to | |
| // over-eager decision to excessively reserve due to (3) above. | |
| // Hence if an allocation fails, cut down on the amount of excess | |
| // growth, in an attempt to succeed to perform a smaller allocation. | |
| // A limit is set for how much we can grow. We should not exceed that | |
| // (the wasm binary specifies it, so if we tried, we'd fail anyhow). | |
| var maxHeapSize = getHeapMax(); | |
| if (requestedSize > maxHeapSize) { | |
| err(`Cannot enlarge memory, requested ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`); | |
| return false; | |
| } | |
| // Loop through potential heap size increases. If we attempt a too eager | |
| // reservation that fails, cut down on the attempted size and reserve a | |
| // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) | |
| for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { | |
| var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth | |
| // but limit overreserving (default to capping at +96MB overgrowth at most) | |
| overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); | |
| var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); | |
| var replacement = growMemory(newSize); | |
| if (replacement) { | |
| return true; | |
| } | |
| } | |
| err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`); | |
| return false; | |
| }; | |
| var UTF8Decoder = globalThis.TextDecoder && new TextDecoder(); | |
| var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { | |
| var maxIdx = idx + maxBytesToRead; | |
| if (ignoreNul) return maxIdx; | |
| // TextDecoder needs to know the byte length in advance, it doesn't stop on | |
| // null terminator by itself. | |
| // As a tiny code save trick, compare idx against maxIdx using a negation, | |
| // so that maxBytesToRead=undefined/NaN means Infinity. | |
| while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx; | |
| return idx; | |
| }; | |
| /** | |
| * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given | |
| * array that contains uint8 values, returns a copy of that string as a | |
| * Javascript String object. | |
| * heapOrArray is either a regular array, or a JavaScript typed array view. | |
| * @param {number=} idx | |
| * @param {number=} maxBytesToRead | |
| * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. | |
| * @return {string} | |
| */ | |
| var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { | |
| var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); | |
| // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it. | |
| if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { | |
| return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); | |
| } | |
| var str = ''; | |
| while (idx < endPtr) { | |
| // For UTF8 byte structure, see: | |
| // http://en.wikipedia.org/wiki/UTF-8#Description | |
| // https://www.ietf.org/rfc/rfc2279.txt | |
| // https://tools.ietf.org/html/rfc3629 | |
| var u0 = heapOrArray[idx++]; | |
| if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } | |
| var u1 = heapOrArray[idx++] & 63; | |
| if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } | |
| var u2 = heapOrArray[idx++] & 63; | |
| if ((u0 & 0xF0) == 0xE0) { | |
| u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; | |
| } else { | |
| if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); | |
| u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); | |
| } | |
| if (u0 < 0x10000) { | |
| str += String.fromCharCode(u0); | |
| } else { | |
| var ch = u0 - 0x10000; | |
| str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); | |
| } | |
| } | |
| return str; | |
| }; | |
| /** | |
| * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the | |
| * emscripten HEAP, returns a copy of that string as a Javascript String object. | |
| * | |
| * @param {number} ptr | |
| * @param {number=} maxBytesToRead - An optional length that specifies the | |
| * maximum number of bytes to read. You can omit this parameter to scan the | |
| * string until the first 0 byte. If maxBytesToRead is passed, and the string | |
| * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the | |
| * string will cut short at that byte index. | |
| * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. | |
| * @return {string} | |
| */ | |
| var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => { | |
| assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`); | |
| return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : ''; | |
| }; | |
| var SYSCALLS = { | |
| varargs:undefined, | |
| getStr(ptr) { | |
| var ret = UTF8ToString(ptr); | |
| return ret; | |
| }, | |
| }; | |
| var _fd_close = (fd) => { | |
| abort('fd_close called without SYSCALLS_REQUIRE_FILESYSTEM'); | |
| }; | |
| function _fd_seek(fd, offset, whence, newOffset) { | |
| offset = bigintToI53Checked(offset); | |
| return 70; | |
| ; | |
| } | |
| var printCharBuffers = [null,[],[]]; | |
| var printChar = (stream, curr) => { | |
| var buffer = printCharBuffers[stream]; | |
| assert(buffer); | |
| if (curr === 0 || curr === 10) { | |
| (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); | |
| buffer.length = 0; | |
| } else { | |
| buffer.push(curr); | |
| } | |
| }; | |
| var flush_NO_FILESYSTEM = () => { | |
| // flush anything remaining in the buffers during shutdown | |
| _fflush(0); | |
| if (printCharBuffers[1].length) printChar(1, 10); | |
| if (printCharBuffers[2].length) printChar(2, 10); | |
| }; | |
| var _fd_write = (fd, iov, iovcnt, pnum) => { | |
| // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0 | |
| var num = 0; | |
| for (var i = 0; i < iovcnt; i++) { | |
| var ptr = HEAPU32[((iov)>>2)]; | |
| var len = HEAPU32[(((iov)+(4))>>2)]; | |
| iov += 8; | |
| for (var j = 0; j < len; j++) { | |
| printChar(fd, HEAPU8[ptr+j]); | |
| } | |
| num += len; | |
| } | |
| HEAPU32[((pnum)>>2)] = num; | |
| return 0; | |
| }; | |
| var wasmTableMirror = []; | |
| var getWasmTableEntry = (funcPtr) => { | |
| var func = wasmTableMirror[funcPtr]; | |
| if (!func) { | |
| /** @suppress {checkTypes} */ | |
| wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); | |
| } | |
| /** @suppress {checkTypes} */ | |
| assert(wasmTable.get(funcPtr) == func, 'JavaScript-side Wasm function table mirror is out of date!'); | |
| return func; | |
| }; | |
| var getCFunc = (ident) => { | |
| var func = Module['_' + ident]; // closure exported function | |
| assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); | |
| return func; | |
| }; | |
| var writeArrayToMemory = (array, buffer) => { | |
| assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') | |
| HEAP8.set(array, buffer); | |
| }; | |
| var lengthBytesUTF8 = (str) => { | |
| var len = 0; | |
| for (var i = 0; i < str.length; ++i) { | |
| // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code | |
| // unit, not a Unicode code point of the character! So decode | |
| // UTF16->UTF32->UTF8. | |
| // See http://unicode.org/faq/utf_bom.html#utf16-3 | |
| var c = str.charCodeAt(i); // possibly a lead surrogate | |
| if (c <= 0x7F) { | |
| len++; | |
| } else if (c <= 0x7FF) { | |
| len += 2; | |
| } else if (c >= 0xD800 && c <= 0xDFFF) { | |
| len += 4; ++i; | |
| } else { | |
| len += 3; | |
| } | |
| } | |
| return len; | |
| }; | |
| var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { | |
| assert(typeof str === 'string', `stringToUTF8Array expects a string (got ${typeof str})`); | |
| // Parameter maxBytesToWrite is not optional. Negative values, 0, null, | |
| // undefined and false each don't write out any bytes. | |
| if (!(maxBytesToWrite > 0)) | |
| return 0; | |
| var startIdx = outIdx; | |
| var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. | |
| for (var i = 0; i < str.length; ++i) { | |
| // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description | |
| // and https://www.ietf.org/rfc/rfc2279.txt | |
| // and https://tools.ietf.org/html/rfc3629 | |
| var u = str.codePointAt(i); | |
| if (u <= 0x7F) { | |
| if (outIdx >= endIdx) break; | |
| heap[outIdx++] = u; | |
| } else if (u <= 0x7FF) { | |
| if (outIdx + 1 >= endIdx) break; | |
| heap[outIdx++] = 0xC0 | (u >> 6); | |
| heap[outIdx++] = 0x80 | (u & 63); | |
| } else if (u <= 0xFFFF) { | |
| if (outIdx + 2 >= endIdx) break; | |
| heap[outIdx++] = 0xE0 | (u >> 12); | |
| heap[outIdx++] = 0x80 | ((u >> 6) & 63); | |
| heap[outIdx++] = 0x80 | (u & 63); | |
| } else { | |
| if (outIdx + 3 >= endIdx) break; | |
| if (u > 0x10FFFF) warnOnce('Invalid Unicode code point ' + ptrToString(u) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); | |
| heap[outIdx++] = 0xF0 | (u >> 18); | |
| heap[outIdx++] = 0x80 | ((u >> 12) & 63); | |
| heap[outIdx++] = 0x80 | ((u >> 6) & 63); | |
| heap[outIdx++] = 0x80 | (u & 63); | |
| // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. | |
| // We need to manually skip over the second code unit for correct iteration. | |
| i++; | |
| } | |
| } | |
| // Null-terminate the pointer to the buffer. | |
| heap[outIdx] = 0; | |
| return outIdx - startIdx; | |
| }; | |
| var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { | |
| assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); | |
| return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); | |
| }; | |
| var stackAlloc = (sz) => __emscripten_stack_alloc(sz); | |
| var stringToUTF8OnStack = (str) => { | |
| var size = lengthBytesUTF8(str) + 1; | |
| var ret = stackAlloc(size); | |
| stringToUTF8(str, ret, size); | |
| return ret; | |
| }; | |
| /** | |
| * @param {string|null=} returnType | |
| * @param {Array=} argTypes | |
| * @param {Array=} args | |
| * @param {Object=} opts | |
| */ | |
| var ccall = (ident, returnType, argTypes, args, opts) => { | |
| // For fast lookup of conversion functions | |
| var toC = { | |
| 'string': (str) => { | |
| var ret = 0; | |
| if (str !== null && str !== undefined && str !== 0) { // null string | |
| ret = stringToUTF8OnStack(str); | |
| } | |
| return ret; | |
| }, | |
| 'array': (arr) => { | |
| var ret = stackAlloc(arr.length); | |
| writeArrayToMemory(arr, ret); | |
| return ret; | |
| } | |
| }; | |
| function convertReturnValue(ret) { | |
| if (returnType === 'string') { | |
| return UTF8ToString(ret); | |
| } | |
| if (returnType === 'boolean') return Boolean(ret); | |
| return ret; | |
| } | |
| var func = getCFunc(ident); | |
| var cArgs = []; | |
| var stack = 0; | |
| assert(returnType !== 'array', 'Return type should not be "array".'); | |
| if (args) { | |
| for (var i = 0; i < args.length; i++) { | |
| var converter = toC[argTypes[i]]; | |
| if (converter) { | |
| if (stack === 0) stack = stackSave(); | |
| cArgs[i] = converter(args[i]); | |
| } else { | |
| cArgs[i] = args[i]; | |
| } | |
| } | |
| } | |
| var ret = func(...cArgs); | |
| function onDone(ret) { | |
| if (stack !== 0) stackRestore(stack); | |
| return convertReturnValue(ret); | |
| } | |
| ret = onDone(ret); | |
| return ret; | |
| }; | |
| /** | |
| * @param {string=} returnType | |
| * @param {Array=} argTypes | |
| * @param {Object=} opts | |
| */ | |
| var cwrap = (ident, returnType, argTypes, opts) => { | |
| return (...args) => ccall(ident, returnType, argTypes, args, opts); | |
| }; | |
| // End JS library code | |
| // include: postlibrary.js | |
| // This file is included after the automatically-generated JS library code | |
| // but before the wasm module is created. | |
| { | |
| // Begin ATMODULES hooks | |
| if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime']; | |
| if (Module['print']) out = Module['print']; | |
| if (Module['printErr']) err = Module['printErr']; | |
| if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; | |
| Module['FS_createDataFile'] = FS.createDataFile; | |
| Module['FS_createPreloadedFile'] = FS.createPreloadedFile; | |
| // End ATMODULES hooks | |
| checkIncomingModuleAPI(); | |
| if (Module['arguments']) arguments_ = Module['arguments']; | |
| if (Module['thisProgram']) thisProgram = Module['thisProgram']; | |
| // Assertions on removed incoming Module JS APIs. | |
| assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); | |
| assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); | |
| assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); | |
| assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); | |
| assert(typeof Module['read'] == 'undefined', 'Module.read option was removed'); | |
| assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); | |
| assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); | |
| assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)'); | |
| assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); | |
| 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)'); | |
| assert(typeof Module['STACK_SIZE'] == 'undefined', 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') | |
| // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY | |
| assert(typeof Module['wasmMemory'] == 'undefined', 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); | |
| assert(typeof Module['INITIAL_MEMORY'] == 'undefined', 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); | |
| if (Module['preInit']) { | |
| if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; | |
| while (Module['preInit'].length > 0) { | |
| Module['preInit'].shift()(); | |
| } | |
| } | |
| consumedModuleProp('preInit'); | |
| } | |
| // Begin runtime exports | |
| Module['ccall'] = ccall; | |
| Module['cwrap'] = cwrap; | |
| Module['setValue'] = setValue; | |
| Module['getValue'] = getValue; | |
| Module['UTF8ToString'] = UTF8ToString; | |
| var missingLibrarySymbols = [ | |
| 'writeI53ToI64', | |
| 'writeI53ToI64Clamped', | |
| 'writeI53ToI64Signaling', | |
| 'writeI53ToU64Clamped', | |
| 'writeI53ToU64Signaling', | |
| 'readI53FromI64', | |
| 'readI53FromU64', | |
| 'convertI32PairToI53', | |
| 'convertI32PairToI53Checked', | |
| 'convertU32PairToI53', | |
| 'getTempRet0', | |
| 'setTempRet0', | |
| 'createNamedFunction', | |
| 'zeroMemory', | |
| 'exitJS', | |
| 'withStackSave', | |
| 'strError', | |
| 'inetPton4', | |
| 'inetNtop4', | |
| 'inetPton6', | |
| 'inetNtop6', | |
| 'readSockaddr', | |
| 'writeSockaddr', | |
| 'readEmAsmArgs', | |
| 'jstoi_q', | |
| 'getExecutableName', | |
| 'autoResumeAudioContext', | |
| 'getDynCaller', | |
| 'dynCall', | |
| 'handleException', | |
| 'keepRuntimeAlive', | |
| 'runtimeKeepalivePush', | |
| 'runtimeKeepalivePop', | |
| 'callUserCallback', | |
| 'maybeExit', | |
| 'asyncLoad', | |
| 'asmjsMangle', | |
| 'mmapAlloc', | |
| 'HandleAllocator', | |
| 'getUniqueRunDependency', | |
| 'addRunDependency', | |
| 'removeRunDependency', | |
| 'addOnInit', | |
| 'addOnPostCtor', | |
| 'addOnPreMain', | |
| 'addOnExit', | |
| 'STACK_SIZE', | |
| 'STACK_ALIGN', | |
| 'POINTER_SIZE', | |
| 'ASSERTIONS', | |
| 'convertJsFunctionToWasm', | |
| 'getEmptyTableSlot', | |
| 'updateTableMap', | |
| 'getFunctionAddress', | |
| 'addFunction', | |
| 'removeFunction', | |
| 'intArrayFromString', | |
| 'intArrayToString', | |
| 'AsciiToString', | |
| 'stringToAscii', | |
| 'UTF16ToString', | |
| 'stringToUTF16', | |
| 'lengthBytesUTF16', | |
| 'UTF32ToString', | |
| 'stringToUTF32', | |
| 'lengthBytesUTF32', | |
| 'stringToNewUTF8', | |
| 'registerKeyEventCallback', | |
| 'maybeCStringToJsString', | |
| 'findEventTarget', | |
| 'getBoundingClientRect', | |
| 'fillMouseEventData', | |
| 'registerMouseEventCallback', | |
| 'registerWheelEventCallback', | |
| 'registerUiEventCallback', | |
| 'registerFocusEventCallback', | |
| 'fillDeviceOrientationEventData', | |
| 'registerDeviceOrientationEventCallback', | |
| 'fillDeviceMotionEventData', | |
| 'registerDeviceMotionEventCallback', | |
| 'screenOrientation', | |
| 'fillOrientationChangeEventData', | |
| 'registerOrientationChangeEventCallback', | |
| 'fillFullscreenChangeEventData', | |
| 'registerFullscreenChangeEventCallback', | |
| 'JSEvents_requestFullscreen', | |
| 'JSEvents_resizeCanvasForFullscreen', | |
| 'registerRestoreOldStyle', | |
| 'hideEverythingExceptGivenElement', | |
| 'restoreHiddenElements', | |
| 'setLetterbox', | |
| 'softFullscreenResizeWebGLRenderTarget', | |
| 'doRequestFullscreen', | |
| 'fillPointerlockChangeEventData', | |
| 'registerPointerlockChangeEventCallback', | |
| 'registerPointerlockErrorEventCallback', | |
| 'requestPointerLock', | |
| 'fillVisibilityChangeEventData', | |
| 'registerVisibilityChangeEventCallback', | |
| 'registerTouchEventCallback', | |
| 'fillGamepadEventData', | |
| 'registerGamepadEventCallback', | |
| 'registerBeforeUnloadEventCallback', | |
| 'fillBatteryEventData', | |
| 'registerBatteryEventCallback', | |
| 'setCanvasElementSize', | |
| 'getCanvasElementSize', | |
| 'jsStackTrace', | |
| 'getCallstack', | |
| 'convertPCtoSourceLocation', | |
| 'getEnvStrings', | |
| 'wasiRightsToMuslOFlags', | |
| 'wasiOFlagsToMuslOFlags', | |
| 'initRandomFill', | |
| 'randomFill', | |
| 'safeSetTimeout', | |
| 'setImmediateWrapped', | |
| 'safeRequestAnimationFrame', | |
| 'clearImmediateWrapped', | |
| 'registerPostMainLoop', | |
| 'registerPreMainLoop', | |
| 'getPromise', | |
| 'makePromise', | |
| 'idsToPromises', | |
| 'makePromiseCallback', | |
| 'ExceptionInfo', | |
| 'findMatchingCatch', | |
| 'Browser_asyncPrepareDataCounter', | |
| 'isLeapYear', | |
| 'ydayFromDate', | |
| 'arraySum', | |
| 'addDays', | |
| 'getSocketFromFD', | |
| 'getSocketAddress', | |
| 'FS_createPreloadedFile', | |
| 'FS_preloadFile', | |
| 'FS_modeStringToFlags', | |
| 'FS_getMode', | |
| 'FS_stdin_getChar', | |
| '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', | |
| 'registerWebGlEventCallback', | |
| 'runAndAbortIfError', | |
| 'ALLOC_NORMAL', | |
| 'ALLOC_STACK', | |
| 'allocate', | |
| 'writeStringToMemory', | |
| 'writeAsciiToMemory', | |
| 'allocateUTF8', | |
| 'allocateUTF8OnStack', | |
| 'demangle', | |
| 'stackTrace', | |
| 'getNativeTypeSize', | |
| ]; | |
| missingLibrarySymbols.forEach(missingLibrarySymbol) | |
| var unexportedSymbols = [ | |
| 'run', | |
| 'out', | |
| 'err', | |
| 'callMain', | |
| 'abort', | |
| 'wasmExports', | |
| 'HEAPF64', | |
| 'HEAP8', | |
| 'HEAP16', | |
| 'HEAPU16', | |
| 'HEAP32', | |
| 'HEAP64', | |
| 'HEAPU64', | |
| 'writeStackCookie', | |
| 'checkStackCookie', | |
| 'INT53_MAX', | |
| 'INT53_MIN', | |
| 'bigintToI53Checked', | |
| 'stackSave', | |
| 'stackRestore', | |
| 'stackAlloc', | |
| 'ptrToString', | |
| 'getHeapMax', | |
| 'growMemory', | |
| 'ENV', | |
| 'ERRNO_CODES', | |
| 'DNS', | |
| 'Protocols', | |
| 'Sockets', | |
| 'timers', | |
| 'warnOnce', | |
| 'readEmAsmArgsArray', | |
| 'alignMemory', | |
| 'wasmTable', | |
| 'noExitRuntime', | |
| 'addOnPreRun', | |
| 'addOnPostRun', | |
| 'freeTableIndexes', | |
| 'functionsInTableMap', | |
| 'PATH', | |
| 'PATH_FS', | |
| 'UTF8Decoder', | |
| 'UTF8ArrayToString', | |
| 'stringToUTF8Array', | |
| 'stringToUTF8', | |
| 'lengthBytesUTF8', | |
| 'UTF16Decoder', | |
| 'stringToUTF8OnStack', | |
| 'writeArrayToMemory', | |
| 'JSEvents', | |
| 'specialHTMLTargets', | |
| 'findCanvasEventTarget', | |
| 'currentFullscreenStrategy', | |
| 'restoreOldWindowedStyle', | |
| 'UNWIND_CACHE', | |
| 'ExitStatus', | |
| 'checkWasiClock', | |
| 'flush_NO_FILESYSTEM', | |
| 'emSetImmediate', | |
| 'emClearImmediate_deps', | |
| 'emClearImmediate', | |
| 'promiseMap', | |
| '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', | |
| 'SYSCALLS', | |
| 'preloadPlugins', | |
| 'FS_stdin_getChar_buffer', | |
| 'FS_unlink', | |
| 'FS_createPath', | |
| 'FS_createDevice', | |
| 'FS_readFile', | |
| 'FS', | |
| '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', | |
| 'print', | |
| 'printErr', | |
| 'jstoi_s', | |
| ]; | |
| unexportedSymbols.forEach(unexportedRuntimeSymbol); | |
| // End runtime exports | |
| // Begin JS library exports | |
| // End JS library exports | |
| // end include: postlibrary.js | |
| function checkIncomingModuleAPI() { | |
| ignoredModuleProp('fetchSettings'); | |
| } | |
| // Imports from the Wasm binary. | |
| var _game_init = Module['_game_init'] = makeInvalidEarlyAccess('_game_init'); | |
| var _free = Module['_free'] = makeInvalidEarlyAccess('_free'); | |
| var _malloc = Module['_malloc'] = makeInvalidEarlyAccess('_malloc'); | |
| var _game_step = Module['_game_step'] = makeInvalidEarlyAccess('_game_step'); | |
| var _game_record_input = Module['_game_record_input'] = makeInvalidEarlyAccess('_game_record_input'); | |
| var _game_record_marker = Module['_game_record_marker'] = makeInvalidEarlyAccess('_game_record_marker'); | |
| var _game_apply_input = Module['_game_apply_input'] = makeInvalidEarlyAccess('_game_apply_input'); | |
| var _game_render = Module['_game_render'] = makeInvalidEarlyAccess('_game_render'); | |
| var _game_is_solved = Module['_game_is_solved'] = makeInvalidEarlyAccess('_game_is_solved'); | |
| var _game_is_failed = Module['_game_is_failed'] = makeInvalidEarlyAccess('_game_is_failed'); | |
| var _game_get_outcome = Module['_game_get_outcome'] = makeInvalidEarlyAccess('_game_get_outcome'); | |
| var _game_get_pixel_buffer = Module['_game_get_pixel_buffer'] = makeInvalidEarlyAccess('_game_get_pixel_buffer'); | |
| var _game_get_pixel_buffer_size = Module['_game_get_pixel_buffer_size'] = makeInvalidEarlyAccess('_game_get_pixel_buffer_size'); | |
| var _game_get_buffer_width = Module['_game_get_buffer_width'] = makeInvalidEarlyAccess('_game_get_buffer_width'); | |
| var _game_get_buffer_height = Module['_game_get_buffer_height'] = makeInvalidEarlyAccess('_game_get_buffer_height'); | |
| var _game_render_commands = Module['_game_render_commands'] = makeInvalidEarlyAccess('_game_render_commands'); | |
| var _game_get_command_buffer = Module['_game_get_command_buffer'] = makeInvalidEarlyAccess('_game_get_command_buffer'); | |
| var _game_get_command_buffer_size = Module['_game_get_command_buffer_size'] = makeInvalidEarlyAccess('_game_get_command_buffer_size'); | |
| var _get_physics_hash = Module['_get_physics_hash'] = makeInvalidEarlyAccess('_get_physics_hash'); | |
| var _game_get_session_data = Module['_game_get_session_data'] = makeInvalidEarlyAccess('_game_get_session_data'); | |
| var _game_get_session_data_length = Module['_game_get_session_data_length'] = makeInvalidEarlyAccess('_game_get_session_data_length'); | |
| var _game_get_current_tick = Module['_game_get_current_tick'] = makeInvalidEarlyAccess('_game_get_current_tick'); | |
| var _game_get_target_info = Module['_game_get_target_info'] = makeInvalidEarlyAccess('_game_get_target_info'); | |
| var _game_cleanup = Module['_game_cleanup'] = makeInvalidEarlyAccess('_game_cleanup'); | |
| var _game_render_pvg = Module['_game_render_pvg'] = makeInvalidEarlyAccess('_game_render_pvg'); | |
| var _game_get_pvg_pixels = Module['_game_get_pvg_pixels'] = makeInvalidEarlyAccess('_game_get_pvg_pixels'); | |
| var _game_get_pvg_stride = Module['_game_get_pvg_stride'] = makeInvalidEarlyAccess('_game_get_pvg_stride'); | |
| var _game_get_pvg_renderer = Module['_game_get_pvg_renderer'] = makeInvalidEarlyAccess('_game_get_pvg_renderer'); | |
| var _fflush = makeInvalidEarlyAccess('_fflush'); | |
| var _emscripten_builtin_memalign = makeInvalidEarlyAccess('_emscripten_builtin_memalign'); | |
| var _emscripten_stack_get_end = makeInvalidEarlyAccess('_emscripten_stack_get_end'); | |
| var _emscripten_stack_get_base = makeInvalidEarlyAccess('_emscripten_stack_get_base'); | |
| var _strerror = makeInvalidEarlyAccess('_strerror'); | |
| var _setThrew = makeInvalidEarlyAccess('_setThrew'); | |
| var _emscripten_stack_init = makeInvalidEarlyAccess('_emscripten_stack_init'); | |
| var _emscripten_stack_get_free = makeInvalidEarlyAccess('_emscripten_stack_get_free'); | |
| var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore'); | |
| var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc'); | |
| var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current'); | |
| var memory = makeInvalidEarlyAccess('memory'); | |
| var __indirect_function_table = makeInvalidEarlyAccess('__indirect_function_table'); | |
| var wasmMemory = makeInvalidEarlyAccess('wasmMemory'); | |
| var wasmTable = makeInvalidEarlyAccess('wasmTable'); | |
| function assignWasmExports(wasmExports) { | |
| assert(typeof wasmExports['game_init'] != 'undefined', 'missing Wasm export: game_init'); | |
| assert(typeof wasmExports['free'] != 'undefined', 'missing Wasm export: free'); | |
| assert(typeof wasmExports['malloc'] != 'undefined', 'missing Wasm export: malloc'); | |
| assert(typeof wasmExports['game_step'] != 'undefined', 'missing Wasm export: game_step'); | |
| assert(typeof wasmExports['game_record_input'] != 'undefined', 'missing Wasm export: game_record_input'); | |
| assert(typeof wasmExports['game_record_marker'] != 'undefined', 'missing Wasm export: game_record_marker'); | |
| assert(typeof wasmExports['game_apply_input'] != 'undefined', 'missing Wasm export: game_apply_input'); | |
| assert(typeof wasmExports['game_render'] != 'undefined', 'missing Wasm export: game_render'); | |
| assert(typeof wasmExports['game_is_solved'] != 'undefined', 'missing Wasm export: game_is_solved'); | |
| assert(typeof wasmExports['game_is_failed'] != 'undefined', 'missing Wasm export: game_is_failed'); | |
| assert(typeof wasmExports['game_get_outcome'] != 'undefined', 'missing Wasm export: game_get_outcome'); | |
| assert(typeof wasmExports['game_get_pixel_buffer'] != 'undefined', 'missing Wasm export: game_get_pixel_buffer'); | |
| assert(typeof wasmExports['game_get_pixel_buffer_size'] != 'undefined', 'missing Wasm export: game_get_pixel_buffer_size'); | |
| assert(typeof wasmExports['game_get_buffer_width'] != 'undefined', 'missing Wasm export: game_get_buffer_width'); | |
| assert(typeof wasmExports['game_get_buffer_height'] != 'undefined', 'missing Wasm export: game_get_buffer_height'); | |
| assert(typeof wasmExports['game_render_commands'] != 'undefined', 'missing Wasm export: game_render_commands'); | |
| assert(typeof wasmExports['game_get_command_buffer'] != 'undefined', 'missing Wasm export: game_get_command_buffer'); | |
| assert(typeof wasmExports['game_get_command_buffer_size'] != 'undefined', 'missing Wasm export: game_get_command_buffer_size'); | |
| assert(typeof wasmExports['get_physics_hash'] != 'undefined', 'missing Wasm export: get_physics_hash'); | |
| assert(typeof wasmExports['game_get_session_data'] != 'undefined', 'missing Wasm export: game_get_session_data'); | |
| assert(typeof wasmExports['game_get_session_data_length'] != 'undefined', 'missing Wasm export: game_get_session_data_length'); | |
| assert(typeof wasmExports['game_get_current_tick'] != 'undefined', 'missing Wasm export: game_get_current_tick'); | |
| assert(typeof wasmExports['game_get_target_info'] != 'undefined', 'missing Wasm export: game_get_target_info'); | |
| assert(typeof wasmExports['game_cleanup'] != 'undefined', 'missing Wasm export: game_cleanup'); | |
| assert(typeof wasmExports['game_render_pvg'] != 'undefined', 'missing Wasm export: game_render_pvg'); | |
| assert(typeof wasmExports['game_get_pvg_pixels'] != 'undefined', 'missing Wasm export: game_get_pvg_pixels'); | |
| assert(typeof wasmExports['game_get_pvg_stride'] != 'undefined', 'missing Wasm export: game_get_pvg_stride'); | |
| assert(typeof wasmExports['game_get_pvg_renderer'] != 'undefined', 'missing Wasm export: game_get_pvg_renderer'); | |
| assert(typeof wasmExports['fflush'] != 'undefined', 'missing Wasm export: fflush'); | |
| assert(typeof wasmExports['emscripten_builtin_memalign'] != 'undefined', 'missing Wasm export: emscripten_builtin_memalign'); | |
| assert(typeof wasmExports['emscripten_stack_get_end'] != 'undefined', 'missing Wasm export: emscripten_stack_get_end'); | |
| assert(typeof wasmExports['emscripten_stack_get_base'] != 'undefined', 'missing Wasm export: emscripten_stack_get_base'); | |
| assert(typeof wasmExports['strerror'] != 'undefined', 'missing Wasm export: strerror'); | |
| assert(typeof wasmExports['setThrew'] != 'undefined', 'missing Wasm export: setThrew'); | |
| assert(typeof wasmExports['emscripten_stack_init'] != 'undefined', 'missing Wasm export: emscripten_stack_init'); | |
| assert(typeof wasmExports['emscripten_stack_get_free'] != 'undefined', 'missing Wasm export: emscripten_stack_get_free'); | |
| assert(typeof wasmExports['_emscripten_stack_restore'] != 'undefined', 'missing Wasm export: _emscripten_stack_restore'); | |
| assert(typeof wasmExports['_emscripten_stack_alloc'] != 'undefined', 'missing Wasm export: _emscripten_stack_alloc'); | |
| assert(typeof wasmExports['emscripten_stack_get_current'] != 'undefined', 'missing Wasm export: emscripten_stack_get_current'); | |
| assert(typeof wasmExports['memory'] != 'undefined', 'missing Wasm export: memory'); | |
| assert(typeof wasmExports['__indirect_function_table'] != 'undefined', 'missing Wasm export: __indirect_function_table'); | |
| _game_init = Module['_game_init'] = createExportWrapper('game_init', 4); | |
| _free = Module['_free'] = createExportWrapper('free', 1); | |
| _malloc = Module['_malloc'] = createExportWrapper('malloc', 1); | |
| _game_step = Module['_game_step'] = createExportWrapper('game_step', 3); | |
| _game_record_input = Module['_game_record_input'] = createExportWrapper('game_record_input', 2); | |
| _game_record_marker = Module['_game_record_marker'] = createExportWrapper('game_record_marker', 1); | |
| _game_apply_input = Module['_game_apply_input'] = createExportWrapper('game_apply_input', 3); | |
| _game_render = Module['_game_render'] = createExportWrapper('game_render', 0); | |
| _game_is_solved = Module['_game_is_solved'] = createExportWrapper('game_is_solved', 0); | |
| _game_is_failed = Module['_game_is_failed'] = createExportWrapper('game_is_failed', 0); | |
| _game_get_outcome = Module['_game_get_outcome'] = createExportWrapper('game_get_outcome', 0); | |
| _game_get_pixel_buffer = Module['_game_get_pixel_buffer'] = createExportWrapper('game_get_pixel_buffer', 0); | |
| _game_get_pixel_buffer_size = Module['_game_get_pixel_buffer_size'] = createExportWrapper('game_get_pixel_buffer_size', 0); | |
| _game_get_buffer_width = Module['_game_get_buffer_width'] = createExportWrapper('game_get_buffer_width', 0); | |
| _game_get_buffer_height = Module['_game_get_buffer_height'] = createExportWrapper('game_get_buffer_height', 0); | |
| _game_render_commands = Module['_game_render_commands'] = createExportWrapper('game_render_commands', 0); | |
| _game_get_command_buffer = Module['_game_get_command_buffer'] = createExportWrapper('game_get_command_buffer', 0); | |
| _game_get_command_buffer_size = Module['_game_get_command_buffer_size'] = createExportWrapper('game_get_command_buffer_size', 0); | |
| _get_physics_hash = Module['_get_physics_hash'] = createExportWrapper('get_physics_hash', 2); | |
| _game_get_session_data = Module['_game_get_session_data'] = createExportWrapper('game_get_session_data', 0); | |
| _game_get_session_data_length = Module['_game_get_session_data_length'] = createExportWrapper('game_get_session_data_length', 0); | |
| _game_get_current_tick = Module['_game_get_current_tick'] = createExportWrapper('game_get_current_tick', 0); | |
| _game_get_target_info = Module['_game_get_target_info'] = createExportWrapper('game_get_target_info', 3); | |
| _game_cleanup = Module['_game_cleanup'] = createExportWrapper('game_cleanup', 0); | |
| _game_render_pvg = Module['_game_render_pvg'] = createExportWrapper('game_render_pvg', 0); | |
| _game_get_pvg_pixels = Module['_game_get_pvg_pixels'] = createExportWrapper('game_get_pvg_pixels', 0); | |
| _game_get_pvg_stride = Module['_game_get_pvg_stride'] = createExportWrapper('game_get_pvg_stride', 0); | |
| _game_get_pvg_renderer = Module['_game_get_pvg_renderer'] = createExportWrapper('game_get_pvg_renderer', 0); | |
| _fflush = createExportWrapper('fflush', 1); | |
| _emscripten_builtin_memalign = createExportWrapper('emscripten_builtin_memalign', 2); | |
| _emscripten_stack_get_end = wasmExports['emscripten_stack_get_end']; | |
| _emscripten_stack_get_base = wasmExports['emscripten_stack_get_base']; | |
| _strerror = createExportWrapper('strerror', 1); | |
| _setThrew = createExportWrapper('setThrew', 2); | |
| _emscripten_stack_init = wasmExports['emscripten_stack_init']; | |
| _emscripten_stack_get_free = wasmExports['emscripten_stack_get_free']; | |
| __emscripten_stack_restore = wasmExports['_emscripten_stack_restore']; | |
| __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc']; | |
| _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current']; | |
| memory = wasmMemory = Module['wasmMemory'] = wasmExports['memory']; | |
| __indirect_function_table = wasmTable = wasmExports['__indirect_function_table']; | |
| } | |
| var wasmImports = { | |
| /** @export */ | |
| _abort_js: __abort_js, | |
| /** @export */ | |
| _emscripten_throw_longjmp: __emscripten_throw_longjmp, | |
| /** @export */ | |
| clock_time_get: _clock_time_get, | |
| /** @export */ | |
| emscripten_get_now: _emscripten_get_now, | |
| /** @export */ | |
| emscripten_resize_heap: _emscripten_resize_heap, | |
| /** @export */ | |
| fd_close: _fd_close, | |
| /** @export */ | |
| fd_seek: _fd_seek, | |
| /** @export */ | |
| fd_write: _fd_write, | |
| /** @export */ | |
| invoke_iii, | |
| /** @export */ | |
| invoke_vi | |
| }; | |
| function invoke_iii(index,a1,a2) { | |
| var sp = stackSave(); | |
| try { | |
| return getWasmTableEntry(index)(a1,a2); | |
| } catch(e) { | |
| stackRestore(sp); | |
| if (e !== e+0) throw e; | |
| _setThrew(1, 0); | |
| } | |
| } | |
| function invoke_vi(index,a1) { | |
| var sp = stackSave(); | |
| try { | |
| getWasmTableEntry(index)(a1); | |
| } catch(e) { | |
| stackRestore(sp); | |
| if (e !== e+0) throw e; | |
| _setThrew(1, 0); | |
| } | |
| } | |
| // include: postamble.js | |
| // === Auto-generated postamble setup entry stuff === | |
| var calledRun; | |
| function stackCheckInit() { | |
| // This is normally called automatically during __wasm_call_ctors but need to | |
| // get these values before even running any of the ctors so we call it redundantly | |
| // here. | |
| _emscripten_stack_init(); | |
| // TODO(sbc): Move writeStackCookie to native to to avoid this. | |
| writeStackCookie(); | |
| } | |
| function run() { | |
| stackCheckInit(); | |
| preRun(); | |
| function doRun() { | |
| // run may have just been called through dependencies being fulfilled just in this very frame, | |
| // or while the async setStatus time below was happening | |
| assert(!calledRun); | |
| calledRun = true; | |
| Module['calledRun'] = true; | |
| if (ABORT) return; | |
| initRuntime(); | |
| readyPromiseResolve?.(Module); | |
| Module['onRuntimeInitialized']?.(); | |
| consumedModuleProp('onRuntimeInitialized'); | |
| assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); | |
| postRun(); | |
| } | |
| if (Module['setStatus']) { | |
| Module['setStatus']('Running...'); | |
| setTimeout(() => { | |
| setTimeout(() => Module['setStatus'](''), 1); | |
| doRun(); | |
| }, 1); | |
| } else | |
| { | |
| doRun(); | |
| } | |
| checkStackCookie(); | |
| } | |
| function checkUnflushedContent() { | |
| // Compiler settings do not allow exiting the runtime, so flushing | |
| // the streams is not possible. but in ASSERTIONS mode we check | |
| // if there was something to flush, and if so tell the user they | |
| // should request that the runtime be exitable. | |
| // Normally we would not even include flush() at all, but in ASSERTIONS | |
| // builds we do so just for this check, and here we see if there is any | |
| // content to flush, that is, we check if there would have been | |
| // something a non-ASSERTIONS build would have not seen. | |
| // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 | |
| // mode (which has its own special function for this; otherwise, all | |
| // the code is inside libc) | |
| var oldOut = out; | |
| var oldErr = err; | |
| var has = false; | |
| out = err = (x) => { | |
| has = true; | |
| } | |
| try { // it doesn't matter if it fails | |
| flush_NO_FILESYSTEM(); | |
| } catch(e) {} | |
| out = oldOut; | |
| err = oldErr; | |
| if (has) { | |
| warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); | |
| warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)'); | |
| } | |
| } | |
| var wasmExports; | |
| // In modularize mode the generated code is within a factory function so we | |
| // can use await here (since it's not top-level-await). | |
| wasmExports = await (createWasm()); | |
| run(); | |
| // end include: postamble.js | |
| // include: postamble_modularize.js | |
| // In MODULARIZE mode we wrap the generated code in a factory function | |
| // and return either the Module itself, or a promise of the module. | |
| // | |
| // We assign to the `moduleRtn` global here and configure closure to see | |
| // this as and extern so it won't get minified. | |
| if (runtimeInitialized) { | |
| moduleRtn = Module; | |
| } else { | |
| // Set up the promise that indicates the Module is initialized | |
| moduleRtn = new Promise((resolve, reject) => { | |
| readyPromiseResolve = resolve; | |
| readyPromiseReject = reject; | |
| }); | |
| } | |
| // Assertion for attempting to access module properties on the incoming | |
| // moduleArg. In the past we used this object as the prototype of the module | |
| // and assigned properties to it, but now we return a distinct object. This | |
| // keeps the instance private until it is ready (i.e the promise has been | |
| // resolved). | |
| for (const prop of Object.keys(Module)) { | |
| if (!(prop in moduleArg)) { | |
| Object.defineProperty(moduleArg, prop, { | |
| configurable: true, | |
| get() { | |
| abort(`Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`) | |
| } | |
| }); | |
| } | |
| } | |
| // end include: postamble_modularize.js | |
| return moduleRtn; | |
| }; | |
| })(); | |
| // Export using a UMD style export, or ES6 exports if selected | |
| if (typeof exports === 'object' && typeof module === 'object') { | |
| module.exports = createGameModule; | |
| // This default export looks redundant, but it allows TS to import this | |
| // commonjs style module. | |
| module.exports.default = createGameModule; | |
| } else if (typeof define === 'function' && define['amd']) | |
| define([], () => createGameModule); | |