From 752d92a85d282fcadf8bac469092cf4c52c25007 Mon Sep 17 00:00:00 2001 From: Max Base Date: Mon, 18 Nov 2024 12:52:59 +0000 Subject: [PATCH] Release: Update WebAssembly files --- salam-wa.js | 8783 +++++++++++++++++++++---------------------------- salam-wa.wasm | Bin 383696 -> 377914 bytes 2 files changed, 3714 insertions(+), 5069 deletions(-) diff --git a/salam-wa.js b/salam-wa.js index 34a5947..b1a8985 100644 --- a/salam-wa.js +++ b/salam-wa.js @@ -1,9 +1,8 @@ - - +// include: shell.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(Module) { ..generated code.. } +// 2. A function parameter, function(moduleArg) => Promise // 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). @@ -13,15 +12,30 @@ // 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. -'use strict'; - var Module = typeof Module != 'undefined' ? Module : {}; -// See https://caniuse.com/mdn-javascript_builtins_object_assign +// 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 = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != 'undefined'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string' && process.type != 'renderer'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (ENVIRONMENT_IS_NODE) { + // `require()` is no-op in an ESM module, use `createRequire()` to construct + // the require()` function. This is only necessary for multi-environment + // builds, `-sENVIRONMENT=node` emits a static import declaration instead. + // TODO: Swap all `require()`'s with `import()`'s? + +} // --pre-jses are emitted after the Module integration code, so that they can // refer to Module (if they choose; they can also define Module) -// {{PRE_JSES}} + // Sometimes an existing Module object exists with properties // meant to overwrite the default module functionality. Here @@ -32,25 +46,10 @@ var moduleOverrides = Object.assign({}, Module); var arguments_ = []; var thisProgram = './this.program'; -var quit_ = function quit_(status, toThrow) { +var quit_ = (status, toThrow) => { throw toThrow; }; -// 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 = typeof window == 'object'; -var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; -// N.b. Electron.js environment is simultaneously a NODE-environment, but -// also a web environment. -var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; -var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - -if (Module['ENVIRONMENT']) { - throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); -} - // `/` should be present at the end if `scriptDirectory` is not empty var scriptDirectory = ''; function locateFile(path) { @@ -61,273 +60,158 @@ function locateFile(path) { } // Hooks that are implemented differently in different runtime environments. -var read_, readAsync, readBinary, setWindowTitle; - -// Normally we don't log exceptions but instead let them bubble out the top -// level where the embedding environment (e.g. the browser) can handle -// them. -// However under v8 and node we sometimes exit the process direcly in which case -// its up to use us to log the exception before exiting. -// If we fix https://github.com/emscripten-core/emscripten/issues/15080 -// this may no longer be needed under node. -function logExceptionOnExit(e) { - if (e instanceof ExitStatus) return; - var toLog = e; - if (e && typeof e == 'object' && e.stack) { - toLog = [e, e.stack]; - } - err('exiting due to exception: ' + toLog); -} - -var fs; -var nodePath; -var requireNodeFS; +var readAsync, readBinary; if (ENVIRONMENT_IS_NODE) { - if (!(typeof process == 'object' && typeof require == 'function')) 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?)'); - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = require('path').dirname(scriptDirectory) + '/'; - } else { - scriptDirectory = __dirname + '/'; + if (typeof process == 'undefined' || !process.release || process.release.name !== 'node') 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?)'); + + var nodeVersion = process.versions.node; + var numericVersion = nodeVersion.split('.').slice(0, 3); + numericVersion = (numericVersion[0] * 10000) + (numericVersion[1] * 100) + (numericVersion[2].split('-')[0] * 1); + var minVersion = 160000; + if (numericVersion < 160000) { + throw new Error('This emscripten-generated code requires node v16.0.0 (detected v' + nodeVersion + ')'); } - // include: node_shell_read.js + // These modules will usually be used on Node.js. Load them eagerly to avoid + // the complexity of lazy-loading. + var fs = require('fs'); + var nodePath = require('path'); - requireNodeFS = function () { - // Use nodePath as the indicator for these not being initialized, - // since in some environments a global fs may have already been - // created. - if (!nodePath) { - fs = require('fs'); - nodePath = require('path'); - } - }; - - read_ = function shell_read(filename, binary) { - requireNodeFS(); - filename = nodePath['normalize'](filename); - return fs.readFileSync(filename, binary ? undefined : 'utf8'); - }; + scriptDirectory = __dirname + '/'; - readBinary = function (filename) { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert(ret.buffer); - return ret; - }; +// include: node_shell_read.js +readBinary = (filename) => { + // We need to re-wrap `file://` strings to URLs. Normalizing isn't + // necessary in that case, the path should already be absolute. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + var ret = fs.readFileSync(filename); + assert(ret.buffer); + return ret; +}; - readAsync = function (filename, onload, onerror) { - requireNodeFS(); - filename = nodePath['normalize'](filename); - fs.readFile(filename, function (err, data) { - if (err) onerror(err);else onload(data.buffer); +readAsync = (filename, binary = true) => { + // See the comment in the `readBinary` function. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + return new Promise((resolve, reject) => { + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) reject(err); + else resolve(binary ? data.buffer : data); }); - }; - - // end include: node_shell_read.js - if (process['argv'].length > 1) { - thisProgram = process['argv'][1].replace(/\\/g, '/'); + }); +}; +// end include: node_shell_read.js + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); } - arguments_ = process['argv'].slice(2); + arguments_ = process.argv.slice(2); if (typeof module != 'undefined') { module['exports'] = Module; } - process['on']('uncaughtException', function (ex) { - // suppress ExitStatus exceptions from showing an error - if (!(ex instanceof ExitStatus)) { - throw ex; - } - }); - - // Without this older versions of node (< v15) will log unhandled rejections - // but return 0, which is not normally the desired behaviour. This is - // not be needed with node v15 and about because it is now the default - // behaviour: - // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode - process['on']('unhandledRejection', function (reason) { - throw reason; - }); - - quit_ = function (status, toThrow) { - if (keepRuntimeAlive()) { - process['exitCode'] = status; - throw toThrow; - } - logExceptionOnExit(toThrow); - process['exit'](status); - }; - - Module['inspect'] = function () { - return '[Emscripten Module object]'; + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; }; -} else if (ENVIRONMENT_IS_SHELL) { - - if (typeof process == 'object' && typeof require === 'function' || typeof window == 'object' || typeof importScripts == 'function') 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?)'); - - if (typeof read != 'undefined') { - read_ = function shell_read(f) { - return read(f); - }; - } - readBinary = function readBinary(f) { - var data = undefined; - if (typeof readbuffer == 'function') { - return new Uint8Array(readbuffer(f)); - } - data = read(f, 'binary'); - assert(typeof data == 'object'); - return data; - }; +} else +if (ENVIRONMENT_IS_SHELL) { - readAsync = function readAsync(f, onload, onerror) { - setTimeout(function () { - return onload(readBinary(f)); - }, 0); - }; + 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?)'); - if (typeof scriptArgs != 'undefined') { - arguments_ = scriptArgs; - } else if (typeof arguments != 'undefined') { - arguments_ = arguments; - } +} else - if (typeof quit == 'function') { - quit_ = function (status, toThrow) { - logExceptionOnExit(toThrow); - quit(status); - }; +// 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) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; } - - if (typeof print != 'undefined') { - // Prefer to use print/printErr where they exist, as they usually work better. - if (typeof console == 'undefined') console = /** @type{!Console} */{}; - console.log = /** @type{!function(this:Console, ...*): undefined} */print; - console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */typeof printErr != 'undefined' ? printErr : print; + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.startsWith('blob:')) { + scriptDirectory = ''; + } else { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/')+1); } -} 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) { - if (ENVIRONMENT_IS_WORKER) { - // Check worker, not web, since window could be polyfilled - scriptDirectory = self.location.href; - } else if (typeof document != 'undefined' && document.currentScript) { - // web - scriptDirectory = document.currentScript.src; - } - // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. - // otherwise, slice off the final part of the url to find the script directory. - // if scriptDirectory does not contain a slash, lastIndexOf will return -1, - // and scriptDirectory will correctly be replaced with an empty string. - // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), - // they are removed because they could contain a slash. - if (scriptDirectory.indexOf('blob:') !== 0) { - scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/') + 1); - } else { - scriptDirectory = ''; - } - - if (!(typeof window == 'object' || typeof importScripts == 'function')) 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?)'); - - // Differentiate the Web Worker from the Node Worker case, as reading must - // be done differently. - { - // include: web_or_worker_shell_read.js - read_ = function (url) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.send(null); - return xhr.responseText; - }; + 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?)'); - if (ENVIRONMENT_IS_WORKER) { - readBinary = function (url) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.responseType = 'arraybuffer'; - xhr.send(null); - return new Uint8Array( /** @type{!ArrayBuffer} */xhr.response); - }; - } + { +// 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 = function (url, onload, onerror) { + readAsync = (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 = function () { - if (xhr.status == 200 || xhr.status == 0 && xhr.response) { - // file URLs can return 0 - onload(xhr.response); + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + resolve(xhr.response); return; } - onerror(); + reject(xhr.status); }; - xhr.onerror = onerror; + xhr.onerror = reject; xhr.send(null); - }; - - // end include: web_or_worker_shell_read.js + }); } - - setWindowTitle = function (title) { - return document.title = title; - }; - } else { - throw new Error('environment detection error'); + return fetch(url, { credentials: 'same-origin' }) + .then((response) => { + if (response.ok) { + return response.arrayBuffer(); + } + return Promise.reject(new Error(response.status + ' : ' + response.url)); + }) + }; +// end include: web_or_worker_shell_read.js } +} else +{ + throw new Error('environment detection error'); +} var out = Module['print'] || console.log.bind(console); -var err = Module['printErr'] || console.warn.bind(console); +var err = Module['printErr'] || console.error.bind(console); // Merge back in the overrides Object.assign(Module, moduleOverrides); // Free the object hierarchy contained in the overrides, this lets the GC -// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +// reclaim data used. moduleOverrides = null; +checkIncomingModuleAPI(); // Emit code to handle expected values on the Module object. This applies Module.x // to the proper local x. This has two benefits: first, we only emit it if it is // expected to arrive, and second, by using a local everywhere else that can be // minified. -if (Module['arguments']) arguments_ = Module['arguments']; -if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) { - Object.defineProperty(Module, 'arguments', { - configurable: true, - get: function get() { - abort('Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} - -if (Module['thisProgram']) thisProgram = Module['thisProgram']; -if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) { - Object.defineProperty(Module, 'thisProgram', { - configurable: true, - get: function get() { - abort('Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); -if (Module['quit']) quit_ = Module['quit']; -if (!Object.getOwnPropertyDescriptor(Module, 'quit')) { - Object.defineProperty(Module, 'quit', { - configurable: true, - get: function get() { - abort('Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); // perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message // Assertions on removed incoming Module JS APIs. @@ -335,271 +219,30 @@ assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memor 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 (modify read_ in JS)'); +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 setWindowTitle 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'); - -if (!Object.getOwnPropertyDescriptor(Module, 'read')) { - Object.defineProperty(Module, 'read', { - configurable: true, - get: function get() { - abort('Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) { - Object.defineProperty(Module, 'readAsync', { - configurable: true, - get: function get() { - abort('Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) { - Object.defineProperty(Module, 'readBinary', { - configurable: true, - get: function get() { - abort('Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} - -if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) { - Object.defineProperty(Module, 'setWindowTitle', { - configurable: true, - get: function get() { - abort('Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} +legacyModuleProp('asm', 'wasmExports'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); 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 NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; - -assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable."); - -var STACK_ALIGN = 16; -var POINTER_SIZE = 4; - -function getNativeTypeSize(type) { - switch (type) { - case 'i1':case 'i8': - return 1; - case 'i16': - return 2; - case 'i32': - return 4; - case 'i64': - return 8; - case 'float': - return 4; - case 'double': - return 8; - default: - { - if (type[type.length - 1] === '*') { - return POINTER_SIZE; - } else if (type[0] === 'i') { - var bits = Number(type.substr(1)); - assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); - return bits / 8; - } else { - return 0; - } - } - } -} - -function warnOnce(text) { - if (!warnOnce.shown) warnOnce.shown = {}; - if (!warnOnce.shown[text]) { - warnOnce.shown[text] = 1; - err(text); - } -} - -// include: runtime_functions.js - -// Wraps a JS function as a wasm function with a given signature. -function convertJsFunctionToWasm(func, sig) { - - // If the type reflection proposal is available, use the new - // "WebAssembly.Function" constructor. - // Otherwise, construct a minimal wasm module importing the JS function and - // re-exporting it. - if (typeof WebAssembly.Function == "function") { - var typeNames = { - 'i': 'i32', - 'j': 'i64', - 'f': 'f32', - 'd': 'f64' - }; - var type = { - parameters: [], - results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] - }; - for (var i = 1; i < sig.length; ++i) { - type.parameters.push(typeNames[sig[i]]); - } - return new WebAssembly.Function(type, func); - } - - // The module is static, with the exception of the type section, which is - // generated based on the signature passed in. - var typeSection = [0x01, // id: section, - 0x00, // length: 0 (placeholder) - 0x01, // count: 1 - 0x60]; - // form: func - var sigRet = sig.slice(0, 1); - var sigParam = sig.slice(1); - var typeCodes = { - 'i': 0x7f, // i32 - 'j': 0x7e, // i64 - 'f': 0x7d, // f32 - 'd': 0x7c }; - - // Parameters, length + signatures - // f64 - typeSection.push(sigParam.length); - for (var i = 0; i < sigParam.length; ++i) { - typeSection.push(typeCodes[sigParam[i]]); - } - - // Return values, length + signatures - // With no multi-return in MVP, either 0 (void) or 1 (anything else) - if (sigRet == 'v') { - typeSection.push(0x00); - } else { - typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); - } - - // Write the overall length of the type section back into the section header - // (excepting the 2 bytes for the section id and length) - typeSection[1] = typeSection.length - 2; - - // Rest of the module is static - var bytes = new Uint8Array([0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") - 0x01, 0x00, 0x00, 0x00]. // version: 1 - concat(typeSection, [0x02, 0x07, // import section - // (import "e" "f" (func 0 (type 0))) - 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, 0x07, 0x05, // export section - // (export "f" (func 0 (type 0))) - 0x01, 0x01, 0x66, 0x00, 0x00])); - - // We can compile this wasm module synchronously because it is very small. - // This accepts an import (at "e.f"), that it reroutes to an export (at "f") - var module = new WebAssembly.Module(bytes); - var instance = new WebAssembly.Instance(module, { - 'e': { - 'f': func - } - }); - var wrappedFunc = instance.exports['f']; - return wrappedFunc; -} - -var freeTableIndexes = []; - -// Weak map of functions in the table to their indexes, created on first use. -var functionsInTableMap; - -function getEmptyTableSlot() { - // Reuse a free index if there is one, otherwise grow. - if (freeTableIndexes.length) { - return freeTableIndexes.pop(); - } - // Grow the table - try { - wasmTable.grow(1); - } catch (err) { - if (!(err instanceof RangeError)) { - throw err; - } - throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; - } - return wasmTable.length - 1; -} - -function updateTableMap(offset, count) { - for (var i = offset; i < offset + count; i++) { - var item = getWasmTableEntry(i); - // Ignore null values. - if (item) { - functionsInTableMap.set(item, i); - } - } -} - -/** - * Add a function to the table. - * 'sig' parameter is required if the function being added is a JS function. - * @param {string=} sig - */ -function addFunction(func, sig) { - assert(typeof func != 'undefined'); - - // Check if the function is already in the table, to ensure each function - // gets a unique index. First, create the map if this is the first use. - if (!functionsInTableMap) { - functionsInTableMap = new WeakMap(); - updateTableMap(0, wasmTable.length); - } - if (functionsInTableMap.has(func)) { - return functionsInTableMap.get(func); - } +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'; - // It's not in the table, add it now. - - // Make sure functionsInTableMap is actually up to date, that is, that this - // function is not actually in the wasm Table despite not being tracked in - // functionsInTableMap. - for (var i = 0; i < wasmTable.length; i++) { - assert(getWasmTableEntry(i) != func, 'function in Table but not functionsInTableMap'); - } - - var ret = getEmptyTableSlot(); - - // Set the new value. - try { - // Attempting to call this with JS function will cause of table.set() to fail - setWasmTableEntry(ret, func); - } catch (err) { - if (!(err instanceof TypeError)) { - throw err; - } - assert(typeof sig != 'undefined', 'Missing signature argument to addFunction: ' + func); - var wrapped = convertJsFunctionToWasm(func, sig); - setWasmTableEntry(ret, wrapped); - } - - functionsInTableMap.set(func, ret); - - return ret; -} - -function removeFunction(index) { - functionsInTableMap['delete'](getWasmTableEntry(index)); - freeTableIndexes.push(index); -} +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; -// end include: runtime_functions.js -// include: runtime_debug.js +assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.'); -// end include: runtime_debug.js -var tempRet0 = 0; -var setTempRet0 = function setTempRet0(value) { - tempRet0 = value; -}; -var getTempRet0 = function getTempRet0() { - return tempRet0; -}; +// end include: shell.js +// include: preamble.js // === Preamble library stuff === // Documentation for the public APIs defined in this file must be updated in: @@ -610,92 +253,12 @@ var getTempRet0 = function getTempRet0() { // 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 (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; -if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) { - Object.defineProperty(Module, 'wasmBinary', { - configurable: true, - get: function get() { - abort('Module.wasmBinary has been replaced with plain wasmBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} -var noExitRuntime = Module['noExitRuntime'] || true; -if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) { - Object.defineProperty(Module, 'noExitRuntime', { - configurable: true, - get: function get() { - abort('Module.noExitRuntime has been replaced with plain noExitRuntime (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} +var wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); if (typeof WebAssembly != 'object') { - abort('no native wasm support detected'); + err('no native wasm support detected'); } -// include: runtime_safe_heap.js - -// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. -// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) - -/** @param {number} ptr - @param {number} value - @param {string} type - @param {number|boolean=} noSafe */ -function setValue(ptr, value, type, noSafe) { - if (type === undefined) type = 'i8'; - - if (type.charAt(type.length - 1) === '*') type = 'i32'; - switch (type) { - case 'i1': - HEAP8[ptr >> 0] = value;break; - case 'i8': - HEAP8[ptr >> 0] = value;break; - case 'i16': - HEAP16[ptr >> 1] = value;break; - case 'i32': - HEAP32[ptr >> 2] = value;break; - case 'i64': - tempI64 = [value >>> 0, (tempDouble = value, +Math.abs(tempDouble) >= 1.0 ? tempDouble > 0.0 ? (Math.min(+Math.floor(tempDouble / 4294967296.0), 4294967295.0) | 0) >>> 0 : ~ ~ +Math.ceil((tempDouble - +(~ ~tempDouble >>> 0)) / 4294967296.0) >>> 0 : 0)], HEAP32[ptr >> 2] = tempI64[0], HEAP32[ptr + 4 >> 2] = tempI64[1];break; - case 'float': - HEAPF32[ptr >> 2] = value;break; - case 'double': - HEAPF64[ptr >> 3] = value;break; - default: - abort('invalid type for setValue: ' + type); - } -} - -/** @param {number} ptr - @param {string} type - @param {number|boolean=} noSafe */ -function getValue(ptr, type, noSafe) { - if (type === undefined) type = 'i8'; - - if (type.charAt(type.length - 1) === '*') type = 'i32'; - switch (type) { - case 'i1': - return HEAP8[ptr >> 0]; - case 'i8': - return HEAP8[ptr >> 0]; - case 'i16': - return HEAP16[ptr >> 1]; - case 'i32': - return HEAP32[ptr >> 2]; - case 'i64': - return HEAP32[ptr >> 2]; - case 'float': - return HEAPF32[ptr >> 2]; - case 'double': - return Number(HEAPF64[ptr >> 3]); - default: - abort('invalid type for getValue: ' + type); - } - return null; -} - -// end include: runtime_safe_heap.js // Wasm globals var wasmMemory; @@ -713,6 +276,10 @@ var ABORT = false; // 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) { @@ -720,661 +287,135 @@ function assert(condition, text) { } } -// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) -function getCFunc(ident) { - var func = Module['_' + ident]; // closure exported function - assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); - return func; -} - -// C calling interface. -/** @param {string|null=} returnType - @param {Array=} argTypes - @param {Arguments|Array=} args - @param {Object=} opts */ -function ccall(ident, returnType, argTypes, args, opts) { - // For fast lookup of conversion functions - var toC = { - 'string': function string(str) { - var ret = 0; - if (str !== null && str !== undefined && str !== 0) { - // null string - // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' - var len = (str.length << 2) + 1; - ret = stackAlloc(len); - stringToUTF8(str, ret, len); - } - return ret; - }, - 'array': function 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.apply(null, 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 */ -function cwrap(ident, returnType, argTypes, opts) { - return function () { - return ccall(ident, returnType, argTypes, arguments, opts); - }; -} - // We used to include malloc/free by default in the past. Show a helpful error in // builds with assertions. function _free() { // Show a helpful error since we used to include free by default in the past. - abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS"); + abort('free() called but not included in the build - add `_free` to EXPORTED_FUNCTIONS'); +} + +// Memory management + +var HEAP, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +// include: runtime_shared.js +function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); } -// include: runtime_legacy.js +// end include: runtime_shared.js +assert(!Module['STACK_SIZE'], 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') -var ALLOC_NORMAL = 0; // Tries to use _malloc() -var ALLOC_STACK = 1; // Lives for the duration of the current function call +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); -/** - * allocate(): This function is no longer used by emscripten but is kept around to avoid - * breaking external users. - * You should normally not use allocate(), and instead allocate - * memory using _malloc()/stackAlloc(), initialize it with - * setValue(), and so forth. - * @param {(Uint8Array|Array)} slab: An array of data. - * @param {number=} allocator : How to allocate memory, see ALLOC_* - */ -function allocate(slab, allocator) { - var ret; - assert(typeof allocator == 'number', 'allocate no longer takes a type argument'); - assert(typeof slab != 'number', 'allocate no longer takes a number as arg0'); +// If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); +assert(!Module['INITIAL_MEMORY'], 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); - if (allocator == ALLOC_STACK) { - ret = stackAlloc(slab.length); - } else { - ret = _malloc(slab.length); +// 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;checkInt32(0x02135467); + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE;checkInt32(0x89BACDFE); + // Also test the global address 0 for integrity. + HEAPU32[((0)>>2)] = 1668509029;checkInt32(1668509029); +} - if (!slab.subarray && !slab.slice) { - slab = new Uint8Array(slab); +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)!'); } - HEAPU8.set(slab, ret); - return ret; } +// end include: runtime_stack_check.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called -// end include: runtime_legacy.js -// include: runtime_strings.js +var runtimeInitialized = false; -// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. +function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} -// Given a pointer 'ptr' 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. +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; -var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + checkStackCookie(); -/** - * @param {number} idx - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ArrayToString(heap, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. - // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) - while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; - - if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { - return UTF8Decoder.decode(heap.subarray(idx, endPtr)); - } else { - var str = ''; - // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that - 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 = heap[idx++]; - if (!(u0 & 0x80)) { - str += String.fromCharCode(u0);continue; - } - var u1 = heap[idx++] & 63; - if ((u0 & 0xE0) == 0xC0) { - str += String.fromCharCode((u0 & 31) << 6 | u1);continue; - } - var u2 = heap[idx++] & 63; - if ((u0 & 0xF0) == 0xE0) { - u0 = (u0 & 15) << 12 | u1 << 6 | u2; - } else { - if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); - u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[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. -// 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 (i.e. maxBytesToRead will -// not produce a string of exact length [ptr, ptr+maxBytesToRead[) -// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may -// throw JS JIT optimizations off, so it is worth to consider consistently using one -// style or the other. -/** - * @param {number} ptr - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ToString(ptr, maxBytesToRead) { - ; - return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; -} - -// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', -// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. -// outIdx: The starting offset in the array to begin the copying. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. -// This count should include the null terminator, -// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. -// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { - if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. - return 0; - - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. - 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 - // 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.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) { - var u1 = str.charCodeAt(++i); - u = 0x10000 + ((u & 0x3FF) << 10) | u1 & 0x3FF; - } - 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 0x' + u.toString(16) + ' 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; - } - } - // Null-terminate the pointer to the buffer. - heap[outIdx] = 0; - return outIdx - startIdx; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function 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); -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. -function 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 u = str.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | str.charCodeAt(++i) & 0x3FF; - if (u <= 0x7F) ++len;else if (u <= 0x7FF) len += 2;else if (u <= 0xFFFF) len += 3;else len += 4; - } - return len; -} - -// end include: runtime_strings.js -// include: runtime_strings_extra.js - -// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. - -// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -function AsciiToString(ptr) { - var str = ''; - while (1) { - var ch = HEAPU8[ptr++ >> 0]; - if (!ch) return str; - str += String.fromCharCode(ch); - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. - -function stringToAscii(str, outPtr) { - return writeAsciiToMemory(str, outPtr, false); -} - -// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined; - -function UTF16ToString(ptr, maxBytesToRead) { - assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); - var endPtr = ptr; - // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. - // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. - var idx = endPtr >> 1; - var maxIdx = idx + maxBytesToRead / 2; - // If maxBytesToRead is not passed explicitly, it will be undefined, and this - // will always evaluate to true. This saves on code size. - while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; - endPtr = idx << 1; - - if (endPtr - ptr > 32 && UTF16Decoder) { - return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); - } else { - var str = ''; - - // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition - // will always evaluate to true. The loop is then terminated on the first null char. - for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { - var codeUnit = HEAP16[ptr + i * 2 >> 1]; - if (codeUnit == 0) break; - // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. - str += String.fromCharCode(codeUnit); - } - - return str; - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. -// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. -// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF16(str, outPtr, maxBytesToWrite) { - assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); - assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 2) return 0; - maxBytesToWrite -= 2; // Null terminator. - var startPtr = outPtr; - var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length; - for (var i = 0; i < numCharsToWrite; ++i) { - // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - HEAP16[outPtr >> 1] = codeUnit; - outPtr += 2; - } - // Null-terminate the pointer to the HEAP. - HEAP16[outPtr >> 1] = 0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF16(str) { - return str.length * 2; -} - -function UTF32ToString(ptr, maxBytesToRead) { - assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); - var i = 0; - - var str = ''; - // If maxBytesToRead is not passed explicitly, it will be undefined, and this - // will always evaluate to true. This saves on code size. - while (!(i >= maxBytesToRead / 4)) { - var utf32 = HEAP32[ptr + i * 4 >> 2]; - if (utf32 == 0) break; - ++i; - // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - if (utf32 >= 0x10000) { - var ch = utf32 - 0x10000; - str += String.fromCharCode(0xD800 | ch >> 10, 0xDC00 | ch & 0x3FF); - } else { - str += String.fromCharCode(utf32); - } - } - return str; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. -// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. -// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF32(str, outPtr, maxBytesToWrite) { - assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); - assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 4) return 0; - var startPtr = outPtr; - var endPtr = startPtr + maxBytesToWrite - 4; - 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! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { - var trailSurrogate = str.charCodeAt(++i); - codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | trailSurrogate & 0x3FF; - } - HEAP32[outPtr >> 2] = codeUnit; - outPtr += 4; - if (outPtr + 4 > endPtr) break; - } - // Null-terminate the pointer to the HEAP. - HEAP32[outPtr >> 2] = 0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF32(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! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. - len += 4; - } - - return len; -} - -// Allocate heap space for a JS string, and write it there. -// It is the responsibility of the caller to free() that memory. -function allocateUTF8(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = _malloc(size); - if (ret) stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Allocate stack space for a JS string, and write it there. -function allocateUTF8OnStack(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Deprecated: This function should not be called because it is unsafe and does not provide -// a maximum length limit of how many bytes it is allowed to write. Prefer calling the -// function stringToUTF8Array() instead, which takes in a maximum length that can be used -// to be secure from out of bounds writes. -/** @deprecated - @param {boolean=} dontAddNull */ -function writeStringToMemory(string, buffer, dontAddNull) { - warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); - - var /** @type {number} */lastChar, /** @type {number} */end; - if (dontAddNull) { - // stringToUTF8Array always appends null. If we don't want to do that, remember the - // character that existed at the location where the null will be placed, and restore - // that after the write (below). - end = buffer + lengthBytesUTF8(string); - lastChar = HEAP8[end]; - } - stringToUTF8(string, buffer, Infinity); - if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. -} - -function writeArrayToMemory(array, buffer) { - assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)'); - HEAP8.set(array, buffer); -} - -/** @param {boolean=} dontAddNull */ -function writeAsciiToMemory(str, buffer, dontAddNull) { - for (var i = 0; i < str.length; ++i) { - assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff)); - HEAP8[buffer++ >> 0] = str.charCodeAt(i); - } - // Null-terminate the pointer to the HEAP. - if (!dontAddNull) HEAP8[buffer >> 0] = 0; -} - -// end include: runtime_strings_extra.js -// Memory management - -function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - x % multiple; - } - return x; -} - -var HEAP, -/** @type {ArrayBuffer} */ -buffer, -/** @type {Int8Array} */ -HEAP8, -/** @type {Uint8Array} */ -HEAPU8, -/** @type {Int16Array} */ -HEAP16, -/** @type {Uint16Array} */ -HEAPU16, -/** @type {Int32Array} */ -HEAP32, -/** @type {Uint32Array} */ -HEAPU32, -/** @type {Float32Array} */ -HEAPF32, -/** @type {Float64Array} */ -HEAPF64; - -function updateGlobalBufferAndViews(buf) { - buffer = buf; - Module['HEAP8'] = HEAP8 = new Int8Array(buf); - Module['HEAP16'] = HEAP16 = new Int16Array(buf); - Module['HEAP32'] = HEAP32 = new Int32Array(buf); - Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); - Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); - Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); - Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); - Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); -} - -var TOTAL_STACK = 8388608; -if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime'); - -var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216; -if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) { - Object.defineProperty(Module, 'INITIAL_MEMORY', { - configurable: true, - get: function get() { - abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); - } - }); -} - -assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); - -// check for full engine support (use string 'subarray' to avoid closure compiler confusion) -assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, 'JS engine does not provide full typed array support'); - -// If memory is defined in wasm, the user can't provide it. -assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally'); -assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); - -// include: runtime_init_table.js -// In regular non-RELOCATABLE mode the table is exported -// from the wasm module and this will be assigned once -// the exports are available. -var wasmTable; - -// end include: runtime_init_table.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); - // The stack grows downwards - HEAP32[max + 4 >> 2] = 0x2135467; - HEAP32[max + 8 >> 2] = 0x89BACDFE; - // Also test the global address 0 for integrity. - HEAP32[0] = 0x63736d65; /* 'emsc' */ -} - -function checkStackCookie() { - if (ABORT) return; - var max = _emscripten_stack_get_end(); - var cookie1 = HEAPU32[max + 4 >> 2]; - var cookie2 = HEAPU32[max + 8 >> 2]; - if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { - abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' 0x' + cookie1.toString(16)); - } - // Also test the global address 0 for integrity. - if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); -} - -// end include: runtime_stack_check.js -// include: runtime_assertions.js - -// Endianness check -(function () { - var h16 = new Int16Array(1); - var h8 = new Int8Array(h16.buffer); - h16[0] = 0x6373; - if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)'; -})(); - -// end include: runtime_assertions.js -var __ATPRERUN__ = []; // functions called before the runtime is initialized -var __ATINIT__ = []; // functions called during startup -var __ATMAIN__ = []; // functions called when main() is to be run -var __ATEXIT__ = []; // functions called during shutdown -var __ATPOSTRUN__ = []; // functions called after the main() is called - -var runtimeInitialized = false; -var runtimeExited = false; -var runtimeKeepaliveCounter = 0; - -function keepRuntimeAlive() { - return noExitRuntime || runtimeKeepaliveCounter > 0; -} - -function preRun() { - - if (Module['preRun']) { - if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; - while (Module['preRun'].length) { - addOnPreRun(Module['preRun'].shift()); - } - } - - callRuntimeCallbacks(__ATPRERUN__); -} - -function initRuntime() { - checkStackCookie(); - assert(!runtimeInitialized); - runtimeInitialized = true; + setStackLimits(); - ___set_stack_limits(_emscripten_stack_get_base(), _emscripten_stack_get_end()); - - if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); - FS.ignorePermissions = false; + +if (!Module['noFSInit'] && !FS.initialized) + FS.init(); +FS.ignorePermissions = false; - TTY.init(); +TTY.init(); callRuntimeCallbacks(__ATINIT__); } function preMain() { checkStackCookie(); - + callRuntimeCallbacks(__ATMAIN__); } -function exitRuntime() { - checkStackCookie(); - runtimeExited = true; -} - function postRun() { checkStackCookie(); @@ -1400,14 +441,14 @@ function addOnPreMain(cb) { __ATMAIN__.unshift(cb); } -function addOnExit(cb) {} +function addOnExit(cb) { +} function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } // include: runtime_math.js - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround @@ -1420,7 +461,6 @@ assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_ assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); - // end include: runtime_math.js // A counter of dependencies for calling run(). If we need to // do asynchronous work before running, increment this and @@ -1445,16 +485,14 @@ function getUniqueRunDependency(id) { function addRunDependency(id) { runDependencies++; - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } + Module['monitorRunDependencies']?.(runDependencies); if (id) { assert(!runDependencyTracking[id]); runDependencyTracking[id] = 1; if (runDependencyWatcher === null && typeof setInterval != 'undefined') { // Check for missing dependencies every few seconds - runDependencyWatcher = setInterval(function () { + runDependencyWatcher = setInterval(() => { if (ABORT) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; @@ -1466,7 +504,7 @@ function addRunDependency(id) { shown = true; err('still waiting on run dependencies:'); } - err('dependency: ' + dep); + err(`dependency: ${dep}`); } if (shown) { err('(end of list)'); @@ -1481,9 +519,7 @@ function addRunDependency(id) { function removeRunDependency(id) { runDependencies--; - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } + Module['monitorRunDependencies']?.(runDependencies); if (id) { assert(runDependencyTracking[id]); @@ -1504,16 +540,9 @@ function removeRunDependency(id) { } } -Module["preloadedImages"] = {}; // maps url to image data -Module["preloadedAudios"] = {}; // maps url to audio data - /** @param {string|number=} what */ function abort(what) { - { - if (Module['onAbort']) { - Module['onAbort'](what); - } - } + Module['onAbort']?.(what); what = 'Aborted(' + what + ')'; // TODO(sbc): Should we remove printing and leave it up to whoever @@ -1521,17 +550,20 @@ function abort(what) { err(what); ABORT = true; - EXITSTATUS = 1; // 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 - // defintion for WebAssembly.RuntimeError claims it takes no arguments even + // 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); @@ -1541,133 +573,155 @@ function abort(what) { throw e; } -// {{MEM_INITIALIZER}} - // include: memoryprofiler.js - // end include: memoryprofiler.js // include: URIUtils.js - // Prefix of data URIs emitted by SINGLE_FILE and related options. var dataURIPrefix = 'data:application/octet-stream;base64,'; -// Indicates whether filename is a base64 data URI. -function isDataURI(filename) { - // Prefix of data URIs emitted by SINGLE_FILE and related options. - return filename.startsWith(dataURIPrefix); -} +/** + * Indicates whether filename is a base64 data URI. + * @noinline + */ +var isDataURI = (filename) => filename.startsWith(dataURIPrefix); -// Indicates whether filename is delivered via file protocol (as opposed to http/https) -function isFileURI(filename) { - return filename.startsWith('file://'); +/** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ +var isFileURI = (filename) => filename.startsWith('file://'); +// end include: URIUtils.js +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); + }; } -// end include: URIUtils.js -/** @param {boolean=} fixedasm */ -function createExportWrapper(name, fixedasm) { - return function () { - var displayName = name; - var asm = fixedasm; - if (!fixedasm) { - asm = Module['asm']; +// include: runtime_exceptions.js +// end include: runtime_exceptions.js +function findWasmBinary() { + var f = 'salam-wa.wasm'; + if (!isDataURI(f)) { + return locateFile(f); } - assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); - assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); - if (!asm[name]) { - assert(asm[name], 'exported native function `' + displayName + '` not found'); - } - return asm[name].apply(null, arguments); - }; + return f; } var wasmBinaryFile; -wasmBinaryFile = 'salam-wa.wasm'; -if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); + +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw 'both async and sync fetching of the wasm failed'; } -function getBinary(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - if (readBinary) { - return readBinary(file); - } else { - throw "both async and sync fetching of the wasm failed"; - } - } catch (err) { - abort(err); +function getBinaryPromise(binaryFile) { + // If we don't have the binary yet, load it asynchronously using readAsync. + if (!wasmBinary + ) { + // Fetch the binary using readAsync + return readAsync(binaryFile).then( + (response) => new Uint8Array(/** @type{!ArrayBuffer} */(response)), + // Fall back to getBinarySync if readAsync fails + () => getBinarySync(binaryFile) + ); } + + // Otherwise, getBinarySync should be able to get it synchronously + return Promise.resolve().then(() => getBinarySync(binaryFile)); } -function getBinaryPromise() { - // If we don't have the binary yet, try to to load it asynchronously. - // 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 fetch if it is available and the url is not a file, otherwise fall back to XHR. - if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { - if (typeof fetch == 'function' && !isFileURI(wasmBinaryFile)) { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { - if (!response['ok']) { - throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; - } - return response['arrayBuffer'](); - })['catch'](function () { - return getBinary(wasmBinaryFile); - }); - } else { - if (readAsync) { - // fetch is not available or url is file => try XHR (readAsync uses XHR internally) - return new Promise(function (resolve, reject) { - readAsync(wasmBinaryFile, function (response) { - resolve(new Uint8Array( /** @type{!ArrayBuffer} */response)); - }, reject); - }); - } +function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile).then((binary) => { + return WebAssembly.instantiate(binary, imports); + }).then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + 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`); } + abort(reason); + }); +} + +function instantiateAsync(binary, binaryFile, imports, callback) { + if (!binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + // 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 && + typeof fetch == 'function') { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, imports); + + return result.then( + callback, + function(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'); + return instantiateArrayBuffer(binaryFile, imports, callback); + }); + }); } + return instantiateArrayBuffer(binaryFile, imports, callback); +} - // Otherwise, getBinary should be able to get it synchronously - return Promise.resolve().then(function () { - return getBinary(wasmBinaryFile); - }); +function getWasmImports() { + // prepare imports + return { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + } } // Create the wasm instance. // Receives the wasm imports, returns the exports. function createWasm() { - // prepare imports - var info = { - 'env': asmLibraryArg, - 'wasi_snapshot_preview1': asmLibraryArg - }; + var info = getWasmImports(); // 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) { - var exports = instance.exports; - - Module['asm'] = exports; + wasmExports = instance.exports; - wasmMemory = Module['asm']['memory']; - assert(wasmMemory, "memory not found in wasm exports"); - // This assertion doesn't hold when emscripten is run in --post-link - // mode. - // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. - //assert(wasmMemory.buffer.byteLength === 16777216); - updateGlobalBufferAndViews(wasmMemory.buffer); + - wasmTable = Module['asm']['__indirect_function_table']; - assert(wasmTable, "table not found in wasm exports"); + wasmMemory = wasmExports['memory']; + + assert(wasmMemory, 'memory not found in wasm exports'); + updateMemoryViews(); - addOnInit(Module['asm']['__wasm_call_ctors']); + addOnInit(wasmExports['__wasm_call_ctors']); removeRunDependency('wasm-instantiate'); + return wasmExports; } - // we can't run yet (except in a pthread, where we have a custom sync instantiator) + // wait for the pthread pool (if any) addRunDependency('wasm-instantiate'); // Prefer streaming instantiation if available. @@ -1681,65 +735,28 @@ function createWasm() { 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 USE_PTHREADS-enabled path. + // When the regression is fixed, can restore the above PTHREADS-enabled path. receiveInstance(result['instance']); } - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function (binary) { - return WebAssembly.instantiate(binary, info); - }).then(function (instance) { - return instance; - }).then(receiver, function (reason) { - err('failed to asynchronously prepare wasm: ' + reason); - - // Warn on some common problems. - if (isFileURI(wasmBinaryFile)) { - 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'); - } - abort(reason); - }); - } - - function instantiateAsync() { - if (!wasmBinary && typeof WebAssembly.instantiateStreaming == 'function' && !isDataURI(wasmBinaryFile) && - // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. - !isFileURI(wasmBinaryFile) && typeof fetch == 'function') { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { - // Suppress closure warning here since the upstream definition for - // instantiateStreaming only allows Promise rather than - // an actual Response. - // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. - /** @suppress {checkTypes} */ - var result = WebAssembly.instantiateStreaming(response, info); - - return result.then(receiveInstantiationResult, function (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'); - return instantiateArrayBuffer(receiveInstantiationResult); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiationResult); - } - } - // 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. + // 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']) { try { - var exports = Module['instantiateWasm'](info, receiveInstance); - return exports; - } catch (e) { - err('Module.instantiateWasm callback failed with error: ' + e); - return false; + return Module['instantiateWasm'](info, receiveInstance); + } catch(e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; } } - instantiateAsync(); + wasmBinaryFile ??= findWasmBinary(); + + instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); return {}; // no exports yet; we'll fill them in later } @@ -1747,2624 +764,3144 @@ function createWasm() { var tempDouble; var tempI64; -// === Body === +// include: runtime_debug.js +// Endianness check +(() => { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'; +})(); -var ASM_CONSTS = {}; +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); +} + +function legacyModuleProp(prop, newName, incoming=true) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get() { + let extra = incoming ? ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)' : ''; + abort(`\`Module.${prop}\` has been replaced by \`${newName}\`` + extra); -function callRuntimeCallbacks(callbacks) { - while (callbacks.length > 0) { - var callback = callbacks.shift(); - if (typeof callback == 'function') { - callback(Module); // Pass the module as the first argument. - continue; - } - var func = callback.func; - if (typeof func == 'number') { - if (callback.arg === undefined) { - getWasmTableEntry(func)(); - } else { - getWasmTableEntry(func)(callback.arg); } - } else { - func(callback.arg === undefined ? null : callback.arg); - } + }); } } -function withStackSave(f) { - var stack = stackSave(); - var ret = f(); - stackRestore(stack); - return ret; -} -function demangle(func) { - warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); - return func; +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } } -function demangleAll(text) { - var regex = /\b_Z[\w\d_]+/g; - return text.replace(regex, function (x) { - var y = demangle(x); - return x === y ? x : y + ' [' + x + ']'; - }); +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; } -var wasmTableMirror = []; -function getWasmTableEntry(funcPtr) { - var func = wasmTableMirror[funcPtr]; - if (!func) { - if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; - wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); +/** + * Intercept access to a global symbol. This enables us to give informative + * warnings/errors when folks attempt to use symbols they did not include in + * their build, or no symbols that no longer exist. + */ +function hookGlobalSymbolAccess(sym, func) { + if (typeof globalThis != 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + func(); + return undefined; + } + }); } - assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!"); - return func; } -function handleException(e) { - // Certain exception types we do not treat as errors since they are used for - // internal control flow. - // 1. ExitStatus, which is thrown by exit() - // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others - // that wish to return to JS event loop. - if (e instanceof ExitStatus || e == 'unwind') { - return EXITSTATUS; - } - quit_(1, e); +function missingGlobal(sym, msg) { + hookGlobalSymbolAccess(sym, () => { + warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`); + }); } -function jsStackTrace() { - var error = new Error(); - if (!error.stack) { - // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, - // so try that as a special-case. - try { - throw new Error(); - } catch (e) { - error = e; - } - if (!error.stack) { - return '(no stack trace available)'; - } - } - return error.stack.toString(); -} +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); +missingGlobal('asm', 'Please use wasmExports instead'); + +function missingLibrarySymbol(sym) { + hookGlobalSymbolAccess(sym, () => { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + 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`; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; + } + msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + warnOnce(msg); + }); -function setWasmTableEntry(idx, func) { - wasmTable.set(idx, func); - wasmTableMirror[idx] = func; + // Any symbol that is not included from the JS library is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); } -function stackTrace() { - var js = jsStackTrace(); - if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); - return demangleAll(js); +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); + } + }); + } } -function ___handle_stack_overflow(requested) { - requested = requested >>> 0; - abort('stack overflow (Attempt to set SP to 0x' + requested.toString(16) + ', with stack limits [0x' + _emscripten_stack_get_end().toString(16) + ' - 0x' + _emscripten_stack_get_base().toString(16) + '])'); +var MAX_UINT8 = (2 ** 8) - 1; +var MAX_UINT16 = (2 ** 16) - 1; +var MAX_UINT32 = (2 ** 32) - 1; +var MAX_UINT53 = (2 ** 53) - 1; +var MAX_UINT64 = (2 ** 64) - 1; + +var MIN_INT8 = - (2 ** ( 8 - 1)); +var MIN_INT16 = - (2 ** (16 - 1)); +var MIN_INT32 = - (2 ** (32 - 1)); +var MIN_INT53 = - (2 ** (53 - 1)); +var MIN_INT64 = - (2 ** (64 - 1)); + +function checkInt(value, bits, min, max) { + assert(Number.isInteger(Number(value)), `attempt to write non-integer (${value}) into integer heap`); + assert(value <= max, `value (${value}) too large to write as ${bits}-bit value`); + assert(value >= min, `value (${value}) too small to write as ${bits}-bit value`); } -function setErrNo(value) { - HEAP32[___errno_location() >> 2] = value; - return value; +var checkInt1 = (value) => checkInt(value, 1, 1); +var checkInt8 = (value) => checkInt(value, 8, MIN_INT8, MAX_UINT8); +var checkInt16 = (value) => checkInt(value, 16, MIN_INT16, MAX_UINT16); +var checkInt32 = (value) => checkInt(value, 32, MIN_INT32, MAX_UINT32); +var checkInt53 = (value) => checkInt(value, 53, MIN_INT53, MAX_UINT53); +var checkInt64 = (value) => checkInt(value, 64, MIN_INT64, MAX_UINT64); + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(...args) { + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn(...args); } +// end include: runtime_debug.js +// === Body === +// end include: preamble.js -var PATH = { splitPath: function splitPath(filename) { - var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; - return splitPathRe.exec(filename).slice(1); - }, normalizeArray: function normalizeArray(parts, allowAboveRoot) { - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = parts.length - 1; i >= 0; i--) { - var last = parts[i]; - if (last === '.') { - parts.splice(i, 1); - } else if (last === '..') { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; + + class ExitStatus { + name = 'ExitStatus'; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; } } - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up; up--) { - parts.unshift('..'); + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); } - } - return parts; - }, normalize: function normalize(path) { - var isAbsolute = path.charAt(0) === '/', - trailingSlash = path.substr(-1) === '/'; - // Normalize the path - path = PATH.normalizeArray(path.split('/').filter(function (p) { - return !!p; - }), !isAbsolute).join('/'); - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - return (isAbsolute ? '/' : '') + path; - }, dirname: function dirname(path) { - var result = PATH.splitPath(path), - root = result[0], - dir = result[1]; - if (!root && !dir) { - // No dirname whatsoever - return '.'; - } - if (dir) { - // It has a dirname, strip trailing slash - dir = dir.substr(0, dir.length - 1); - } - return root + dir; - }, basename: function basename(path) { - // EMSCRIPTEN return '/'' for '/', not an empty string - if (path === '/') return '/'; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf('/'); - if (lastSlash === -1) return path; - return path.substr(lastSlash + 1); - }, extname: function extname(path) { - return PATH.splitPath(path)[3]; - }, join: function join() { - var paths = Array.prototype.slice.call(arguments, 0); - return PATH.normalize(paths.join('/')); - }, join2: function join2(l, r) { - return PATH.normalize(l + '/' + r); - } }; - -function getRandomDevice() { - if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') { - // for modern web browsers - var randomBuffer = new Uint8Array(1); - return function () { - crypto.getRandomValues(randomBuffer);return randomBuffer[0]; }; - } else if (ENVIRONMENT_IS_NODE) { - // for nodejs with or without crypto support included - try { - var crypto_module = require('crypto'); - // nodejs has crypto support - return function () { - return crypto_module['randomBytes'](1)[0]; - }; - } catch (e) { - // nodejs doesn't have crypto support + + + /** + * @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': abort('to do getValue(i64) use WASM_BIGINT'); + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); } } - // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 - return function () { - abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); - }; -} -var PATH_FS = { resolve: function resolve() { - var resolvedPath = '', - resolvedAbsolute = false; - for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { - var path = i >= 0 ? arguments[i] : FS.cwd(); - // Skip empty and invalid entries - if (typeof path != 'string') { - throw new TypeError('Arguments to path.resolve must be strings'); - } else if (!path) { - return ''; // an invalid portion invalidates the whole thing - } - resolvedPath = path + '/' + resolvedPath; - resolvedAbsolute = path.charAt(0) === '/'; - } - // At this point the path should be resolved to a full absolute path, but - // handle relative paths to be safe (might happen when process.cwd() fails) - resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function (p) { - return !!p; - }), !resolvedAbsolute).join('/'); - return (resolvedAbsolute ? '/' : '') + resolvedPath || '.'; - }, relative: function relative(from, to) { - from = PATH_FS.resolve(from).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (; start < arr.length; start++) { - if (arr[start] !== '') break; - } - var end = arr.length - 1; - for (; end >= 0; end--) { - if (arr[end] !== '') break; - } - if (start > end) return []; - return arr.slice(start, end - start + 1); - } - var fromParts = trim(from.split('/')); - var toParts = trim(to.split('/')); - var length = Math.min(fromParts.length, toParts.length); - var samePartsLength = length; - for (var i = 0; i < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push('..'); + var noExitRuntime = Module['noExitRuntime'] || true; + + var ptrToString = (ptr) => { + assert(typeof ptr === 'number'); + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + }; + + var setStackLimits = () => { + var stackLow = _emscripten_stack_get_base(); + var stackHigh = _emscripten_stack_get_end(); + ___set_stack_limits(stackLow, stackHigh); + }; + + + /** + * @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;checkInt8(value); break; + case 'i8': HEAP8[ptr] = value;checkInt8(value); break; + case 'i16': HEAP16[((ptr)>>1)] = value;checkInt16(value); break; + case 'i32': HEAP32[((ptr)>>2)] = value;checkInt32(value); break; + case 'i64': abort('to do setValue(i64) use WASM_BIGINT'); + 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}`); } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join('/'); - } }; - -var TTY = { ttys: [], init: function init() { - // https://github.com/emscripten-core/emscripten/pull/1555 - // if (ENVIRONMENT_IS_NODE) { - // // currently, FS.init does not distinguish if process.stdin is a file or TTY - // // device, it always assumes it's a TTY device. because of this, we're forcing - // // process.stdin to UTF8 encoding to at least make stdin reading compatible - // // with text files until FS.init can be refactored. - // process['stdin']['setEncoding']('utf8'); - // } - }, shutdown: function shutdown() { - // https://github.com/emscripten-core/emscripten/pull/1555 - // if (ENVIRONMENT_IS_NODE) { - // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? - // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation - // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? - // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle - // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call - // process['stdin']['pause'](); - // } - }, register: function register(dev, ops) { - TTY.ttys[dev] = { input: [], output: [], ops: ops }; - FS.registerDevice(dev, TTY.stream_ops); - }, stream_ops: { open: function open(stream) { - var tty = TTY.ttys[stream.node.rdev]; - if (!tty) { - throw new FS.ErrnoError(43); - } - stream.tty = tty; - stream.seekable = false; - }, close: function close(stream) { - // flush any pending line data - stream.tty.ops.flush(stream.tty); - }, flush: function flush(stream) { - stream.tty.ops.flush(stream.tty); - }, read: function read(stream, buffer, offset, length, pos /* ignored */) { - if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); + } + + 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 bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; + }; + + + + var ___handle_stack_overflow = (requested) => { + var base = _emscripten_stack_get_base(); + var end = _emscripten_stack_get_end(); + abort(`stack overflow (Attempt to set SP to ${ptrToString(requested)}` + + `, with stack limits [${ptrToString(end)} - ${ptrToString(base)}` + + ']). If you require more stack space build with -sSTACK_SIZE='); + }; + + /** @suppress {duplicate } */ + var syscallGetVarargI = () => { + assert(SYSCALLS.varargs != undefined); + // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number. + var ret = HEAP32[((+SYSCALLS.varargs)>>2)]; + SYSCALLS.varargs += 4; + return ret; + }; + var syscallGetVarargP = syscallGetVarargI; + + + var PATH = { + isAbs:(path) => path.charAt(0) === '/', + splitPath:(filename) => { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + }, + normalizeArray:(parts, allowAboveRoot) => { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + }, + normalize:(path) => { + var isAbsolute = PATH.isAbs(path), + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter((p) => !!p), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + }, + dirname:(path) => { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + }, + basename:(path) => { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + }, + join:(...paths) => PATH.normalize(paths.join('/')), + join2:(l, r) => PATH.normalize(l + '/' + r), + }; + + var initRandomFill = () => { + if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') { + // for modern web browsers + return (view) => crypto.getRandomValues(view); + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included try { - result = stream.tty.ops.get_char(stream.tty); + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + // nodejs with LTS crypto support + return (view) => crypto_module['randomFillSync'](view); + } + // very old nodejs with the original crypto API + var randomBytes = crypto_module['randomBytes']; + return (view) => ( + view.set(randomBytes(view.byteLength)), + // Return the original view to match modern native implementations. + view + ); } catch (e) { - throw new FS.ErrnoError(29); + // nodejs doesn't have crypto support } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; } - if (bytesRead) { - stream.node.timestamp = Date.now(); + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + abort('no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: (array) => { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };'); + }; + var randomFill = (view) => { + // Lazily init on the first invocation. + return (randomFill = initRandomFill())(view); + }; + + + + var PATH_FS = { + resolve:(...args) => { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? args[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = PATH.isAbs(path); + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter((p) => !!p), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + }, + relative:(from, to) => { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, + }; + + + var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder() : undefined; + + /** + * 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 + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. Also, use the length info to avoid running tiny + // strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, + // so that undefined/NaN means Infinity) + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); } - return bytesRead; - }, write: function write(stream, buffer, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); + var str = ''; + // If building with TextDecoder, we have already computed the string length + // above, so test loop end condition against that + 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)); + } } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + return str; + }; + + var FS_stdin_getChar_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; } - } catch (e) { - throw new FS.ErrnoError(29); } - if (length) { - stream.node.timestamp = Date.now(); + 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) { + // 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 + // 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.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + 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); + } } - return i; - } }, default_tty_ops: { get_char: function get_char(tty) { - if (!tty.input.length) { + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; + }; + /** @type {function(string, boolean=, number=)} */ + function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; + } + var FS_stdin_getChar = () => { + if (!FS_stdin_getChar_buffer.length) { var result = null; if (ENVIRONMENT_IS_NODE) { // we will read data by chunks of BUFSIZE var BUFSIZE = 256; var buf = Buffer.alloc(BUFSIZE); var bytesRead = 0; - + + // For some reason we must suppress a closure warning here, even though + // fd definitely exists on process.stdin, and is even the proper way to + // get the fd of stdin, + // https://github.com/nodejs/help/issues/2136#issuecomment-523649904 + // This started to happen after moving this logic out of library_tty.js, + // so it is related to the surrounding code in some unclear manner. + /** @suppress {missingProperties} */ + var fd = process.stdin.fd; + try { - bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, -1); - } catch (e) { - // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, - // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. - if (e.toString().includes('EOF')) bytesRead = 0;else throw e; + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an + // exception, but on other OSes, reading EOF returns 0. Uniformize + // behavior by treating the EOF exception to return 0. + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; } - + if (bytesRead > 0) { result = buf.slice(0, bytesRead).toString('utf-8'); - } else { - result = null; } - } else if (typeof window != 'undefined' && typeof window.prompt == 'function') { + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { // Browser. - result = window.prompt('Input: '); // returns null on cancel + result = window.prompt('Input: '); // returns null on cancel if (result !== null) { result += '\n'; } - } else if (typeof readline == 'function') { - // Command line. - result = readline(); - if (result !== null) { - result += '\n'; - } - } + } else + {} if (!result) { return null; } - tty.input = intArrayFromString(result, true); + FS_stdin_getChar_buffer = intArrayFromString(result, true); } - return tty.input.shift(); - }, put_char: function put_char(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. - } - }, flush: function flush(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } }, default_tty1_ops: { put_char: function put_char(tty, val) { - if (val === null || val === 10) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - }, flush: function flush(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } } }; - -function zeroMemory(address, size) { - HEAPU8.fill(0, address, address + size); -} - -function alignMemory(size, alignment) { - assert(alignment, "alignment argument is required"); - return Math.ceil(size / alignment) * alignment; -} -function mmapAlloc(size) { - abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); -} -var MEMFS = { ops_table: null, mount: function mount(_mount) { - return MEMFS.createNode(null, '/', 16384 | 511, /* 0777 */0); - }, createNode: function createNode(parent, name, mode, dev) { - if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { - // no supported - throw new FS.ErrnoError(63); - } - if (!MEMFS.ops_table) { - MEMFS.ops_table = { - dir: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - lookup: MEMFS.node_ops.lookup, - mknod: MEMFS.node_ops.mknod, - rename: MEMFS.node_ops.rename, - unlink: MEMFS.node_ops.unlink, - rmdir: MEMFS.node_ops.rmdir, - readdir: MEMFS.node_ops.readdir, - symlink: MEMFS.node_ops.symlink - }, - stream: { - llseek: MEMFS.stream_ops.llseek + return FS_stdin_getChar_buffer.shift(); + }; + var TTY = { + ttys:[], + init() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process.stdin.setEncoding('utf8'); + // } + }, + shutdown() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process.stdin.pause(); + // } + }, + register(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + }, + stream_ops:{ + open(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); } + stream.tty = tty; + stream.seekable = false; }, - file: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: { - llseek: MEMFS.stream_ops.llseek, - read: MEMFS.stream_ops.read, - write: MEMFS.stream_ops.write, - allocate: MEMFS.stream_ops.allocate, - mmap: MEMFS.stream_ops.mmap, - msync: MEMFS.stream_ops.msync + close(stream) { + // flush any pending line data + stream.tty.ops.fsync(stream.tty); + }, + fsync(stream) { + stream.tty.ops.fsync(stream.tty); + }, + read(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; }, - link: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - readlink: MEMFS.node_ops.readlink - }, - stream: {} + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; }, - chrdev: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: FS.chrdev_stream_ops - } - }; - } - var node = FS.createNode(parent, name, mode, dev); - if (FS.isDir(node.mode)) { - node.node_ops = MEMFS.ops_table.dir.node; - node.stream_ops = MEMFS.ops_table.dir.stream; - node.contents = {}; - } else if (FS.isFile(node.mode)) { - node.node_ops = MEMFS.ops_table.file.node; - node.stream_ops = MEMFS.ops_table.file.stream; - node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. - // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred - // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size - // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. - node.contents = null; - } else if (FS.isLink(node.mode)) { - node.node_ops = MEMFS.ops_table.link.node; - node.stream_ops = MEMFS.ops_table.link.stream; - } else if (FS.isChrdev(node.mode)) { - node.node_ops = MEMFS.ops_table.chrdev.node; - node.stream_ops = MEMFS.ops_table.chrdev.stream; - } - node.timestamp = Date.now(); - // add the new node to the parent - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, getFileDataAsTypedArray: function getFileDataAsTypedArray(node) { - if (!node.contents) return new Uint8Array(0); - if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. - return new Uint8Array(node.contents); - }, expandFileStorage: function expandFileStorage(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. - // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. - // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to - // avoid overshooting the allocation cap by a very large margin. - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125) >>> 0); - if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); // Allocate new storage. - if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. - }, resizeFileStorage: function resizeFileStorage(node, newSize) { - if (node.usedBytes == newSize) return; - if (newSize == 0) { - node.contents = null; // Fully decommit when requesting a resize to zero. - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); // Allocate new storage. - if (oldContents) { - node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. - } - node.usedBytes = newSize; - } - }, node_ops: { getattr: function getattr(node) { - var attr = {}; - // device numbers reuse inode numbers. - attr.dev = FS.isChrdev(node.mode) ? node.id : 1; - attr.ino = node.id; - attr.mode = node.mode; - attr.nlink = 1; - attr.uid = 0; - attr.gid = 0; - attr.rdev = node.rdev; - if (FS.isDir(node.mode)) { - attr.size = 4096; - } else if (FS.isFile(node.mode)) { - attr.size = node.usedBytes; - } else if (FS.isLink(node.mode)) { - attr.size = node.link.length; - } else { - attr.size = 0; - } - attr.atime = new Date(node.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), - // but this is not required by the standard. - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, setattr: function setattr(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, lookup: function lookup(parent, name) { - throw FS.genericErrors[44]; - }, mknod: function mknod(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, rename: function rename(old_node, new_dir, new_name) { - // if we're overwriting a directory at new_name, make sure it's empty. - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); + }, + default_tty_ops:{ + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. } - } - } - // do the internal rewiring - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - old_node.parent = new_dir; - }, unlink: function unlink(parent, name) { - delete parent.contents[name]; - parent.timestamp = Date.now(); - }, rmdir: function rmdir(parent, name) { - var node = FS.lookupNode(parent, name); - for (var i in node.contents) { - throw new FS.ErrnoError(55); - } - delete parent.contents[name]; - parent.timestamp = Date.now(); - }, readdir: function readdir(node) { - var entries = ['.', '..']; - for (var key in node.contents) { - if (!node.contents.hasOwnProperty(key)) { - continue; - } - entries.push(key); - } - return entries; - }, symlink: function symlink(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); - node.link = oldpath; - return node; - }, readlink: function readlink(node) { - if (!FS.isLink(node.mode)) { - throw new FS.ErrnoError(28); - } - return node.link; - } }, stream_ops: { read: function read(stream, buffer, offset, length, position) { - var contents = stream.node.contents; - if (position >= stream.node.usedBytes) return 0; - var size = Math.min(stream.node.usedBytes - position, length); - assert(size >= 0); - if (size > 8 && contents.subarray) { - // non-trivial, and typed array - buffer.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; - } - return size; - }, write: function write(stream, buffer, offset, length, position, canOwn) { - // The data buffer should be a typed array view - assert(!(buffer instanceof ArrayBuffer)); - // If the buffer is located in main memory (HEAP), and if - // memory can grow, we can't hold on to references of the - // memory buffer, as they may get invalidated. That means we - // need to do copy its contents. - if (buffer.buffer === HEAP8.buffer) { - canOwn = false; - } - - if (!length) return 0; - var node = stream.node; - node.timestamp = Date.now(); - - if (buffer.subarray && (!node.contents || node.contents.subarray)) { - // This write is from a typed array to a typed array? - if (canOwn) { - assert(position === 0, 'canOwn must imply no weird position inside the file'); - node.contents = buffer.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. - node.contents = buffer.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - // Writing to an already allocated and used subrange of the file? - node.contents.set(buffer.subarray(offset, offset + length), position); - return length; - } - } - - // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer.subarray) { - // Use typed array write which is available. - node.contents.set(buffer.subarray(offset, offset + length), position); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. - } - } - node.usedBytes = Math.max(node.usedBytes, position + length); - return length; - }, llseek: function llseek(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - position += stream.node.usedBytes; - } - } - if (position < 0) { - throw new FS.ErrnoError(28); - } - return position; - }, allocate: function allocate(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - }, mmap: function mmap(stream, address, length, position, prot, flags) { - if (address !== 0) { - // We don't currently support location hints for the address of the mapping - throw new FS.ErrnoError(28); - } - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - var ptr; - var allocated; - var contents = stream.node.contents; - // Only make a new copy when MAP_PRIVATE is specified. - if (!(flags & 2) && contents.buffer === buffer) { - // We can't emulate MAP_SHARED when the file is not backed by the buffer - // we're mapping to (e.g. the HEAP buffer). - allocated = false; - ptr = contents.byteOffset; - } else { - // Try to avoid unnecessary slices. - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output)); + tty.output = []; + } + }, + ioctl_tcgets(tty) { + // typical setting + return { + c_iflag: 25856, + c_oflag: 5, + c_cflag: 191, + c_lflag: 35387, + c_cc: [ + 0x03, 0x1c, 0x7f, 0x15, 0x04, 0x00, 0x01, 0x00, 0x11, 0x13, 0x1a, 0x00, + 0x12, 0x0f, 0x17, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ] + }; + }, + ioctl_tcsets(tty, optional_actions, data) { + // currently just ignore + return 0; + }, + ioctl_tiocgwinsz(tty) { + return [24, 80]; + }, + }, + default_tty1_ops:{ + put_char(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output)); + tty.output = []; } else { - contents = Array.prototype.slice.call(contents, position, position + length); + if (val != 0) tty.output.push(val); } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { ptr: ptr, allocated: allocated }; - }, msync: function msync(stream, buffer, offset, length, mmapFlags) { - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (mmapFlags & 2) { - // MAP_PRIVATE calls need not to be synced back to underlying fs - return 0; - } - - var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - // should we check if bytesWritten and length are the same? - return 0; - } } }; - -/** @param {boolean=} noRunDep */ -function asyncLoad(url, onload, onerror, noRunDep) { - var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''; - readAsync(url, function (arrayBuffer) { - assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, function (event) { - if (onerror) { - onerror(); - } else { - throw 'Loading data file "' + url + '" failed.'; - } - }); - if (dep) addRunDependency(dep); -} - -var ERRNO_MESSAGES = { 0: "Success", 1: "Arg list too long", 2: "Permission denied", 3: "Address already in use", 4: "Address not available", 5: "Address family not supported by protocol family", 6: "No more processes", 7: "Socket already connected", 8: "Bad file number", 9: "Trying to read unreadable message", 10: "Mount device busy", 11: "Operation canceled", 12: "No children", 13: "Connection aborted", 14: "Connection refused", 15: "Connection reset by peer", 16: "File locking deadlock error", 17: "Destination address required", 18: "Math arg out of domain of func", 19: "Quota exceeded", 20: "File exists", 21: "Bad address", 22: "File too large", 23: "Host is unreachable", 24: "Identifier removed", 25: "Illegal byte sequence", 26: "Connection already in progress", 27: "Interrupted system call", 28: "Invalid argument", 29: "I/O error", 30: "Socket is already connected", 31: "Is a directory", 32: "Too many symbolic links", 33: "Too many open files", 34: "Too many links", 35: "Message too long", 36: "Multihop attempted", 37: "File or path name too long", 38: "Network interface is not configured", 39: "Connection reset by network", 40: "Network is unreachable", 41: "Too many open files in system", 42: "No buffer space available", 43: "No such device", 44: "No such file or directory", 45: "Exec format error", 46: "No record locks available", 47: "The link has been severed", 48: "Not enough core", 49: "No message of desired type", 50: "Protocol not available", 51: "No space left on device", 52: "Function not implemented", 53: "Socket is not connected", 54: "Not a directory", 55: "Directory not empty", 56: "State not recoverable", 57: "Socket operation on non-socket", 59: "Not a typewriter", 60: "No such device or address", 61: "Value too large for defined data type", 62: "Previous owner died", 63: "Not super-user", 64: "Broken pipe", 65: "Protocol error", 66: "Unknown protocol", 67: "Protocol wrong type for socket", 68: "Math result not representable", 69: "Read only file system", 70: "Illegal seek", 71: "No such process", 72: "Stale file handle", 73: "Connection timed out", 74: "Text file busy", 75: "Cross-device link", 100: "Device not a stream", 101: "Bad font file fmt", 102: "Invalid slot", 103: "Invalid request code", 104: "No anode", 105: "Block device required", 106: "Channel number out of range", 107: "Level 3 halted", 108: "Level 3 reset", 109: "Link number out of range", 110: "Protocol driver not attached", 111: "No CSI structure available", 112: "Level 2 halted", 113: "Invalid exchange", 114: "Invalid request descriptor", 115: "Exchange full", 116: "No data (for no delay io)", 117: "Timer expired", 118: "Out of streams resources", 119: "Machine is not on the network", 120: "Package not installed", 121: "The object is remote", 122: "Advertise error", 123: "Srmount error", 124: "Communication error on send", 125: "Cross mount point (not really error)", 126: "Given log. name not unique", 127: "f.d. invalid for this operation", 128: "Remote address changed", 129: "Can access a needed shared lib", 130: "Accessing a corrupted shared lib", 131: ".lib section in a.out corrupted", 132: "Attempting to link in too many libs", 133: "Attempting to exec a shared library", 135: "Streams pipe error", 136: "Too many users", 137: "Socket type not supported", 138: "Not supported", 139: "Protocol family not supported", 140: "Can't send after socket shutdown", 141: "Too many references", 142: "Host is down", 148: "No medium (in tape drive)", 156: "Level 2 not synchronized" }; - -var ERRNO_CODES = {}; -var FS = { root: null, mounts: [], devices: {}, streams: [], nextInode: 1, nameTable: null, currentPath: "/", initialized: false, ignorePermissions: true, ErrnoError: null, genericErrors: {}, filesystems: null, syncFSRequests: 0, lookupPath: function lookupPath(path) { - var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - path = PATH_FS.resolve(FS.cwd(), path); - - if (!path) return { path: '', node: null }; - - var defaults = { - follow_mount: true, - recurse_count: 0 + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output)); + tty.output = []; + } + }, + }, + }; + + + var zeroMemory = (address, size) => { + HEAPU8.fill(0, address, address + size); }; - for (var key in defaults) { - if (opts[key] === undefined) { - opts[key] = defaults[key]; - } - } - - if (opts.recurse_count > 8) { - // max recursive lookup of 8 - throw new FS.ErrnoError(32); - } - - // split the path - var parts = PATH.normalizeArray(path.split('/').filter(function (p) { - return !!p; - }), false); - - // start at the root - var current = FS.root; - var current_path = '/'; - - for (var i = 0; i < parts.length; i++) { - var islast = i === parts.length - 1; - if (islast && opts.parent) { - // stop resolving - break; - } - - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - - // jump to the mount's root node if this is a mountpoint - if (FS.isMountpoint(current)) { - if (!islast || islast && opts.follow_mount) { - current = current.mounted.root; + + var alignMemory = (size, alignment) => { + assert(alignment, "alignment argument is required"); + return Math.ceil(size / alignment) * alignment; + }; + var mmapAlloc = (size) => { + abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); + }; + var MEMFS = { + ops_table:null, + mount(mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + }, + createNode(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); } - } - - // by default, lookupPath will not follow a symlink if it is the final path component. - // setting opts.follow = true will override this behavior. - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - - var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); - current = lookup.node; - - if (count++ > 40) { - // limit max consecutive symlinks to 40 (SYMLOOP_MAX). - throw new FS.ErrnoError(32); + MEMFS.ops_table ||= { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops } + }; + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; } - } - } - - return { path: current_path, node: current }; - }, getPath: function getPath(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) return mount; - return mount[mount.length - 1] !== '/' ? mount + '/' + path : mount + path; - } - path = path ? node.name + '/' + path : node.name; - node = node.parent; - } - }, hashName: function hashName(parentid, name) { - var hash = 0; - - for (var i = 0; i < name.length; i++) { - hash = (hash << 5) - hash + name.charCodeAt(i) | 0; - } - return (parentid + hash >>> 0) % FS.nameTable.length; - }, hashAddNode: function hashAddNode(node) { - var hash = FS.hashName(node.parent.id, node.name); - node.name_next = FS.nameTable[hash]; - FS.nameTable[hash] = node; - }, hashRemoveNode: function hashRemoveNode(node) { - var hash = FS.hashName(node.parent.id, node.name); - if (FS.nameTable[hash] === node) { - FS.nameTable[hash] = node.name_next; - } else { - var current = FS.nameTable[hash]; - while (current) { - if (current.name_next === node) { - current.name_next = node.name_next; - break; + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; } - current = current.name_next; - } - } - }, lookupNode: function lookupNode(parent, name) { - var errCode = FS.mayLookup(parent); - if (errCode) { - throw new FS.ErrnoError(errCode, parent); - } - var hash = FS.hashName(parent.id, name); - for (var node = FS.nameTable[hash]; node; node = node.name_next) { - var nodeName = node.name; - if (node.parent.id === parent.id && nodeName === name) { return node; - } - } - // if we failed to find it in the cache, call into the VFS - return FS.lookup(parent, name); - }, createNode: function createNode(parent, name, mode, rdev) { - assert(typeof parent == 'object'); - var node = new FS.FSNode(parent, name, mode, rdev); - - FS.hashAddNode(node); - - return node; - }, destroyNode: function destroyNode(node) { - FS.hashRemoveNode(node); - }, isRoot: function isRoot(node) { - return node === node.parent; - }, isMountpoint: function isMountpoint(node) { - return !!node.mounted; - }, isFile: function isFile(mode) { - return (mode & 61440) === 32768; - }, isDir: function isDir(mode) { - return (mode & 61440) === 16384; - }, isLink: function isLink(mode) { - return (mode & 61440) === 40960; - }, isChrdev: function isChrdev(mode) { - return (mode & 61440) === 8192; - }, isBlkdev: function isBlkdev(mode) { - return (mode & 61440) === 24576; - }, isFIFO: function isFIFO(mode) { - return (mode & 61440) === 4096; - }, isSocket: function isSocket(mode) { - return (mode & 49152) === 49152; - }, flagModes: { "r": 0, "r+": 2, "w": 577, "w+": 578, "a": 1089, "a+": 1090 }, modeStringToFlags: function modeStringToFlags(str) { - var flags = FS.flagModes[str]; - if (typeof flags == 'undefined') { - throw new Error('Unknown file open mode: ' + str); - } - return flags; - }, flagsToPermissionString: function flagsToPermissionString(flag) { - var perms = ['r', 'w', 'rw'][flag & 3]; - if (flag & 512) { - perms += 'w'; - } - return perms; - }, nodePermissions: function nodePermissions(node, perms) { - if (FS.ignorePermissions) { - return 0; - } - // return 0 if any user, group or owner bits are set. - if (perms.includes('r') && !(node.mode & 292)) { - return 2; - } else if (perms.includes('w') && !(node.mode & 146)) { - return 2; - } else if (perms.includes('x') && !(node.mode & 73)) { - return 2; - } - return 0; - }, mayLookup: function mayLookup(dir) { - var errCode = FS.nodePermissions(dir, 'x'); - if (errCode) return errCode; - if (!dir.node_ops.lookup) return 2; - return 0; - }, mayCreate: function mayCreate(dir, name) { - try { - var node = FS.lookupNode(dir, name); - return 20; - } catch (e) {} - return FS.nodePermissions(dir, 'wx'); - }, mayDelete: function mayDelete(dir, name, isdir) { - var node; - try { - node = FS.lookupNode(dir, name); - } catch (e) { - return e.errno; - } - var errCode = FS.nodePermissions(dir, 'wx'); - if (errCode) { - return errCode; - } - if (isdir) { - if (!FS.isDir(node.mode)) { - return 54; - } - if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { - return 10; - } - } else { - if (FS.isDir(node.mode)) { - return 31; - } - } - return 0; - }, mayOpen: function mayOpen(node, flags) { - if (!node) { - return 44; - } - if (FS.isLink(node.mode)) { - return 32; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write - flags & 512) { - // TODO: check for O_SEARCH? (== search for dir only) - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, MAX_OPEN_FDS: 4096, nextfd: function nextfd() { - var fd_start = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - var fd_end = arguments.length <= 1 || arguments[1] === undefined ? FS.MAX_OPEN_FDS : arguments[1]; - - for (var fd = fd_start; fd <= fd_end; fd++) { - if (!FS.streams[fd]) { - return fd; - } - } - throw new FS.ErrnoError(33); - }, getStream: function getStream(fd) { - return FS.streams[fd]; - }, createStream: function createStream(stream, fd_start, fd_end) { - if (!FS.FSStream) { - FS.FSStream = /** @constructor */function () {}; - FS.FSStream.prototype = { - object: { - get: function get() { - return this.node; - }, - set: function set(val) { - this.node = val; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + } + }, + node_ops:{ + getattr(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now() + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = Date.now(); + }, + rmdir(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.timestamp = Date.now(); + }, + readdir(node) { + var entries = ['.', '..']; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + }, + readlink(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }, + }, + stream_ops:{ + read(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + }, + write(stream, buffer, offset, length, position, canOwn) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + // If the buffer is located in main memory (HEAP), and if + // memory can grow, we can't hold on to references of the + // memory buffer, as they may get invalidated. That means we + // need to do copy its contents. + if (buffer.buffer === HEAP8.buffer) { + canOwn = false; + } + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) { + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; }, - isRead: { - get: function get() { - return (this.flags & 2097155) !== 1; + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); } + return position; }, - isWrite: { - get: function get() { - return (this.flags & 2097155) !== 0; + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + }, + mmap(stream, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents && contents.buffer === HEAP8.buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the + // buffer we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + if (contents) { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + HEAP8.set(contents, ptr); + } } + return { ptr, allocated }; }, - isAppend: { - get: function get() { - return this.flags & 1024; + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }, + }, + }; + + /** @param {boolean=} noRunDep */ + var asyncLoad = (url, onload, onerror, noRunDep) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync(url).then( + (arrayBuffer) => { + assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`); + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, + (err) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; } } - }; - } - // clone it, so we can return an instance of FSStream - stream = Object.assign(new FS.FSStream(), stream); - var fd = FS.nextfd(fd_start, fd_end); - stream.fd = fd; - FS.streams[fd] = stream; - return stream; - }, closeStream: function closeStream(fd) { - FS.streams[fd] = null; - }, chrdev_stream_ops: { open: function open(stream) { - var device = FS.getDevice(stream.node.rdev); - // override node's stream ops with the device's - stream.stream_ops = device.stream_ops; - // forward the open call - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - }, llseek: function llseek() { - throw new FS.ErrnoError(70); - } }, major: function major(dev) { - return dev >> 8; - }, minor: function minor(dev) { - return dev & 0xff; - }, makedev: function makedev(ma, mi) { - return ma << 8 | mi; - }, registerDevice: function registerDevice(dev, ops) { - FS.devices[dev] = { stream_ops: ops }; - }, getDevice: function getDevice(dev) { - return FS.devices[dev]; - }, getMounts: function getMounts(mount) { - var mounts = []; - var check = [mount]; - - while (check.length) { - var m = check.pop(); - - mounts.push(m); - - check.push.apply(check, m.mounts); - } - - return mounts; - }, syncfs: function syncfs(populate, callback) { - if (typeof populate == 'function') { - callback = populate; - populate = false; - } - - FS.syncFSRequests++; - - if (FS.syncFSRequests > 1) { - err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); - } - - var mounts = FS.getMounts(FS.root.mount); - var completed = 0; - - function doCallback(errCode) { - assert(FS.syncFSRequests > 0); - FS.syncFSRequests--; - return callback(errCode); - } - - function done(errCode) { - if (errCode) { - if (!done.errored) { - done.errored = true; - return doCallback(errCode); + ); + if (dep) addRunDependency(dep); + }; + + + var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); + }; + + var preloadPlugins = Module['preloadPlugins'] || []; + var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + // Ensure plugins are ready. + if (typeof Browser != 'undefined') Browser.init(); + + var handled = false; + preloadPlugins.forEach((plugin) => { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; } - return; - } - if (++completed >= mounts.length) { - doCallback(null); - } + }); + return handled; }; - - // sync all mounts - mounts.forEach(function (mount) { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, mount: function mount(type, opts, mountpoint) { - if (typeof type == 'string') { - // The filesystem was not included, and instead we have an error - // message stored in the variable. - throw type; - } - var root = mountpoint === '/'; - var pseudo = !mountpoint; - var node; - - if (root && FS.root) { - throw new FS.ErrnoError(10); - } else if (!root && !pseudo) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - - mountpoint = lookup.path; // use the absolute path - node = lookup.node; - - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); + var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + onload?.(); + removeRunDependency(dep); + } + if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + })) { + return; + } + finish(byteArray); } - - if (!FS.isDir(node.mode)) { - throw new FS.ErrnoError(54); + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, processData, onerror); + } else { + processData(url); } - } - - var mount = { - type: type, - opts: opts, - mountpoint: mountpoint, - mounts: [] }; - - // create a root node for the fs - var mountRoot = type.mount(mount); - mountRoot.mount = mount; - mount.root = mountRoot; - - if (root) { - FS.root = mountRoot; - } else if (node) { - // set as a mountpoint - node.mounted = mount; - - // add the new mount to the current mount's children - if (node.mount) { - node.mount.mounts.push(mount); + + var FS_modeStringToFlags = (str) => { + var flagModes = { + 'r': 0, + 'r+': 2, + 'w': 512 | 64 | 1, + 'w+': 512 | 64 | 2, + 'a': 1024 | 64 | 1, + 'a+': 1024 | 64 | 2, + }; + var flags = flagModes[str]; + if (typeof flags == 'undefined') { + throw new Error(`Unknown file open mode: ${str}`); } - } - - return mountRoot; - }, unmount: function unmount(mountpoint) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - - if (!FS.isMountpoint(lookup.node)) { - throw new FS.ErrnoError(28); - } - - // destroy the nodes for this mount, and all its child mounts - var node = lookup.node; - var mount = node.mounted; - var mounts = FS.getMounts(mount); - - Object.keys(FS.nameTable).forEach(function (hash) { - var current = FS.nameTable[hash]; - - while (current) { - var next = current.name_next; - - if (mounts.includes(current.mount)) { - FS.destroyNode(current); + return flags; + }; + + var FS_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + + + + + + /** + * 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 (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead) => { + assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + }; + + var strError = (errno) => { + return UTF8ToString(_strerror(errno)); + }; + + var ERRNO_CODES = { + 'EPERM': 63, + 'ENOENT': 44, + 'ESRCH': 71, + 'EINTR': 27, + 'EIO': 29, + 'ENXIO': 60, + 'E2BIG': 1, + 'ENOEXEC': 45, + 'EBADF': 8, + 'ECHILD': 12, + 'EAGAIN': 6, + 'EWOULDBLOCK': 6, + 'ENOMEM': 48, + 'EACCES': 2, + 'EFAULT': 21, + 'ENOTBLK': 105, + 'EBUSY': 10, + 'EEXIST': 20, + 'EXDEV': 75, + 'ENODEV': 43, + 'ENOTDIR': 54, + 'EISDIR': 31, + 'EINVAL': 28, + 'ENFILE': 41, + 'EMFILE': 33, + 'ENOTTY': 59, + 'ETXTBSY': 74, + 'EFBIG': 22, + 'ENOSPC': 51, + 'ESPIPE': 70, + 'EROFS': 69, + 'EMLINK': 34, + 'EPIPE': 64, + 'EDOM': 18, + 'ERANGE': 68, + 'ENOMSG': 49, + 'EIDRM': 24, + 'ECHRNG': 106, + 'EL2NSYNC': 156, + 'EL3HLT': 107, + 'EL3RST': 108, + 'ELNRNG': 109, + 'EUNATCH': 110, + 'ENOCSI': 111, + 'EL2HLT': 112, + 'EDEADLK': 16, + 'ENOLCK': 46, + 'EBADE': 113, + 'EBADR': 114, + 'EXFULL': 115, + 'ENOANO': 104, + 'EBADRQC': 103, + 'EBADSLT': 102, + 'EDEADLOCK': 16, + 'EBFONT': 101, + 'ENOSTR': 100, + 'ENODATA': 116, + 'ETIME': 117, + 'ENOSR': 118, + 'ENONET': 119, + 'ENOPKG': 120, + 'EREMOTE': 121, + 'ENOLINK': 47, + 'EADV': 122, + 'ESRMNT': 123, + 'ECOMM': 124, + 'EPROTO': 65, + 'EMULTIHOP': 36, + 'EDOTDOT': 125, + 'EBADMSG': 9, + 'ENOTUNIQ': 126, + 'EBADFD': 127, + 'EREMCHG': 128, + 'ELIBACC': 129, + 'ELIBBAD': 130, + 'ELIBSCN': 131, + 'ELIBMAX': 132, + 'ELIBEXEC': 133, + 'ENOSYS': 52, + 'ENOTEMPTY': 55, + 'ENAMETOOLONG': 37, + 'ELOOP': 32, + 'EOPNOTSUPP': 138, + 'EPFNOSUPPORT': 139, + 'ECONNRESET': 15, + 'ENOBUFS': 42, + 'EAFNOSUPPORT': 5, + 'EPROTOTYPE': 67, + 'ENOTSOCK': 57, + 'ENOPROTOOPT': 50, + 'ESHUTDOWN': 140, + 'ECONNREFUSED': 14, + 'EADDRINUSE': 3, + 'ECONNABORTED': 13, + 'ENETUNREACH': 40, + 'ENETDOWN': 38, + 'ETIMEDOUT': 73, + 'EHOSTDOWN': 142, + 'EHOSTUNREACH': 23, + 'EINPROGRESS': 26, + 'EALREADY': 7, + 'EDESTADDRREQ': 17, + 'EMSGSIZE': 35, + 'EPROTONOSUPPORT': 66, + 'ESOCKTNOSUPPORT': 137, + 'EADDRNOTAVAIL': 4, + 'ENETRESET': 39, + 'EISCONN': 30, + 'ENOTCONN': 53, + 'ETOOMANYREFS': 141, + 'EUSERS': 136, + 'EDQUOT': 19, + 'ESTALE': 72, + 'ENOTSUP': 138, + 'ENOMEDIUM': 148, + 'EILSEQ': 25, + 'EOVERFLOW': 61, + 'ECANCELED': 11, + 'ENOTRECOVERABLE': 56, + 'EOWNERDEAD': 62, + 'ESTRPIPE': 135, + }; + var FS = { + root:null, + mounts:[], + devices:{ + }, + streams:[], + nextInode:1, + nameTable:null, + currentPath:"/", + initialized:false, + ignorePermissions:true, + ErrnoError:class extends Error { + name = 'ErrnoError'; + // We set the `name` property to be able to identify `FS.ErrnoError` + // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway. + // - when using PROXYFS, an error can come from an underlying FS + // as different FS objects have their own FS.ErrnoError each, + // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs. + // we'll use the reliable test `err.name == "ErrnoError"` instead + constructor(errno) { + super(runtimeInitialized ? strError(errno) : ''); + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } } - - current = next; - } - }); - - // no longer a mountpoint - node.mounted = null; - - // remove this mount from the child mounts - var idx = node.mount.mounts.indexOf(mount); - assert(idx !== -1); - node.mount.mounts.splice(idx, 1); - }, lookup: function lookup(parent, name) { - return parent.node_ops.lookup(parent, name); - }, mknod: function mknod(path, mode, dev) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - if (!name || name === '.' || name === '..') { - throw new FS.ErrnoError(28); - } - var errCode = FS.mayCreate(parent, name); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.mknod) { - throw new FS.ErrnoError(63); - } - return parent.node_ops.mknod(parent, name, mode, dev); - }, create: function create(path, mode) { - mode = mode !== undefined ? mode : 438; - /* 0666 */mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, mkdir: function mkdir(path, mode) { - mode = mode !== undefined ? mode : 511; - /* 0777 */mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, mkdirTree: function mkdirTree(path, mode) { - var dirs = path.split('/'); - var d = ''; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) continue; - d += '/' + dirs[i]; - try { - FS.mkdir(d, mode); - } catch (e) { - if (e.errno != 20) throw e; - } - } - }, mkdev: function mkdev(path, mode, dev) { - if (typeof dev == 'undefined') { - dev = mode; - mode = 438; - } - /* 0666 */mode |= 8192; - return FS.mknod(path, mode, dev); - }, symlink: function symlink(oldpath, newpath) { - if (!PATH_FS.resolve(oldpath)) { - throw new FS.ErrnoError(44); - } - var lookup = FS.lookupPath(newpath, { parent: true }); - var parent = lookup.node; - if (!parent) { - throw new FS.ErrnoError(44); - } - var newname = PATH.basename(newpath); - var errCode = FS.mayCreate(parent, newname); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.symlink) { - throw new FS.ErrnoError(63); - } - return parent.node_ops.symlink(parent, newname, oldpath); - }, rename: function rename(old_path, new_path) { - var old_dirname = PATH.dirname(old_path); - var new_dirname = PATH.dirname(new_path); - var old_name = PATH.basename(old_path); - var new_name = PATH.basename(new_path); - // parents must exist - var lookup, old_dir, new_dir; - - // let the errors from non existant directories percolate up - lookup = FS.lookupPath(old_path, { parent: true }); - old_dir = lookup.node; - lookup = FS.lookupPath(new_path, { parent: true }); - new_dir = lookup.node; - - if (!old_dir || !new_dir) throw new FS.ErrnoError(44); - // need to be part of the same mount - if (old_dir.mount !== new_dir.mount) { - throw new FS.ErrnoError(75); - } - // source must exist - var old_node = FS.lookupNode(old_dir, old_name); - // old path should not be an ancestor of the new path - var relative = PATH_FS.relative(old_path, new_dirname); - if (relative.charAt(0) !== '.') { - throw new FS.ErrnoError(28); - } - // new path should not be an ancestor of the old path - relative = PATH_FS.relative(new_path, old_dirname); - if (relative.charAt(0) !== '.') { - throw new FS.ErrnoError(55); - } - // see if the new path already exists - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) {} - // not fatal - - // early out if nothing needs to change - if (old_node === new_node) { - return; - } - // we'll need to delete the old entry - var isdir = FS.isDir(old_node.mode); - var errCode = FS.mayDelete(old_dir, old_name, isdir); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - // need delete permissions if we'll be overwriting. - // need create permissions if new doesn't already exist. - errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!old_dir.node_ops.rename) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) { - throw new FS.ErrnoError(10); - } - // if we are going to change the parent, check write permissions - if (new_dir !== old_dir) { - errCode = FS.nodePermissions(old_dir, 'w'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - } - // remove the node from the lookup hash - FS.hashRemoveNode(old_node); - // do the underlying fs rename - try { - old_dir.node_ops.rename(old_node, new_dir, new_name); - } catch (e) { - throw e; - } finally { - // add the node back to the hash (in case node_ops.rename - // changed its name) - FS.hashAddNode(old_node); - } - }, rmdir: function rmdir(path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var errCode = FS.mayDelete(parent, name, true); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.rmdir) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - parent.node_ops.rmdir(parent, name); - FS.destroyNode(node); - }, readdir: function readdir(path) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.readdir(node); - }, unlink: function unlink(path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - if (!parent) { - throw new FS.ErrnoError(44); - } - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var errCode = FS.mayDelete(parent, name, false); - if (errCode) { - // According to POSIX, we should map EISDIR to EPERM, but - // we instead do what Linux does (and we must, as we use - // the musl linux libc). - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.unlink) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - parent.node_ops.unlink(parent, name); - FS.destroyNode(node); - }, readlink: function readlink(path) { - var lookup = FS.lookupPath(path); - var link = lookup.node; - if (!link) { - throw new FS.ErrnoError(44); - } - if (!link.node_ops.readlink) { - throw new FS.ErrnoError(28); - } - return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); - }, stat: function stat(path, dontFollow) { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, lstat: function lstat(path) { - return FS.stat(path, true); - }, chmod: function chmod(path, mode, dontFollow) { - var node; - if (typeof path == 'string') { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: mode & 4095 | node.mode & ~4095, - timestamp: Date.now() - }); - }, lchmod: function lchmod(path, mode) { - FS.chmod(path, mode, true); - }, fchmod: function fchmod(fd, mode) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - FS.chmod(stream.node, mode); - }, chown: function chown(path, uid, gid, dontFollow) { - var node; - if (typeof path == 'string') { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - timestamp: Date.now() - // we ignore the uid / gid for now - }); - }, lchown: function lchown(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, fchown: function fchown(fd, uid, gid) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - FS.chown(stream.node, uid, gid); - }, truncate: function truncate(path, len) { - if (len < 0) { - throw new FS.ErrnoError(28); - } - var node; - if (typeof path == 'string') { - var lookup = FS.lookupPath(path, { follow: true }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - if (FS.isDir(node.mode)) { - throw new FS.ErrnoError(31); - } - if (!FS.isFile(node.mode)) { - throw new FS.ErrnoError(28); - } - var errCode = FS.nodePermissions(node, 'w'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - node.node_ops.setattr(node, { - size: len, - timestamp: Date.now() - }); - }, ftruncate: function ftruncate(fd, len) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, utime: function utime(path, atime, mtime) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - node.node_ops.setattr(node, { - timestamp: Math.max(atime, mtime) - }); - }, open: function open(path, flags, mode, fd_start, fd_end) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == 'string' ? FS.modeStringToFlags(flags) : flags; - mode = typeof mode == 'undefined' ? 438 /* 0666 */ : mode; - if (flags & 64) { - mode = mode & 4095 | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == 'object') { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) + }, + genericErrors:{ + }, + filesystems:null, + syncFSRequests:0, + readFiles:{ + }, + FSStream:class { + shared = {}; + get object() { + return this.node; + } + set object(val) { + this.node = val; + } + get isRead() { + return (this.flags & 2097155) !== 1; + } + get isWrite() { + return (this.flags & 2097155) !== 0; + } + get isAppend() { + return (this.flags & 1024); + } + get flags() { + return this.shared.flags; + } + set flags(val) { + this.shared.flags = val; + } + get position() { + return this.shared.position; + } + set position(val) { + this.shared.position = val; + } + }, + FSNode:class { + node_ops = {}; + stream_ops = {}; + readMode = 292 | 73; + writeMode = 146; + mounted = null; + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.rdev = rdev; + } + get read() { + return (this.mode & this.readMode) === this.readMode; + } + set read(val) { + val ? this.mode |= this.readMode : this.mode &= ~this.readMode; + } + get write() { + return (this.mode & this.writeMode) === this.writeMode; + } + set write(val) { + val ? this.mode |= this.writeMode : this.mode &= ~this.writeMode; + } + get isFolder() { + return FS.isDir(this.mode); + } + get isDevice() { + return FS.isChrdev(this.mode); + } + }, + lookupPath(path, opts = {}) { + path = PATH_FS.resolve(path); + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + opts = Object.assign(defaults, opts) + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + + // split the absolute path + var parts = path.split('/').filter((p) => !!p); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count + 1 }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + + return { path: current_path, node: current }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? `${mount}/${path}` : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + }, + hashAddNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + }, + hashRemoveNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + }, + lookupNode(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + }, + createNode(parent, name, mode, rdev) { + assert(typeof parent == 'object') + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + }, + destroyNode(node) { + FS.hashRemoveNode(node); + }, + isRoot(node) { + return node === node.parent; + }, + isMountpoint(node) { + return !!node.mounted; + }, + isFile(mode) { + return (mode & 61440) === 32768; + }, + isDir(mode) { + return (mode & 61440) === 16384; + }, + isLink(mode) { + return (mode & 61440) === 40960; + }, + isChrdev(mode) { + return (mode & 61440) === 8192; + }, + isBlkdev(mode) { + return (mode & 61440) === 24576; + }, + isFIFO(mode) { + return (mode & 61440) === 4096; + }, + isSocket(mode) { + return (mode & 49152) === 49152; + }, + flagsToPermissionString(flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + }, + nodePermissions(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes('r') && !(node.mode & 292)) { + return 2; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else if (perms.includes('x') && !(node.mode & 73)) { + return 2; + } + return 0; + }, + mayLookup(dir) { + if (!FS.isDir(dir.mode)) return 54; + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + }, + mayCreate(dir, name) { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + }, + mayDelete(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + }, + mayOpen(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + MAX_OPEN_FDS:4096, + nextfd() { + for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + }, + getStreamChecked(fd) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + return stream; + }, + getStream:(fd) => FS.streams[fd], + createStream(stream, fd = -1) { + assert(fd >= -1); + + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); + if (fd == -1) { + fd = FS.nextfd(); + } + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + }, + closeStream(fd) { + FS.streams[fd] = null; + }, + dupStream(origStream, fd = -1) { + var stream = FS.createStream(origStream, fd); + stream.stream_ops?.dup?.(stream); + return stream; + }, + chrdev_stream_ops:{ + open(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + stream.stream_ops.open?.(stream); + }, + llseek() { + throw new FS.ErrnoError(70); + }, + }, + major:(dev) => ((dev) >> 8), + minor:(dev) => ((dev) & 0xff), + makedev:(ma, mi) => ((ma) << 8 | (mi)), + registerDevice(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + }, + getDevice:(dev) => FS.devices[dev], + getMounts(mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push(...m.mounts); + } + + return mounts; + }, + syncfs(populate, callback) { + if (typeof populate == 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + mount(type, opts, mountpoint) { + if (typeof type == 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type, + opts, + mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + }, + unmount(mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + }, + lookup(parent, name) { + return parent.node_ops.lookup(parent, name); + }, + mknod(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + }, + mkdev(path, mode, dev) { + if (typeof dev == 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + }, + symlink(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + }, + rename(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existent directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + // update old node (we do this here to avoid each backend + // needing to) + old_node.parent = new_dir; + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + }, + rmdir(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + }, + readdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + }, + unlink(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + }, + readlink(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + truncate(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() }); - node = lookup.node; - } catch (e) { - // ignore - } - } - // perhaps we need to create the node - var created = false; - if (flags & 64) { - if (node) { - // if O_CREAT and O_EXCL are set, error out if the node already exists - if (flags & 128) { - throw new FS.ErrnoError(20); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); } - } else { - // node doesn't exist, try to create it - node = FS.mknod(path, mode, 0); - created = true; - } - } - if (!node) { - throw new FS.ErrnoError(44); - } - // can't truncate a device - if (FS.isChrdev(node.mode)) { - flags &= ~512; - } - // if asked only for a directory, then this must be one - if (flags & 65536 && !FS.isDir(node.mode)) { - throw new FS.ErrnoError(54); - } - // check permissions, if this is not a file we just created now (it is ok to - // create and write to a file with read-only permissions; it is read-only - // for later use) - if (!created) { - var errCode = FS.mayOpen(node, flags); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - } - // do truncation if necessary - if (flags & 512) { - FS.truncate(node, 0); - } - // we've already handled these, don't pass down to the underlying vfs - flags &= ~(128 | 512 | 131072); - - // register the stream with the filesystem - var stream = FS.createStream({ - node: node, - path: FS.getPath(node), // we want the absolute path to the node - flags: flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - // used by the file family libc calls (fopen, fwrite, ferror, etc.) - ungotten: [], - error: false - }, fd_start, fd_end); - // call the new stream's open function - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module['logReadFiles'] && !(flags & 1)) { - if (!FS.readFiles) FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - } - } - return stream; - }, close: function close(stream) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (stream.getdents) stream.getdents = null; // free readdir state - try { - if (stream.stream_ops.close) { - stream.stream_ops.close(stream); - } - } catch (e) { - throw e; - } finally { - FS.closeStream(stream.fd); - } - stream.fd = null; - }, isClosed: function isClosed(stream) { - return stream.fd === null; - }, llseek: function llseek(stream, offset, whence) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (!stream.seekable || !stream.stream_ops.llseek) { - throw new FS.ErrnoError(70); - } - if (whence != 0 && whence != 1 && whence != 2) { - throw new FS.ErrnoError(28); - } - stream.position = stream.stream_ops.llseek(stream, offset, whence); - stream.ungotten = []; - return stream.position; - }, read: function read(stream, buffer, offset, length, position) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(28); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(8); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(31); - } - if (!stream.stream_ops.read) { - throw new FS.ErrnoError(28); - } - var seeking = typeof position != 'undefined'; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(70); - } - var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); - if (!seeking) stream.position += bytesRead; - return bytesRead; - }, write: function write(stream, buffer, offset, length, position, canOwn) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(28); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(31); - } - if (!stream.stream_ops.write) { - throw new FS.ErrnoError(28); - } - if (stream.seekable && stream.flags & 1024) { - // seek to the end before writing in append mode - FS.llseek(stream, 0, 2); - } - var seeking = typeof position != 'undefined'; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(70); - } - var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); - if (!seeking) stream.position += bytesWritten; - return bytesWritten; - }, allocate: function allocate(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, mmap: function mmap(stream, address, length, position, prot, flags) { - // User requests writing to file (prot & PROT_WRITE != 0). - // Checking if we have permissions to write to the file unless - // MAP_PRIVATE flag is set. According to POSIX spec it is possible - // to write to file opened in read-only mode with MAP_PRIVATE flag, - // as all modifications will be visible only in the memory of - // the current process. - if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) { - throw new FS.ErrnoError(2); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(2); - } - if (!stream.stream_ops.mmap) { - throw new FS.ErrnoError(43); - } - return stream.stream_ops.mmap(stream, address, length, position, prot, flags); - }, msync: function msync(stream, buffer, offset, length, mmapFlags) { - if (!stream || !stream.stream_ops.msync) { - return 0; - } - return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); - }, munmap: function munmap(stream) { - return 0; - }, ioctl: function ioctl(stream, cmd, arg) { - if (!stream.stream_ops.ioctl) { - throw new FS.ErrnoError(59); - } - return stream.stream_ops.ioctl(stream, cmd, arg); - }, readFile: function readFile(path) { - var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - opts.flags = opts.flags || 0; - opts.encoding = opts.encoding || 'binary'; - if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { - throw new Error('Invalid encoding type "' + opts.encoding + '"'); - } - var ret; - var stream = FS.open(path, opts.flags); - var stat = FS.stat(path); - var length = stat.size; - var buf = new Uint8Array(length); - FS.read(stream, buf, 0, length, 0); - if (opts.encoding === 'utf8') { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === 'binary') { - ret = buf; - } - FS.close(stream); - return ret; - }, writeFile: function writeFile(path, data) { - var opts = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; - - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data == 'string') { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); - } else { - throw new Error('Unsupported data type'); - } - FS.close(stream); - }, cwd: function cwd() { - return FS.currentPath; - }, chdir: function chdir(path) { - var lookup = FS.lookupPath(path, { follow: true }); - if (lookup.node === null) { - throw new FS.ErrnoError(44); - } - if (!FS.isDir(lookup.node.mode)) { - throw new FS.ErrnoError(54); - } - var errCode = FS.nodePermissions(lookup.node, 'x'); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - FS.currentPath = lookup.path; - }, createDefaultDirectories: function createDefaultDirectories() { - FS.mkdir('/tmp'); - FS.mkdir('/home'); - FS.mkdir('/home/web_user'); - }, createDefaultDevices: function createDefaultDevices() { - // create /dev - FS.mkdir('/dev'); - // setup /dev/null - FS.registerDevice(FS.makedev(1, 3), { - read: function read() { - return 0; + FS.truncate(stream.node, len); }, - write: function write(stream, buffer, offset, length, pos) { - return length; - } - }); - FS.mkdev('/dev/null', FS.makedev(1, 3)); - // setup /dev/tty and /dev/tty1 - // stderr needs to print output using err() rather than out() - // so we register a second tty just for it. - TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); - TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); - FS.mkdev('/dev/tty', FS.makedev(5, 0)); - FS.mkdev('/dev/tty1', FS.makedev(6, 0)); - // setup /dev/[u]random - var random_device = getRandomDevice(); - FS.createDevice('/dev', 'random', random_device); - FS.createDevice('/dev', 'urandom', random_device); - // we're not going to emulate the actual shm device, - // just create the tmp dirs that reside in it commonly - FS.mkdir('/dev/shm'); - FS.mkdir('/dev/shm/tmp'); - }, createSpecialDirectories: function createSpecialDirectories() { - // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the - // name of the stream for fd 6 (see test_unistd_ttyname) - FS.mkdir('/proc'); - var proc_self = FS.mkdir('/proc/self'); - FS.mkdir('/proc/self/fd'); - FS.mount({ - mount: function mount() { - var node = FS.createNode(proc_self, 'fd', 16384 | 511, /* 0777 */73); - node.node_ops = { - lookup: function lookup(parent, name) { - var fd = +name; - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(8); - var ret = { - parent: null, - mount: { mountpoint: 'fake' }, - node_ops: { readlink: function readlink() { - return stream.path; - } } - }; - ret.parent = ret; // make it look like a simple root node - return ret; + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + }, + open(path, flags, mode) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + if ((flags & 64)) { + mode = typeof mode == 'undefined' ? 438 /* 0666 */ : mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore } - }; - return node; - } - }, {}, '/proc/self/fd'); - }, createStandardStreams: function createStandardStreams() { - // TODO deprecate the old functionality of a single - // input / output callback and that utilizes FS.createDevice - // and instead require a unique set of stream ops - - // by default, we symlink the standard streams to the - // default tty devices. however, if the standard streams - // have been overwritten we create a unique device for - // them instead. - if (Module['stdin']) { - FS.createDevice('/dev', 'stdin', Module['stdin']); - } else { - FS.symlink('/dev/tty', '/dev/stdin'); - } - if (Module['stdout']) { - FS.createDevice('/dev', 'stdout', null, Module['stdout']); - } else { - FS.symlink('/dev/tty', '/dev/stdout'); - } - if (Module['stderr']) { - FS.createDevice('/dev', 'stderr', null, Module['stderr']); - } else { - FS.symlink('/dev/tty1', '/dev/stderr'); - } - - // open default streams for the stdin, stdout and stderr devices - var stdin = FS.open('/dev/stdin', 0); - var stdout = FS.open('/dev/stdout', 1); - var stderr = FS.open('/dev/stderr', 1); - assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); - assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); - assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); - }, ensureErrnoError: function ensureErrnoError() { - if (FS.ErrnoError) return; - FS.ErrnoError = /** @this{Object} */function ErrnoError(errno, node) { - this.node = node; - this.setErrno = /** @this{Object} */function (errno) { - this.errno = errno; - for (var key in ERRNO_CODES) { - if (ERRNO_CODES[key] === errno) { - this.code = key; - break; + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; } } - }; - this.setErrno(errno); - this.message = ERRNO_MESSAGES[errno]; - - // Try to get a maximally helpful stack trace. On Node.js, getting Error.stack - // now ensures it shows what we want. - if (this.stack) { - // Define the stack property for Node.js 4, which otherwise errors on the next line. - Object.defineProperty(this, "stack", { value: new Error().stack, writable: true }); - this.stack = demangleAll(this.stack); - } - }; - FS.ErrnoError.prototype = new Error(); - FS.ErrnoError.prototype.constructor = FS.ErrnoError; - // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) - [44].forEach(function (code) { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ''; - }); - }, staticInit: function staticInit() { - FS.ensureErrnoError(); - - FS.nameTable = new Array(4096); - - FS.mount(MEMFS, {}, '/'); - - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - - FS.filesystems = { - 'MEMFS': MEMFS - }; - }, init: function init(input, output, error) { - assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); - FS.init.initialized = true; - - FS.ensureErrnoError(); - - // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here - Module['stdin'] = input || Module['stdin']; - Module['stdout'] = output || Module['stdout']; - Module['stderr'] = error || Module['stderr']; - - FS.createStandardStreams(); - }, quit: function quit() { - FS.init.initialized = false; - // Call musl-internal function to close all stdio streams, so nothing is - // left in internal buffers. - ___stdio_exit(); - // close all of our streams - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - FS.close(stream); - } - }, getMode: function getMode(canRead, canWrite) { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; - }, findObject: function findObject(path, dontResolveLastLink) { - var ret = FS.analyzePath(path, dontResolveLastLink); - if (ret.exists) { - return ret.object; - } else { - return null; - } - }, analyzePath: function analyzePath(path, dontResolveLastLink) { - // operate from within the context of the symlink's target - try { - var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - path = lookup.path; - } catch (e) {} - var ret = { - isRoot: false, exists: false, error: 0, name: null, path: null, object: null, - parentExists: false, parentPath: null, parentObject: null - }; - try { - var lookup = FS.lookupPath(path, { parent: true }); - ret.parentExists = true; - ret.parentPath = lookup.path; - ret.parentObject = lookup.node; - ret.name = PATH.basename(path); - lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - ret.exists = true; - ret.path = lookup.path; - ret.object = lookup.node; - ret.name = lookup.node.name; - ret.isRoot = lookup.path === '/'; - } catch (e) { - ret.error = e.errno; - }; - return ret; - }, createPath: function createPath(parent, path, canRead, canWrite) { - parent = typeof parent == 'string' ? parent : FS.getPath(parent); - var parts = path.split('/').reverse(); - while (parts.length) { - var part = parts.pop(); - if (!part) continue; - var current = PATH.join2(parent, part); - try { - FS.mkdir(current); - } catch (e) { - // ignore EEXIST - } - parent = current; - } - return current; - }, createFile: function createFile(parent, name, properties, canRead, canWrite) { - var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(canRead, canWrite); - return FS.create(path, mode); - }, createDataFile: function createDataFile(parent, name, data, canRead, canWrite, canOwn) { - var path = name; - if (parent) { - parent = typeof parent == 'string' ? parent : FS.getPath(parent); - path = name ? PATH.join2(parent, name) : parent; - } - var mode = FS.getMode(canRead, canWrite); - var node = FS.create(path, mode); - if (data) { - if (typeof data == 'string') { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); - data = arr; - } - // make sure we can write to the file - FS.chmod(node, mode | 146); - var stream = FS.open(node, 577); - FS.write(stream, data, 0, data.length, 0, canOwn); - FS.close(stream); - FS.chmod(node, mode); - } - return node; - }, createDevice: function createDevice(parent, name, input, output) { - var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(!!input, !!output); - if (!FS.createDevice.major) FS.createDevice.major = 64; - var dev = FS.makedev(FS.createDevice.major++, 0); - // Create a fake device that a set of stream ops to emulate - // the old behavior. - FS.registerDevice(dev, { - open: function open(stream) { - stream.seekable = false; + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512) && !created) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node, + path: FS.getPath(node), // we want the absolute path to the node + flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + return stream; }, - close: function close(stream) { - // flush any pending line data - if (output && output.buffer && output.buffer.length) { - output(10); + close(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); } + stream.fd = null; }, - read: function read(stream, buffer, offset, length, pos /* ignored */) { - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); + isClosed(stream) { + return stream.fd === null; + }, + llseek(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + }, + read(stream, buffer, offset, length, position) { + assert(offset >= 0); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + }, + write(stream, buffer, offset, length, position, canOwn) { + assert(offset >= 0); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + mmap(stream, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + if (!length) { + throw new FS.ErrnoError(28); + } + return stream.stream_ops.mmap(stream, length, position, prot, flags); + }, + msync(stream, buffer, offset, length, mmapFlags) { + assert(offset >= 0); + if (!stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + }, + ioctl(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + }, + readFile(path, opts = {}) { + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + }, + cwd:() => FS.currentPath, + chdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + }, + createDefaultDirectories() { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + }, + createDefaultDevices() { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length, + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + // use a buffer to avoid overhead of individual crypto calls per byte + var randomBuffer = new Uint8Array(1024), randomLeft = 0; + var randomByte = () => { + if (randomLeft === 0) { + randomLeft = randomFill(randomBuffer).byteLength; } - if (result === undefined && bytesRead === 0) { - throw new FS.ErrnoError(6); + return randomBuffer[--randomLeft]; + }; + FS.createDevice('/dev', 'random', randomByte); + FS.createDevice('/dev', 'urandom', randomByte); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + }, + createSpecialDirectories() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount() { + var node = FS.createNode(proc_self, 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup(parent, name) { + var fd = +name; + var stream = FS.getStreamChecked(fd); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: () => stream.path }, + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; } - if (result === null || result === undefined) break; - bytesRead++; - buffer[offset + i] = result; + }, {}, '/proc/self/fd'); + }, + createStandardStreams(input, output, error) { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (input) { + FS.createDevice('/dev', 'stdin', input); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); } - if (bytesRead) { - stream.node.timestamp = Date.now(); + if (output) { + FS.createDevice('/dev', 'stdout', null, output); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); } - return bytesRead; + if (error) { + FS.createDevice('/dev', 'stderr', null, error); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + assert(stdin.fd === 0, `invalid handle for stdin (${stdin.fd})`); + assert(stdout.fd === 1, `invalid handle for stdout (${stdout.fd})`); + assert(stderr.fd === 2, `invalid handle for stderr (${stderr.fd})`); }, - write: function write(stream, buffer, offset, length, pos) { - for (var i = 0; i < length; i++) { + staticInit() { + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + }, + init(input, output, error) { + assert(!FS.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.initialized = true; + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + input ??= Module['stdin']; + output ??= Module['stdout']; + error ??= Module['stderr']; + + FS.createStandardStreams(input, output, error); + }, + quit() { + FS.initialized = false; + // force-flush all streams, so we get musl std streams printed out + _fflush(0); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + }, + findObject(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (!ret.exists) { + return null; + } + return ret.object; + }, + analyzePath(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + }, + createPath(parent, path, canRead, canWrite) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); try { - output(buffer[offset + i]); + FS.mkdir(current); } catch (e) { - throw new FS.ErrnoError(29); + // ignore EEXIST } + parent = current; } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, forceLoadFile: function forceLoadFile(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - if (typeof XMLHttpRequest != 'undefined') { - 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."); - } else if (read_) { - // Command-line. - try { - // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as - // read() will try to parse UTF8. - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error('Cannot load without read() or XMLHttpRequest.'); - } - }, createLazyFile: function createLazyFile(parent, name, url, canRead, canWrite) { - // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. - /** @constructor */ - function LazyUint8Array() { - this.lengthKnown = false; - this.chunks = []; // Loaded chunks. Index is the chunk number - } - LazyUint8Array.prototype.get = /** @this{Object} */function LazyUint8Array_get(idx) { - if (idx > this.length - 1 || idx < 0) { - return undefined; - } - var chunkOffset = idx % this.chunkSize; - var chunkNum = idx / this.chunkSize | 0; - return this.getter(chunkNum)[chunkOffset]; - }; - LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { - this.getter = getter; - }; - LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { - // Find length - var xhr = new XMLHttpRequest(); - xhr.open('HEAD', url, false); - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - var datalength = Number(xhr.getResponseHeader("Content-length")); - var header; - var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; - var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; - - var chunkSize = 1024 * 1024; // Chunk size in bytes - - if (!hasByteServing) chunkSize = datalength; - - // Function to get a range from the remote URL. - var doXHR = function doXHR(from, to) { - if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!"); - - // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); - - // Some hints to the browser that we want binary data. - xhr.responseType = 'arraybuffer'; - if (xhr.overrideMimeType) { - xhr.overrideMimeType('text/plain; charset=x-user-defined'); + return current; + }, + createFile(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(canRead, canWrite); + return FS.create(path, mode); + }, + createDataFile(parent, name, data, canRead, canWrite, canOwn) { + var path = name; + if (parent) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; } - - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array( /** @type{Array} */xhr.response || []); - } else { - return intArrayFromString(xhr.responseText || '', true); + var mode = FS_getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); } - }; - var lazyArray = this; - lazyArray.setDataGetter(function (chunkNum) { - var start = chunkNum * chunkSize; - var end = (chunkNum + 1) * chunkSize - 1; // including this byte - end = Math.min(end, datalength - 1); // if datalength-1 is selected, this is the last block - if (typeof lazyArray.chunks[chunkNum] == 'undefined') { - lazyArray.chunks[chunkNum] = doXHR(start, end); - } - if (typeof lazyArray.chunks[chunkNum] == 'undefined') throw new Error('doXHR failed!'); - return lazyArray.chunks[chunkNum]; - }); - - if (usesGzip || !datalength) { - // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length - chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file - datalength = this.getter(0).length; - chunkSize = datalength; - out("LazyFiles on gzip forces download of the whole file when length is accessed"); - } - - this._length = datalength; - this._chunkSize = chunkSize; - this.lengthKnown = true; - }; - if (typeof XMLHttpRequest != 'undefined') { - if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; - var lazyArray = new LazyUint8Array(); - Object.defineProperties(lazyArray, { - length: { - get: /** @this{Object} */function get() { + }, + createDevice(parent, name, input, output) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(!!input, !!output); + FS.createDevice.major ??= 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open(stream) { + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + if (output?.buffer?.length) { + output(10); + } + }, + read(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + if (typeof XMLHttpRequest != 'undefined') { + 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."); + } else { // Command-line. + try { + obj.contents = readBinary(obj.url); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). + // Actual getting is abstracted away for eventual reuse. + class LazyUint8Array { + lengthKnown = false; + chunks = []; // Loaded chunks. Index is the chunk number + get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + } + setDataGetter(getter) { + this.getter = getter; + } + cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (from, to) => { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } + return intArrayFromString(xhr.responseText || '', true); + }; + var lazyArray = this; + lazyArray.setDataGetter((chunkNum) => { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof lazyArray.chunks[chunkNum] == 'undefined') { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray.chunks[chunkNum] == 'undefined') throw new Error('doXHR failed!'); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + } + get length() { if (!this.lengthKnown) { this.cacheLength(); } return this._length; } - }, - chunkSize: { - get: /** @this{Object} */function get() { + get chunkSize() { if (!this.lengthKnown) { this.cacheLength(); } return this._chunkSize; } } - }); - - var properties = { isDevice: false, contents: lazyArray }; - } else { - var properties = { isDevice: false, url: url }; - } - - var node = FS.createFile(parent, name, properties, canRead, canWrite); - // This is a total hack, but I want to get this lazy file code out of the - // core of MEMFS. If we want to keep this lazy file concept I feel it should - // be its own thin LAZYFS proxying calls to MEMFS. - if (properties.contents) { - node.contents = properties.contents; - } else if (properties.url) { - node.contents = null; - node.url = properties.url; - } - // Add a function that defers querying the file size until it is asked the first time. - Object.defineProperties(node, { - usedBytes: { - get: /** @this {FSNode} */function get() { - return this.contents.length; + + if (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; } - } - }); - // override each stream op with one that tries to force load the lazy file first - var stream_ops = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(function (key) { - var fn = node.stream_ops[key]; - stream_ops[key] = function forceLoadLazyFile() { - FS.forceLoadFile(node); - return fn.apply(null, arguments); - }; - }); - // use a custom read function - stream_ops.read = function (stream, buffer, offset, length, position) { - FS.forceLoadFile(node); - var contents = stream.node.contents; - if (position >= contents.length) return 0; - var size = Math.min(contents.length - position, length); - assert(size >= 0); - if (contents.slice) { - // normal array - for (var i = 0; i < size; i++) { - buffer[offset + i] = contents[position + i]; + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; } - } else { - for (var i = 0; i < size; i++) { - // LazyUint8Array from sync binary XHR - buffer[offset + i] = contents.get(position + i); + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + stream_ops[key] = (...args) => { + FS.forceLoadFile(node); + return fn(...args); + }; + }); + function writeChunks(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; } - } - return size; - }; - node.stream_ops = stream_ops; - return node; - }, createPreloadedFile: function createPreloadedFile(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { - // TODO we should allow people to just pass in a complete filename instead - // of parent and name being that we just join them anyways - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname - function processData(byteArray) { - function finish(byteArray) { - if (preFinish) preFinish(); - if (!dontCreateFile) { - FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - if (onload) onload(); - removeRunDependency(dep); - } - if (Browser.handledByPreloadPlugin(byteArray, fullname, finish, function () { - if (onerror) onerror(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == 'string') { - asyncLoad(url, function (byteArray) { - return processData(byteArray); - }, onerror); - } else { - processData(url); - } - }, indexedDB: function indexedDB() { - return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; - }, DB_NAME: function DB_NAME() { - return 'EM_FS_' + window.location.pathname; - }, DB_VERSION: 20, DB_STORE_NAME: "FILE_DATA", saveFilesToDB: function saveFilesToDB(paths, onload, onerror) { - onload = onload || function () {}; - onerror = onerror || function () {}; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = function () { - out('creating db'); - var db = openRequest.result; - db.createObjectStore(FS.DB_STORE_NAME); - }; - openRequest.onsuccess = function () { - var db = openRequest.result; - var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, - fail = 0, - total = paths.length; - function finish() { - if (fail == 0) onload();else onerror(); - } - paths.forEach(function (path) { - var putRequest = files.put(FS.analyzePath(path).object.contents, path); - putRequest.onsuccess = function () { - ok++;if (ok + fail == total) finish(); + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + return writeChunks(stream, buffer, offset, length, position) }; - putRequest.onerror = function () { - fail++;if (ok + fail == total) finish(); - }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - }, loadFilesFromDB: function loadFilesFromDB(paths, onload, onerror) { - onload = onload || function () {}; - onerror = onerror || function () {}; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = onerror; // no database to load from - openRequest.onsuccess = function () { - var db = openRequest.result; - try { - var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); - } catch (e) { - onerror(e); - return; - } - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, - fail = 0, - total = paths.length; - function finish() { - if (fail == 0) onload();else onerror(); - } - paths.forEach(function (path) { - var getRequest = files.get(path); - getRequest.onsuccess = function () { - if (FS.analyzePath(path).exists) { - FS.unlink(path); + // use a custom mmap function + stream_ops.mmap = (stream, length, position, prot, flags) => { + FS.forceLoadFile(node); + var ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); } - FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); - ok++; - if (ok + fail == total) finish(); - }; - getRequest.onerror = function () { - fail++;if (ok + fail == total) finish(); + writeChunks(stream, HEAP8, ptr, length, position); + return { ptr, allocated: true }; }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - }, absolutePath: function absolutePath() { - abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); - }, createFolder: function createFolder() { - abort('FS.createFolder has been removed; use FS.mkdir instead'); - }, createLink: function createLink() { - abort('FS.createLink has been removed; use FS.symlink instead'); - }, joinPath: function joinPath() { - abort('FS.joinPath has been removed; use PATH.join instead'); - }, mmapAlloc: function mmapAlloc() { - abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); - }, standardizePath: function standardizePath() { - abort('FS.standardizePath has been removed; use PATH.normalize instead'); - } }; -var SYSCALLS = { DEFAULT_POLLMASK: 5, calculateAt: function calculateAt(dirfd, path, allowEmpty) { - if (path[0] === '/') { - return path; - } - // relative path - var dir; - if (dirfd === -100) { - dir = FS.cwd(); - } else { - var dirstream = FS.getStream(dirfd); - if (!dirstream) throw new FS.ErrnoError(8); - dir = dirstream.path; - } - if (path.length == 0) { - if (!allowEmpty) { - throw new FS.ErrnoError(44);; - } - return dir; - } - return PATH.join2(dir, path); - }, doStat: function doStat(func, path, buf) { - try { - var stat = func(path); - } catch (e) { - if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { - // an error occurred while trying to look up the path; we should just report ENOTDIR - return -54; - } - throw e; - } - HEAP32[buf >> 2] = stat.dev; - HEAP32[buf + 4 >> 2] = 0; - HEAP32[buf + 8 >> 2] = stat.ino; - HEAP32[buf + 12 >> 2] = stat.mode; - HEAP32[buf + 16 >> 2] = stat.nlink; - HEAP32[buf + 20 >> 2] = stat.uid; - HEAP32[buf + 24 >> 2] = stat.gid; - HEAP32[buf + 28 >> 2] = stat.rdev; - HEAP32[buf + 32 >> 2] = 0; - tempI64 = [stat.size >>> 0, (tempDouble = stat.size, +Math.abs(tempDouble) >= 1.0 ? tempDouble > 0.0 ? (Math.min(+Math.floor(tempDouble / 4294967296.0), 4294967295.0) | 0) >>> 0 : ~ ~ +Math.ceil((tempDouble - +(~ ~tempDouble >>> 0)) / 4294967296.0) >>> 0 : 0)], HEAP32[buf + 40 >> 2] = tempI64[0], HEAP32[buf + 44 >> 2] = tempI64[1]; - HEAP32[buf + 48 >> 2] = 4096; - HEAP32[buf + 52 >> 2] = stat.blocks; - HEAP32[buf + 56 >> 2] = stat.atime.getTime() / 1000 | 0; - HEAP32[buf + 60 >> 2] = 0; - HEAP32[buf + 64 >> 2] = stat.mtime.getTime() / 1000 | 0; - HEAP32[buf + 68 >> 2] = 0; - HEAP32[buf + 72 >> 2] = stat.ctime.getTime() / 1000 | 0; - HEAP32[buf + 76 >> 2] = 0; - tempI64 = [stat.ino >>> 0, (tempDouble = stat.ino, +Math.abs(tempDouble) >= 1.0 ? tempDouble > 0.0 ? (Math.min(+Math.floor(tempDouble / 4294967296.0), 4294967295.0) | 0) >>> 0 : ~ ~ +Math.ceil((tempDouble - +(~ ~tempDouble >>> 0)) / 4294967296.0) >>> 0 : 0)], HEAP32[buf + 80 >> 2] = tempI64[0], HEAP32[buf + 84 >> 2] = tempI64[1]; - return 0; - }, doMsync: function doMsync(addr, stream, len, flags, offset) { - var buffer = HEAPU8.slice(addr, addr + len); - FS.msync(stream, buffer, offset, len, flags); - }, doMkdir: function doMkdir(path, mode) { - // remove a trailing slash, if one - /a/b/ has basename of '', but - // we want to create b in the context of this function - path = PATH.normalize(path); - if (path[path.length - 1] === '/') path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - }, doMknod: function doMknod(path, mode, dev) { - // we don't want this in the JS API as it uses mknod to create all nodes. - switch (mode & 61440) { - case 32768: - case 8192: - case 24576: - case 4096: - case 49152: - break; - default: - return -28; - } - FS.mknod(path, mode, dev); - return 0; - }, doReadlink: function doReadlink(path, buf, bufsize) { - if (bufsize <= 0) return -28; - var ret = FS.readlink(path); - - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) - // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. - HEAP8[buf + len] = endChar; - - return len; - }, doAccess: function doAccess(path, amode) { - if (amode & ~7) { - // need a valid mode - return -28; - } - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - if (!node) { - return -44; - } - var perms = ''; - if (amode & 4) perms += 'r'; - if (amode & 2) perms += 'w'; - if (amode & 1) perms += 'x'; - if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - }, doDup: function doDup(path, flags, suggestFD) { - var suggest = FS.getStream(suggestFD); - if (suggest) FS.close(suggest); - return FS.open(path, flags, 0, suggestFD, suggestFD).fd; - }, doReadv: function doReadv(stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[iov + i * 8 >> 2]; - var len = HEAP32[iov + (i * 8 + 4) >> 2]; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - if (curr < len) break; // nothing more to read - } - return ret; - }, doWritev: function doWritev(stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[iov + i * 8 >> 2]; - var len = HEAP32[iov + (i * 8 + 4) >> 2]; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) return -1; - ret += curr; - } - return ret; - }, varargs: undefined, get: function get() { - assert(SYSCALLS.varargs != undefined); - SYSCALLS.varargs += 4; - var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; - return ret; - }, getStr: function getStr(ptr) { - var ret = UTF8ToString(ptr); - return ret; - }, getStreamFromFD: function getStreamFromFD(fd) { - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(8); - return stream; - }, get64: function get64(low, high) { - if (low >= 0) assert(high === 0);else assert(high === -1); - return low; - } }; -function ___syscall_fcntl64(fd, cmd, varargs) { + node.stream_ops = stream_ops; + return node; + }, + absolutePath() { + abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); + }, + createFolder() { + abort('FS.createFolder has been removed; use FS.mkdir instead'); + }, + createLink() { + abort('FS.createLink has been removed; use FS.symlink instead'); + }, + joinPath() { + abort('FS.joinPath has been removed; use PATH.join instead'); + }, + mmapAlloc() { + abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); + }, + standardizePath() { + abort('FS.standardizePath has been removed; use PATH.normalize instead'); + }, + }; + + var SYSCALLS = { + DEFAULT_POLLMASK:5, + calculateAt(dirfd, path, allowEmpty) { + if (PATH.isAbs(path)) { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = SYSCALLS.getStreamFromFD(dirfd); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[((buf)>>2)] = stat.dev;checkInt32(stat.dev); + HEAP32[(((buf)+(4))>>2)] = stat.mode;checkInt32(stat.mode); + HEAPU32[(((buf)+(8))>>2)] = stat.nlink;checkInt32(stat.nlink); + HEAP32[(((buf)+(12))>>2)] = stat.uid;checkInt32(stat.uid); + HEAP32[(((buf)+(16))>>2)] = stat.gid;checkInt32(stat.gid); + HEAP32[(((buf)+(20))>>2)] = stat.rdev;checkInt32(stat.rdev); + (tempI64 = [stat.size>>>0,(tempDouble = stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(24))>>2)] = tempI64[0],HEAP32[(((buf)+(28))>>2)] = tempI64[1]);checkInt64(stat.size); + HEAP32[(((buf)+(32))>>2)] = 4096;checkInt32(4096); + HEAP32[(((buf)+(36))>>2)] = stat.blocks;checkInt32(stat.blocks); + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [Math.floor(atime / 1000)>>>0,(tempDouble = Math.floor(atime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]);checkInt64(Math.floor(atime / 1000)); + HEAPU32[(((buf)+(48))>>2)] = (atime % 1000) * 1000 * 1000;checkInt32((atime % 1000) * 1000 * 1000); + (tempI64 = [Math.floor(mtime / 1000)>>>0,(tempDouble = Math.floor(mtime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(56))>>2)] = tempI64[0],HEAP32[(((buf)+(60))>>2)] = tempI64[1]);checkInt64(Math.floor(mtime / 1000)); + HEAPU32[(((buf)+(64))>>2)] = (mtime % 1000) * 1000 * 1000;checkInt32((mtime % 1000) * 1000 * 1000); + (tempI64 = [Math.floor(ctime / 1000)>>>0,(tempDouble = Math.floor(ctime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(72))>>2)] = tempI64[0],HEAP32[(((buf)+(76))>>2)] = tempI64[1]);checkInt64(Math.floor(ctime / 1000)); + HEAPU32[(((buf)+(80))>>2)] = (ctime % 1000) * 1000 * 1000;checkInt32((ctime % 1000) * 1000 * 1000); + (tempI64 = [stat.ino>>>0,(tempDouble = stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(88))>>2)] = tempI64[0],HEAP32[(((buf)+(92))>>2)] = tempI64[1]);checkInt64(stat.ino); + return 0; + }, + doMsync(addr, stream, len, flags, offset) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (flags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + }, + getStreamFromFD(fd) { + var stream = FS.getStreamChecked(fd); + return stream; + }, + varargs:undefined, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + }; + function ___syscall_fcntl64(fd, cmd, varargs) { SYSCALLS.varargs = varargs; try { - - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: - { - var arg = SYSCALLS.get(); + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); if (arg < 0) { return -28; } + while (FS.streams[arg]) { + arg++; + } var newStream; - newStream = FS.open(stream.path, stream.flags, 0, arg); + newStream = FS.dupStream(stream, arg); return newStream.fd; } - case 1: - case 2: - return 0; // FD_CLOEXEC makes no sense for a single process. - case 3: - return stream.flags; - case 4: - { - var arg = SYSCALLS.get(); + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = syscallGetVarargI(); stream.flags |= arg; return 0; } - case 5: - /* case 5: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */{ - - var arg = SYSCALLS.get(); + case 12: { + var arg = syscallGetVarargP(); var offset = 0; // We're always unlocked. - HEAP16[arg + offset >> 1] = 2; + HEAP16[(((arg)+(offset))>>1)] = 2;checkInt16(2); return 0; } - case 6: - case 7: - /* case 6: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ - /* case 7: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ - - return 0; // Pretend that the locking is successful. - case 16: - case 8: - return -28; // These are for sockets. We don't have them fully implemented yet. - case 9: - // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. - setErrNo(28); - return -1; - default: - { - return -28; - } - } - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + case 13: + case 14: + return 0; // Pretend that the locking is successful. + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; return -e.errno; } -} + } -function ___syscall_ioctl(fd, op, varargs) { + + function ___syscall_ioctl(fd, op, varargs) { SYSCALLS.varargs = varargs; try { - - var stream = SYSCALLS.getStreamFromFD(fd); - switch (op) { - case 21509: - case 21505: - { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: { + if (!stream.tty) return -59; + return 0; + } + case 21505: { if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcgets) { + var termios = stream.tty.ops.ioctl_tcgets(stream); + var argp = syscallGetVarargP(); + HEAP32[((argp)>>2)] = termios.c_iflag || 0;checkInt32(termios.c_iflag || 0); + HEAP32[(((argp)+(4))>>2)] = termios.c_oflag || 0;checkInt32(termios.c_oflag || 0); + HEAP32[(((argp)+(8))>>2)] = termios.c_cflag || 0;checkInt32(termios.c_cflag || 0); + HEAP32[(((argp)+(12))>>2)] = termios.c_lflag || 0;checkInt32(termios.c_lflag || 0); + for (var i = 0; i < 32; i++) { + HEAP8[(argp + i)+(17)] = termios.c_cc[i] || 0;checkInt8(termios.c_cc[i] || 0); + } + return 0; + } return 0; } - case 21510: - case 21511: - case 21512: - case 21506: - case 21507: - case 21508: - { + case 21510: + case 21511: + case 21512: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21506: + case 21507: + case 21508: { if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcsets) { + var argp = syscallGetVarargP(); + var c_iflag = HEAP32[((argp)>>2)]; + var c_oflag = HEAP32[(((argp)+(4))>>2)]; + var c_cflag = HEAP32[(((argp)+(8))>>2)]; + var c_lflag = HEAP32[(((argp)+(12))>>2)]; + var c_cc = [] + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[(argp + i)+(17)]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { c_iflag, c_oflag, c_cflag, c_lflag, c_cc }); + } return 0; // no-op, not actually adjusting terminal settings } - case 21519: - { + case 21519: { if (!stream.tty) return -59; - var argp = SYSCALLS.get(); - HEAP32[argp >> 2] = 0; + var argp = syscallGetVarargP(); + HEAP32[((argp)>>2)] = 0;checkInt32(0); return 0; } - case 21520: - { + case 21520: { if (!stream.tty) return -59; return -28; // not supported } - case 21531: - { - var argp = SYSCALLS.get(); + case 21531: { + var argp = syscallGetVarargP(); return FS.ioctl(stream, op, argp); } - case 21523: - { + case 21523: { // TODO: in theory we should write to the winsize struct that gets // passed in, but for now musl doesn't read anything on it if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tiocgwinsz) { + var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty); + var argp = syscallGetVarargP(); + HEAP16[((argp)>>1)] = winsize[0];checkInt16(winsize[0]); + HEAP16[(((argp)+(2))>>1)] = winsize[1];checkInt16(winsize[1]); + } return 0; } - case 21524: - { + case 21524: { // TODO: technically, this ioctl call should change the window size. // but, since emscripten doesn't have any concept of a terminal window // yet, we'll just silently throw it away as we do TIOCGWINSZ if (!stream.tty) return -59; return 0; } - default: - abort('bad ioctl syscall ' + op); - } - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + case 21515: { + if (!stream.tty) return -59; + return 0; + } + default: return -28; // not supported + } + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; return -e.errno; } -} + } -function ___syscall_open(path, flags, varargs) { + + function ___syscall_openat(dirfd, path, flags, varargs) { SYSCALLS.varargs = varargs; try { - - var pathname = SYSCALLS.getStr(path); - var mode = varargs ? SYSCALLS.get() : 0; - var stream = FS.open(pathname, flags, mode); - return stream.fd; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; + + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + var mode = varargs ? syscallGetVarargI() : 0; + return FS.open(path, flags, mode).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; return -e.errno; } -<<<<<<< HEAD -======= } var __abort_js = () => { @@ -4689,1206 +4226,350 @@ function ___syscall_open(path, flags, varargs) { ; function checkIncomingModuleAPI() { ignoredModuleProp('fetchSettings'); ->>>>>>> 4f83806ea21c491863aba6239ff1f1376fb137bf -} - -function _abort() { - abort('native code called abort()'); -} - -function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); -} - -function _emscripten_get_heap_max() { - // 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. - return 2147483648; -} - -var _emscripten_get_now;if (ENVIRONMENT_IS_NODE) { - _emscripten_get_now = function () { - var t = process['hrtime'](); - return t[0] * 1e3 + t[1] / 1e6; - }; -} else _emscripten_get_now = function () { - return performance.now(); -}; -; - -function emscripten_realloc_buffer(size) { - try { - // round size grow request up to wasm page size (fixed 64KB per spec) - wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16); // .grow() takes a delta compared to the previous size - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1 /*success*/; - } catch (e) { - err('emscripten_realloc_buffer: Attempted to grow heap from ' + buffer.byteLength + ' bytes to ' + size + ' bytes, but got error: ' + e); - } - // implicit 0 return to save code size (caller will cast "undefined" into 0 - // anyhow) -} -function _emscripten_resize_heap(requestedSize) { - var oldSize = HEAPU8.length; - requestedSize = requestedSize >>> 0; - // With pthreads, 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 = _emscripten_get_heap_max(); - if (requestedSize > maxHeapSize) { - err('Cannot enlarge memory, asked to go up to ' + 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, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - - var t0 = _emscripten_get_now(); - var replacement = emscripten_realloc_buffer(newSize); - var t1 = _emscripten_get_now(); - out('Heap resize call from ' + oldSize + ' to ' + newSize + ' took ' + (t1 - t0) + ' msecs. Success: ' + !!replacement); - if (replacement) { - - return true; - } - } - err('Failed to grow the heap from ' + oldSize + ' bytes to ' + newSize + ' bytes, not enough memory!'); - return false; -} - -var ENV = {}; - -function getExecutableName() { - return thisProgram || './this.program'; -} -function getEnvStrings() { - if (!getEnvStrings.strings) { - // Default values. - // Browser language detection #8751 - var lang = (typeof navigator == 'object' && navigator.languages && navigator.languages[0] || 'C').replace('-', '_') + '.UTF-8'; - var env = { - 'USER': 'web_user', - 'LOGNAME': 'web_user', - 'PATH': '/', - 'PWD': '/', - 'HOME': '/home/web_user', - 'LANG': lang, - '_': getExecutableName() - }; - // Apply the user-provided values, if any. - for (var x in ENV) { - // x is a key in ENV; if ENV[x] is undefined, that means it was - // explicitly set to be so. We allow user code to do that to - // force variables with default values to remain unset. - if (ENV[x] === undefined) delete env[x];else env[x] = ENV[x]; - } - var strings = []; - for (var x in env) { - strings.push(x + '=' + env[x]); - } - getEnvStrings.strings = strings; - } - return getEnvStrings.strings; -} -function _environ_get(__environ, environ_buf) { - var bufSize = 0; - getEnvStrings().forEach(function (string, i) { - var ptr = environ_buf + bufSize; - HEAP32[__environ + i * 4 >> 2] = ptr; - writeAsciiToMemory(string, ptr); - bufSize += string.length + 1; - }); - return 0; -} - -function _environ_sizes_get(penviron_count, penviron_buf_size) { - var strings = getEnvStrings(); - HEAP32[penviron_count >> 2] = strings.length; - var bufSize = 0; - strings.forEach(function (string) { - bufSize += string.length + 1; - }); - HEAP32[penviron_buf_size >> 2] = bufSize; - return 0; -} - -function _exit(status) { - // void _exit(int status); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html - exit(status); -} - -function _fd_close(fd) { - try { - - var stream = SYSCALLS.getStreamFromFD(fd); - FS.close(stream); - return 0; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } -} - -function _fd_read(fd, iov, iovcnt, pnum) { - try { - - var stream = SYSCALLS.getStreamFromFD(fd); - var num = SYSCALLS.doReadv(stream, iov, iovcnt); - HEAP32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } -} - -function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - try { - - var stream = SYSCALLS.getStreamFromFD(fd); - var HIGH_OFFSET = 0x100000000; // 2^32 - // use an unsigned operator on low and shift high by 32-bits - var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); - - var DOUBLE_LIMIT = 0x20000000000000; // 2^53 - // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT - if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { - return -61; - } - - FS.llseek(stream, offset, whence); - tempI64 = [stream.position >>> 0, (tempDouble = stream.position, +Math.abs(tempDouble) >= 1.0 ? tempDouble > 0.0 ? (Math.min(+Math.floor(tempDouble / 4294967296.0), 4294967295.0) | 0) >>> 0 : ~ ~ +Math.ceil((tempDouble - +(~ ~tempDouble >>> 0)) / 4294967296.0) >>> 0 : 0)], HEAP32[newOffset >> 2] = tempI64[0], HEAP32[newOffset + 4 >> 2] = tempI64[1]; - if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state - return 0; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } -} - -function _fd_write(fd, iov, iovcnt, pnum) { - try { - - ; - var stream = SYSCALLS.getStreamFromFD(fd); - var num = SYSCALLS.doWritev(stream, iov, iovcnt); - HEAP32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } -} - -function _setTempRet0(val) { - setTempRet0(val); -} - -var FSNode = /** @constructor */function FSNode(parent, name, mode, rdev) { - if (!parent) { - parent = this; // root node sets parent to itself - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; -}; -var readMode = 292 /*292*/ | 73 /*73*/; -var writeMode = 146 /*146*/; -Object.defineProperties(FSNode.prototype, { - read: { - get: /** @this{FSNode} */function get() { - return (this.mode & readMode) === readMode; - }, - set: /** @this{FSNode} */function set(val) { - val ? this.mode |= readMode : this.mode &= ~readMode; - } - }, - write: { - get: /** @this{FSNode} */function get() { - return (this.mode & writeMode) === writeMode; - }, - set: /** @this{FSNode} */function set(val) { - val ? this.mode |= writeMode : this.mode &= ~writeMode; - } - }, - isFolder: { - get: /** @this{FSNode} */function get() { - return FS.isDir(this.mode); - } - }, - isDevice: { - get: /** @this{FSNode} */function get() { - return FS.isChrdev(this.mode); - } - } -}); -FS.FSNode = FSNode; -FS.staticInit();; -ERRNO_CODES = { - 'EPERM': 63, - 'ENOENT': 44, - 'ESRCH': 71, - 'EINTR': 27, - 'EIO': 29, - 'ENXIO': 60, - 'E2BIG': 1, - 'ENOEXEC': 45, - 'EBADF': 8, - 'ECHILD': 12, - 'EAGAIN': 6, - 'EWOULDBLOCK': 6, - 'ENOMEM': 48, - 'EACCES': 2, - 'EFAULT': 21, - 'ENOTBLK': 105, - 'EBUSY': 10, - 'EEXIST': 20, - 'EXDEV': 75, - 'ENODEV': 43, - 'ENOTDIR': 54, - 'EISDIR': 31, - 'EINVAL': 28, - 'ENFILE': 41, - 'EMFILE': 33, - 'ENOTTY': 59, - 'ETXTBSY': 74, - 'EFBIG': 22, - 'ENOSPC': 51, - 'ESPIPE': 70, - 'EROFS': 69, - 'EMLINK': 34, - 'EPIPE': 64, - 'EDOM': 18, - 'ERANGE': 68, - 'ENOMSG': 49, - 'EIDRM': 24, - 'ECHRNG': 106, - 'EL2NSYNC': 156, - 'EL3HLT': 107, - 'EL3RST': 108, - 'ELNRNG': 109, - 'EUNATCH': 110, - 'ENOCSI': 111, - 'EL2HLT': 112, - 'EDEADLK': 16, - 'ENOLCK': 46, - 'EBADE': 113, - 'EBADR': 114, - 'EXFULL': 115, - 'ENOANO': 104, - 'EBADRQC': 103, - 'EBADSLT': 102, - 'EDEADLOCK': 16, - 'EBFONT': 101, - 'ENOSTR': 100, - 'ENODATA': 116, - 'ETIME': 117, - 'ENOSR': 118, - 'ENONET': 119, - 'ENOPKG': 120, - 'EREMOTE': 121, - 'ENOLINK': 47, - 'EADV': 122, - 'ESRMNT': 123, - 'ECOMM': 124, - 'EPROTO': 65, - 'EMULTIHOP': 36, - 'EDOTDOT': 125, - 'EBADMSG': 9, - 'ENOTUNIQ': 126, - 'EBADFD': 127, - 'EREMCHG': 128, - 'ELIBACC': 129, - 'ELIBBAD': 130, - 'ELIBSCN': 131, - 'ELIBMAX': 132, - 'ELIBEXEC': 133, - 'ENOSYS': 52, - 'ENOTEMPTY': 55, - 'ENAMETOOLONG': 37, - 'ELOOP': 32, - 'EOPNOTSUPP': 138, - 'EPFNOSUPPORT': 139, - 'ECONNRESET': 15, - 'ENOBUFS': 42, - 'EAFNOSUPPORT': 5, - 'EPROTOTYPE': 67, - 'ENOTSOCK': 57, - 'ENOPROTOOPT': 50, - 'ESHUTDOWN': 140, - 'ECONNREFUSED': 14, - 'EADDRINUSE': 3, - 'ECONNABORTED': 13, - 'ENETUNREACH': 40, - 'ENETDOWN': 38, - 'ETIMEDOUT': 73, - 'EHOSTDOWN': 142, - 'EHOSTUNREACH': 23, - 'EINPROGRESS': 26, - 'EALREADY': 7, - 'EDESTADDRREQ': 17, - 'EMSGSIZE': 35, - 'EPROTONOSUPPORT': 66, - 'ESOCKTNOSUPPORT': 137, - 'EADDRNOTAVAIL': 4, - 'ENETRESET': 39, - 'EISCONN': 30, - 'ENOTCONN': 53, - 'ETOOMANYREFS': 141, - 'EUSERS': 136, - 'EDQUOT': 19, - 'ESTALE': 72, - 'ENOTSUP': 138, - 'ENOMEDIUM': 148, - 'EILSEQ': 25, - 'EOVERFLOW': 61, - 'ECANCELED': 11, - 'ENOTRECOVERABLE': 56, - 'EOWNERDEAD': 62, - 'ESTRPIPE': 135 -};; -var ASSERTIONS = true; - -/** @type {function(string, boolean=, number=)} */ -function intArrayFromString(stringy, dontAddNull, length) { - var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1; - var u8array = new Array(len); - var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); - if (dontAddNull) u8array.length = numBytesWritten; - return u8array; -} - -function intArrayToString(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - var chr = array[i]; - if (chr > 0xFF) { - if (ASSERTIONS) { - assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); - } - chr &= 0xFF; - } - ret.push(String.fromCharCode(chr)); - } - return ret.join(''); -} - -var asmLibraryArg = { - "__handle_stack_overflow": ___handle_stack_overflow, - "__syscall_fcntl64": ___syscall_fcntl64, - "__syscall_ioctl": ___syscall_ioctl, - "__syscall_open": ___syscall_open, - "abort": _abort, - "emscripten_memcpy_big": _emscripten_memcpy_big, - "emscripten_resize_heap": _emscripten_resize_heap, - "environ_get": _environ_get, - "environ_sizes_get": _environ_sizes_get, - "exit": _exit, - "fd_close": _fd_close, - "fd_read": _fd_read, - "fd_seek": _fd_seek, - "fd_write": _fd_write, - "setTempRet0": _setTempRet0 -}; -var asm = createWasm(); -/** @type {function(...*):?} */ -var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors"); - -/** @type {function(...*):?} */ -var _malloc = Module["_malloc"] = createExportWrapper("malloc"); - -/** @type {function(...*):?} */ -var _main = Module["_main"] = createExportWrapper("main"); - -/** @type {function(...*):?} */ -var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); - -/** @type {function(...*):?} */ -var ___stdio_exit = Module["___stdio_exit"] = createExportWrapper("__stdio_exit"); - -/** @type {function(...*):?} */ -var _htonl = Module["_htonl"] = createExportWrapper("htonl"); - -/** @type {function(...*):?} */ -var _htons = Module["_htons"] = createExportWrapper("htons"); - -/** @type {function(...*):?} */ -var _ntohs = Module["_ntohs"] = createExportWrapper("ntohs"); - -/** @type {function(...*):?} */ -var _emscripten_stack_init = Module["_emscripten_stack_init"] = function () { - return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function () { - return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = function () { - return (_emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = Module["asm"]["emscripten_stack_get_base"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function () { - return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var stackSave = Module["stackSave"] = createExportWrapper("stackSave"); - -/** @type {function(...*):?} */ -var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); - -/** @type {function(...*):?} */ -var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); - -/** @type {function(...*):?} */ -var ___set_stack_limits = Module["___set_stack_limits"] = createExportWrapper("__set_stack_limits"); - -/** @type {function(...*):?} */ -var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji"); - +} +var wasmImports = { + /** @export */ + __handle_stack_overflow: ___handle_stack_overflow, + /** @export */ + __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ + __syscall_ioctl: ___syscall_ioctl, + /** @export */ + __syscall_openat: ___syscall_openat, + /** @export */ + _abort_js: __abort_js, + /** @export */ + _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + environ_get: _environ_get, + /** @export */ + environ_sizes_get: _environ_sizes_get, + /** @export */ + exit: _exit, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_read: _fd_read, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write +}; +var wasmExports = createWasm(); +var ___wasm_call_ctors = createExportWrapper('__wasm_call_ctors', 0); +var _malloc = createExportWrapper('malloc', 1); +var _main = Module['_main'] = createExportWrapper('__main_argc_argv', 2); +var _fflush = createExportWrapper('fflush', 1); +var _htonl = createExportWrapper('htonl', 1); +var _htons = createExportWrapper('htons', 1); +var _ntohs = createExportWrapper('ntohs', 1); +var _strerror = createExportWrapper('strerror', 1); +var _emscripten_stack_init = () => (_emscripten_stack_init = wasmExports['emscripten_stack_init'])(); +var _emscripten_stack_get_free = () => (_emscripten_stack_get_free = wasmExports['emscripten_stack_get_free'])(); +var _emscripten_stack_get_base = () => (_emscripten_stack_get_base = wasmExports['emscripten_stack_get_base'])(); +var _emscripten_stack_get_end = () => (_emscripten_stack_get_end = wasmExports['emscripten_stack_get_end'])(); +var __emscripten_stack_restore = (a0) => (__emscripten_stack_restore = wasmExports['_emscripten_stack_restore'])(a0); +var __emscripten_stack_alloc = (a0) => (__emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'])(a0); +var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports['emscripten_stack_get_current'])(); +var ___set_stack_limits = Module['___set_stack_limits'] = createExportWrapper('__set_stack_limits', 2); +var dynCall_jiji = Module['dynCall_jiji'] = createExportWrapper('dynCall_jiji', 5); + + +// include: postamble.js // === Auto-generated postamble setup entry stuff === -if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = function () { - return abort("'intArrayFromString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = function () { - return abort("'intArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "ccall")) Module["ccall"] = function () { - return abort("'ccall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "cwrap")) Module["cwrap"] = function () { - return abort("'cwrap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = function () { - return abort("'setValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = function () { - return abort("'getValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = function () { - return abort("'allocate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = function () { - return abort("'UTF8ArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = function () { - return abort("'UTF8ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = function () { - return abort("'stringToUTF8Array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = function () { - return abort("'stringToUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = function () { - return abort("'lengthBytesUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function () { - return abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = function () { - return abort("'addOnPreRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = function () { - return abort("'addOnInit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = function () { - return abort("'addOnPreMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = function () { - return abort("'addOnExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = function () { - return abort("'addOnPostRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = function () { - return abort("'writeStringToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = function () { - return abort("'writeArrayToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = function () { - return abort("'writeAsciiToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = function () { - return abort("'addRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = function () { - return abort("'removeRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = function () { - return abort("'FS_createFolder' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = function () { - return abort("'FS_createPath' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = function () { - return abort("'FS_createDataFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = function () { - return abort("'FS_createPreloadedFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = function () { - return abort("'FS_createLazyFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = function () { - return abort("'FS_createLink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = function () { - return abort("'FS_createDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = function () { - return abort("'FS_unlink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = function () { - return abort("'getLEB' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = function () { - return abort("'getFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = function () { - return abort("'alignFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = function () { - return abort("'registerFunctions' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = function () { - return abort("'addFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = function () { - return abort("'removeFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function () { - return abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = function () { - return abort("'prettyPrint' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function () { - return abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = function () { - return abort("'getCompilerSetting' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = function () { - return abort("'print' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = function () { - return abort("'printErr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = function () { - return abort("'getTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = function () { - return abort("'setTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -Module["callMain"] = callMain; -if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = function () { - return abort("'abort' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "keepRuntimeAlive")) Module["keepRuntimeAlive"] = function () { - return abort("'keepRuntimeAlive' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "zeroMemory")) Module["zeroMemory"] = function () { - return abort("'zeroMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = function () { - return abort("'stringToNewUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = function () { - return abort("'emscripten_realloc_buffer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = function () { - return abort("'ENV' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "withStackSave")) Module["withStackSave"] = function () { - return abort("'withStackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = function () { - return abort("'ERRNO_CODES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = function () { - return abort("'ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = function () { - return abort("'setErrNo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "inetPton4")) Module["inetPton4"] = function () { - return abort("'inetPton4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "inetNtop4")) Module["inetNtop4"] = function () { - return abort("'inetNtop4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "inetPton6")) Module["inetPton6"] = function () { - return abort("'inetPton6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "inetNtop6")) Module["inetNtop6"] = function () { - return abort("'inetNtop6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "readSockaddr")) Module["readSockaddr"] = function () { - return abort("'readSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeSockaddr")) Module["writeSockaddr"] = function () { - return abort("'writeSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = function () { - return abort("'DNS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getHostByName")) Module["getHostByName"] = function () { - return abort("'getHostByName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = function () { - return abort("'Protocols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = function () { - return abort("'Sockets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getRandomDevice")) Module["getRandomDevice"] = function () { - return abort("'getRandomDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "traverseStack")) Module["traverseStack"] = function () { - return abort("'traverseStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "convertFrameToPC")) Module["convertFrameToPC"] = function () { - return abort("'convertFrameToPC' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = function () { - return abort("'UNWIND_CACHE' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "saveInUnwindCache")) Module["saveInUnwindCache"] = function () { - return abort("'saveInUnwindCache' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "convertPCtoSourceLocation")) Module["convertPCtoSourceLocation"] = function () { - return abort("'convertPCtoSourceLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgsArray")) Module["readAsmConstArgsArray"] = function () { - return abort("'readAsmConstArgsArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = function () { - return abort("'readAsmConstArgs' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "mainThreadEM_ASM")) Module["mainThreadEM_ASM"] = function () { - return abort("'mainThreadEM_ASM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = function () { - return abort("'jstoi_q' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = function () { - return abort("'jstoi_s' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getExecutableName")) Module["getExecutableName"] = function () { - return abort("'getExecutableName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "listenOnce")) Module["listenOnce"] = function () { - return abort("'listenOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "autoResumeAudioContext")) Module["autoResumeAudioContext"] = function () { - return abort("'autoResumeAudioContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "dynCallLegacy")) Module["dynCallLegacy"] = function () { - return abort("'dynCallLegacy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getDynCaller")) Module["getDynCaller"] = function () { - return abort("'getDynCaller' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function () { - return abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "callRuntimeCallbacks")) Module["callRuntimeCallbacks"] = function () { - return abort("'callRuntimeCallbacks' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "wasmTableMirror")) Module["wasmTableMirror"] = function () { - return abort("'wasmTableMirror' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "setWasmTableEntry")) Module["setWasmTableEntry"] = function () { - return abort("'setWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getWasmTableEntry")) Module["getWasmTableEntry"] = function () { - return abort("'getWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "handleException")) Module["handleException"] = function () { - return abort("'handleException' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePush")) Module["runtimeKeepalivePush"] = function () { - return abort("'runtimeKeepalivePush' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePop")) Module["runtimeKeepalivePop"] = function () { - return abort("'runtimeKeepalivePop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "callUserCallback")) Module["callUserCallback"] = function () { - return abort("'callUserCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "maybeExit")) Module["maybeExit"] = function () { - return abort("'maybeExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "safeSetTimeout")) Module["safeSetTimeout"] = function () { - return abort("'safeSetTimeout' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "asmjsMangle")) Module["asmjsMangle"] = function () { - return abort("'asmjsMangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "asyncLoad")) Module["asyncLoad"] = function () { - return abort("'asyncLoad' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "alignMemory")) Module["alignMemory"] = function () { - return abort("'alignMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "mmapAlloc")) Module["mmapAlloc"] = function () { - return abort("'mmapAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = function () { - return abort("'reallyNegative' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "unSign")) Module["unSign"] = function () { - return abort("'unSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "reSign")) Module["reSign"] = function () { - return abort("'reSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = function () { - return abort("'formatString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = function () { - return abort("'PATH' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = function () { - return abort("'PATH_FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = function () { - return abort("'SYSCALLS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getSocketFromFD")) Module["getSocketFromFD"] = function () { - return abort("'getSocketFromFD' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getSocketAddress")) Module["getSocketAddress"] = function () { - return abort("'getSocketAddress' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = function () { - return abort("'JSEvents' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerKeyEventCallback")) Module["registerKeyEventCallback"] = function () { - return abort("'registerKeyEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = function () { - return abort("'specialHTMLTargets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "maybeCStringToJsString")) Module["maybeCStringToJsString"] = function () { - return abort("'maybeCStringToJsString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "findEventTarget")) Module["findEventTarget"] = function () { - return abort("'findEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "findCanvasEventTarget")) Module["findCanvasEventTarget"] = function () { - return abort("'findCanvasEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getBoundingClientRect")) Module["getBoundingClientRect"] = function () { - return abort("'getBoundingClientRect' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillMouseEventData")) Module["fillMouseEventData"] = function () { - return abort("'fillMouseEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerMouseEventCallback")) Module["registerMouseEventCallback"] = function () { - return abort("'registerMouseEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerWheelEventCallback")) Module["registerWheelEventCallback"] = function () { - return abort("'registerWheelEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerUiEventCallback")) Module["registerUiEventCallback"] = function () { - return abort("'registerUiEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerFocusEventCallback")) Module["registerFocusEventCallback"] = function () { - return abort("'registerFocusEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceOrientationEventData")) Module["fillDeviceOrientationEventData"] = function () { - return abort("'fillDeviceOrientationEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceOrientationEventCallback")) Module["registerDeviceOrientationEventCallback"] = function () { - return abort("'registerDeviceOrientationEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceMotionEventData")) Module["fillDeviceMotionEventData"] = function () { - return abort("'fillDeviceMotionEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceMotionEventCallback")) Module["registerDeviceMotionEventCallback"] = function () { - return abort("'registerDeviceMotionEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "screenOrientation")) Module["screenOrientation"] = function () { - return abort("'screenOrientation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillOrientationChangeEventData")) Module["fillOrientationChangeEventData"] = function () { - return abort("'fillOrientationChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerOrientationChangeEventCallback")) Module["registerOrientationChangeEventCallback"] = function () { - return abort("'registerOrientationChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillFullscreenChangeEventData")) Module["fillFullscreenChangeEventData"] = function () { - return abort("'fillFullscreenChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerFullscreenChangeEventCallback")) Module["registerFullscreenChangeEventCallback"] = function () { - return abort("'registerFullscreenChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerRestoreOldStyle")) Module["registerRestoreOldStyle"] = function () { - return abort("'registerRestoreOldStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "hideEverythingExceptGivenElement")) Module["hideEverythingExceptGivenElement"] = function () { - return abort("'hideEverythingExceptGivenElement' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "restoreHiddenElements")) Module["restoreHiddenElements"] = function () { - return abort("'restoreHiddenElements' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "setLetterbox")) Module["setLetterbox"] = function () { - return abort("'setLetterbox' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "currentFullscreenStrategy")) Module["currentFullscreenStrategy"] = function () { - return abort("'currentFullscreenStrategy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "restoreOldWindowedStyle")) Module["restoreOldWindowedStyle"] = function () { - return abort("'restoreOldWindowedStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "softFullscreenResizeWebGLRenderTarget")) Module["softFullscreenResizeWebGLRenderTarget"] = function () { - return abort("'softFullscreenResizeWebGLRenderTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "doRequestFullscreen")) Module["doRequestFullscreen"] = function () { - return abort("'doRequestFullscreen' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillPointerlockChangeEventData")) Module["fillPointerlockChangeEventData"] = function () { - return abort("'fillPointerlockChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockChangeEventCallback")) Module["registerPointerlockChangeEventCallback"] = function () { - return abort("'registerPointerlockChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockErrorEventCallback")) Module["registerPointerlockErrorEventCallback"] = function () { - return abort("'registerPointerlockErrorEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "requestPointerLock")) Module["requestPointerLock"] = function () { - return abort("'requestPointerLock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillVisibilityChangeEventData")) Module["fillVisibilityChangeEventData"] = function () { - return abort("'fillVisibilityChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerVisibilityChangeEventCallback")) Module["registerVisibilityChangeEventCallback"] = function () { - return abort("'registerVisibilityChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerTouchEventCallback")) Module["registerTouchEventCallback"] = function () { - return abort("'registerTouchEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillGamepadEventData")) Module["fillGamepadEventData"] = function () { - return abort("'fillGamepadEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerGamepadEventCallback")) Module["registerGamepadEventCallback"] = function () { - return abort("'registerGamepadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerBeforeUnloadEventCallback")) Module["registerBeforeUnloadEventCallback"] = function () { - return abort("'registerBeforeUnloadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "fillBatteryEventData")) Module["fillBatteryEventData"] = function () { - return abort("'fillBatteryEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "battery")) Module["battery"] = function () { - return abort("'battery' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "registerBatteryEventCallback")) Module["registerBatteryEventCallback"] = function () { - return abort("'registerBatteryEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "setCanvasElementSize")) Module["setCanvasElementSize"] = function () { - return abort("'setCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getCanvasElementSize")) Module["getCanvasElementSize"] = function () { - return abort("'getCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = function () { - return abort("'demangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = function () { - return abort("'demangleAll' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = function () { - return abort("'jsStackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function () { - return abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = function () { - return abort("'getEnvStrings' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "checkWasiClock")) Module["checkWasiClock"] = function () { - return abort("'checkWasiClock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = function () { - return abort("'writeI53ToI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = function () { - return abort("'writeI53ToI64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = function () { - return abort("'writeI53ToI64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = function () { - return abort("'writeI53ToU64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = function () { - return abort("'writeI53ToU64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = function () { - return abort("'readI53FromI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = function () { - return abort("'readI53FromU64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = function () { - return abort("'convertI32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = function () { - return abort("'convertU32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "setImmediateWrapped")) Module["setImmediateWrapped"] = function () { - return abort("'setImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "clearImmediateWrapped")) Module["clearImmediateWrapped"] = function () { - return abort("'clearImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "polyfillSetImmediate")) Module["polyfillSetImmediate"] = function () { - return abort("'polyfillSetImmediate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "uncaughtExceptionCount")) Module["uncaughtExceptionCount"] = function () { - return abort("'uncaughtExceptionCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "exceptionLast")) Module["exceptionLast"] = function () { - return abort("'exceptionLast' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "exceptionCaught")) Module["exceptionCaught"] = function () { - return abort("'exceptionCaught' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "ExceptionInfo")) Module["ExceptionInfo"] = function () { - return abort("'ExceptionInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "CatchInfo")) Module["CatchInfo"] = function () { - return abort("'CatchInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "exception_addRef")) Module["exception_addRef"] = function () { - return abort("'exception_addRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "exception_decRef")) Module["exception_decRef"] = function () { - return abort("'exception_decRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = function () { - return abort("'Browser' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "funcWrappers")) Module["funcWrappers"] = function () { - return abort("'funcWrappers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function () { - return abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "setMainLoop")) Module["setMainLoop"] = function () { - return abort("'setMainLoop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "wget")) Module["wget"] = function () { - return abort("'wget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = function () { - return abort("'FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = function () { - return abort("'MEMFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = function () { - return abort("'TTY' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = function () { - return abort("'PIPEFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = function () { - return abort("'SOCKFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "_setNetworkCallback")) Module["_setNetworkCallback"] = function () { - return abort("'_setNetworkCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "tempFixedLengthArray")) Module["tempFixedLengthArray"] = function () { - return abort("'tempFixedLengthArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "miniTempWebGLFloatBuffers")) Module["miniTempWebGLFloatBuffers"] = function () { - return abort("'miniTempWebGLFloatBuffers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "heapObjectForWebGLType")) Module["heapObjectForWebGLType"] = function () { - return abort("'heapObjectForWebGLType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "heapAccessShiftForWebGLHeap")) Module["heapAccessShiftForWebGLHeap"] = function () { - return abort("'heapAccessShiftForWebGLHeap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = function () { - return abort("'GL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = function () { - return abort("'emscriptenWebGLGet' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "computeUnpackAlignedImageSize")) Module["computeUnpackAlignedImageSize"] = function () { - return abort("'computeUnpackAlignedImageSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = function () { - return abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = function () { - return abort("'emscriptenWebGLGetUniform' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "webglGetUniformLocation")) Module["webglGetUniformLocation"] = function () { - return abort("'webglGetUniformLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "webglPrepareUniformLocationsBeforeFirstUse")) Module["webglPrepareUniformLocationsBeforeFirstUse"] = function () { - return abort("'webglPrepareUniformLocationsBeforeFirstUse' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "webglGetLeftBracePos")) Module["webglGetLeftBracePos"] = function () { - return abort("'webglGetLeftBracePos' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = function () { - return abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "writeGLArray")) Module["writeGLArray"] = function () { - return abort("'writeGLArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = function () { - return abort("'AL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = function () { - return abort("'SDL_unicode' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = function () { - return abort("'SDL_ttfContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = function () { - return abort("'SDL_audio' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = function () { - return abort("'SDL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = function () { - return abort("'SDL_gfx' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = function () { - return abort("'GLUT' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = function () { - return abort("'EGL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = function () { - return abort("'GLFW_Window' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = function () { - return abort("'GLFW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = function () { - return abort("'GLEW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = function () { - return abort("'IDBStore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = function () { - return abort("'runAndAbortIfError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = function () { - return abort("'warnOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = function () { - return abort("'stackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = function () { - return abort("'stackRestore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = function () { - return abort("'stackAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = function () { - return abort("'AsciiToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = function () { - return abort("'stringToAscii' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = function () { - return abort("'UTF16ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = function () { - return abort("'stringToUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = function () { - return abort("'lengthBytesUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = function () { - return abort("'UTF32ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = function () { - return abort("'stringToUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = function () { - return abort("'lengthBytesUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = function () { - return abort("'allocateUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = function () { - return abort("'allocateUTF8OnStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); -}; -Module["writeStackCookie"] = writeStackCookie; -Module["checkStackCookie"] = checkStackCookie; -if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function get() { - abort("'ALLOC_NORMAL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); - } }); -if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function get() { - abort("'ALLOC_STACK' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"); - } }); +Module['callMain'] = callMain; +var missingLibrarySymbols = [ + 'writeI53ToI64', + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'readI53FromI64', + 'readI53FromU64', + 'convertI32PairToI53', + 'convertU32PairToI53', + 'getTempRet0', + 'setTempRet0', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'emscriptenLog', + 'readEmAsmArgs', + 'jstoi_q', + 'listenOnce', + 'autoResumeAudioContext', + 'dynCallLegacy', + 'getDynCaller', + 'dynCall', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'callUserCallback', + 'maybeExit', + 'asmjsMangle', + 'HandleAllocator', + 'getNativeTypeSize', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'getCFunc', + 'ccall', + 'cwrap', + 'uleb128Encode', + 'sigToWasmTypes', + 'generateFuncType', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'reallyNegative', + 'unSign', + 'strLen', + 'reSign', + 'formatString', + 'intArrayToString', + 'AsciiToString', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'stringToNewUTF8', + 'writeArrayToMemory', + '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', + 'battery', + 'registerBatteryEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'jsStackTrace', + 'getCallstack', + 'convertPCtoSourceLocation', + 'checkWasiClock', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'createDyncallWrapper', + 'safeSetTimeout', + 'setImmediateWrapped', + 'clearImmediateWrapped', + 'polyfillSetImmediate', + 'registerPostMainLoop', + 'registerPreMainLoop', + 'getPromise', + 'makePromise', + 'idsToPromises', + 'makePromiseCallback', + 'ExceptionInfo', + 'findMatchingCatch', + 'Browser_asyncPrepareDataCounter', + 'safeRequestAnimationFrame', + 'isLeapYear', + 'ydayFromDate', + 'arraySum', + 'addDays', + 'getSocketFromFD', + 'getSocketAddress', + 'FS_unlink', + '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', + 'setErrNo', + 'demangle', + 'stackTrace', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + +var unexportedSymbols = [ + 'run', + 'addOnPreRun', + 'addOnInit', + 'addOnPreMain', + 'addOnExit', + 'addOnPostRun', + 'addRunDependency', + 'removeRunDependency', + 'out', + 'err', + 'abort', + 'wasmMemory', + 'wasmExports', + 'writeStackCookie', + 'checkStackCookie', + 'convertI32PairToI53Checked', + 'stackSave', + 'stackRestore', + 'stackAlloc', + 'ptrToString', + 'zeroMemory', + 'exitJS', + 'getHeapMax', + 'growMemory', + 'ENV', + 'setStackLimits', + 'ERRNO_CODES', + 'strError', + 'DNS', + 'Protocols', + 'Sockets', + 'timers', + 'warnOnce', + 'readEmAsmArgsArray', + 'jstoi_s', + 'getExecutableName', + 'handleException', + 'keepRuntimeAlive', + 'asyncLoad', + 'alignMemory', + 'mmapAlloc', + 'wasmTable', + 'noExitRuntime', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'getValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'intArrayFromString', + 'stringToAscii', + 'UTF16Decoder', + 'stringToUTF8OnStack', + 'JSEvents', + 'specialHTMLTargets', + 'findCanvasEventTarget', + 'currentFullscreenStrategy', + 'restoreOldWindowedStyle', + 'UNWIND_CACHE', + 'ExitStatus', + 'getEnvStrings', + 'doReadv', + 'doWritev', + 'initRandomFill', + 'randomFill', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionLast', + 'exceptionCaught', + 'Browser', + 'getPreloadedImageData__data', + 'wget', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'SYSCALLS', + 'preloadPlugins', + 'FS_createPreloadedFile', + 'FS_modeStringToFlags', + 'FS_getMode', + 'FS_stdin_getChar_buffer', + 'FS_stdin_getChar', + 'FS_createPath', + 'FS_createDevice', + 'FS_readFile', + 'FS', + 'FS_createDataFile', + 'FS_createLazyFile', + 'MEMFS', + 'TTY', + 'PIPEFS', + 'SOCKFS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'GL', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'SDL', + 'SDL_gfx', + 'allocateUTF8', + 'allocateUTF8OnStack', + 'print', + 'printErr', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); -var calledRun; -/** - * @constructor - * @this {ExitStatus} - */ -function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; -} -var calledMain = false; +var calledRun; dependenciesFulfilled = function runCaller() { // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) @@ -5896,35 +4577,33 @@ dependenciesFulfilled = function runCaller() { if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled }; -function callMain(args) { +function callMain(args = []) { assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); - var entryFunction = Module['_main']; + var entryFunction = _main; - args = args || []; + args.unshift(thisProgram); - var argc = args.length + 1; + var argc = args.length; var argv = stackAlloc((argc + 1) * 4); - HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram); - for (var i = 1; i < argc; i++) { - HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]); - } - HEAP32[(argv >> 2) + argc] = 0; + var argv_ptr = argv; + args.forEach((arg) => { + HEAPU32[((argv_ptr)>>2)] = stringToUTF8OnStack(arg); + argv_ptr += 4; + }); + HEAPU32[((argv_ptr)>>2)] = 0; try { var ret = entryFunction(argc, argv); - // In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as - // execution is asynchronously handed off to a pthread. // if we're not running an evented main loop, it's time to exit - exit(ret, /* implicit = */true); + exitJS(ret, /* implicit = */ true); return ret; - } catch (e) { + } + catch (e) { return handleException(e); - } finally { - calledMain = true; } } @@ -5932,14 +4611,12 @@ 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. - // TODO(sbc): Move writeStackCookie to native to to avoid this. _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. writeStackCookie(); } -/** @type {function(Array=)} */ -function run(args) { - args = args || arguments_; +function run(args = arguments_) { if (runDependencies > 0) { return; @@ -5967,7 +4644,7 @@ function run(args) { preMain(); - if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + Module['onRuntimeInitialized']?.(); if (shouldRunNow) callMain(args); @@ -5976,18 +4653,16 @@ function run(args) { if (Module['setStatus']) { Module['setStatus']('Running...'); - setTimeout(function () { - setTimeout(function () { - Module['setStatus'](''); - }, 1); + setTimeout(() => { + setTimeout(() => Module['setStatus'](''), 1); doRun(); }, 1); - } else { + } else + { doRun(); } checkStackCookie(); } -Module['run'] = run; function checkUnflushedContent() { // Compiler settings do not allow exiting the runtime, so flushing @@ -6004,61 +4679,28 @@ function checkUnflushedContent() { var oldOut = out; var oldErr = err; var has = false; - out = err = function (x) { + out = err = (x) => { has = true; - }; - try { - // it doesn't matter if it fails - ___stdio_exit(); + } + try { // it doesn't matter if it fails + _fflush(0); // also flush in the JS FS layer - ['stdout', 'stderr'].forEach(function (name) { + ['stdout', 'stderr'].forEach((name) => { var info = FS.analyzePath('/dev/' + name); if (!info) return; var stream = info.object; var rdev = stream.rdev; var tty = TTY.ttys[rdev]; - if (tty && tty.output && tty.output.length) { + if (tty?.output?.length) { has = true; } }); - } catch (e) {} + } 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 FAQ), or make sure to emit a newline when you printf etc.'); - } -} - -/** @param {boolean|number=} implicit */ -function exit(status, implicit) { - EXITSTATUS = status; - - // Skip this check if the runtime is being kept alive deliberately. - // For example if `exit_with_live_runtime` is called. - if (!runtimeKeepaliveCounter) { - checkUnflushedContent(); - } - - if (keepRuntimeAlive()) { - // if exit() was called, we may warn the user if the runtime isn't actually being shut down - if (!implicit) { - var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; - err(msg); - } - } else { - exitRuntime(); - } - - procExit(status); -} - -function procExit(code) { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - if (Module['onExit']) Module['onExit'](code); - ABORT = true; + 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.'); } - quit_(code, new ExitStatus(code)); } if (Module['preInit']) { @@ -6074,3 +4716,6 @@ var shouldRunNow = true; if (Module['noInitialRun']) shouldRunNow = false; run(); + +// end include: postamble.js + diff --git a/salam-wa.wasm b/salam-wa.wasm index 93227063dfa7ac04b578f88d675d61a0905e3ab6..3d9d61a0cef42eb646cb1b6345c405518e81de83 100644 GIT binary patch literal 377914 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

5e{(PPuk> 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�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 literal 383696 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

0cp$?r0W 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 HH)#F^Bfp6Q