11b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Modified embenchen to direct to asm-wasm. 21b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Flags: --expose-wasm 31b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar EXPECTED_OUTPUT = 51b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '123456789\n' + 61b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '213456789\n' + 71b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '231456789\n' + 81b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '321456789\n' + 91b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '312456789\n' + 101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '132456789\n' + 111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '234156789\n' + 121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '324156789\n' + 131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '342156789\n' + 141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '432156789\n' + 151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '423156789\n' + 161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '243156789\n' + 171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '341256789\n' + 181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '431256789\n' + 191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '413256789\n' + 201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '143256789\n' + 211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '134256789\n' + 221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '314256789\n' + 231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '412356789\n' + 241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '142356789\n' + 251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '124356789\n' + 261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '214356789\n' + 271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '241356789\n' + 281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '421356789\n' + 291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '234516789\n' + 301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '324516789\n' + 311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '342516789\n' + 321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '432516789\n' + 331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '423516789\n' + 341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch '243516789\n' + 351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'Pfannkuchen(9) = 30.\n'; 361b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Module = { 371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments: [1], 381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch print: function(x) {Module.printBuffer += x + '\n';}, 391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch preRun: [function() {Module.printBuffer = ''}], 401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch postRun: [function() { 411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(EXPECTED_OUTPUT, Module.printBuffer); 421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }], 431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}; 441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// The Module object: Our interface to the outside world. We import 451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// and export values on it, and do the work to get that through 461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// closure compiler if necessary. There are various ways Module can be used: 471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 1. Not defined. We create it here 481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 2. A function parameter, function(Module) { ..generated code.. } 491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 3. pre-run appended it, var Module = {}; ..generated code.. 501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 4. External script tag defines var Module. 511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// We need to do an eval in order to handle the closure compiler 521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// case, where this code here is minified but Module was defined 531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// elsewhere (e.g. case 4 above). We also need to check if Module 541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// already exists (e.g. case 3 above). 551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that if you want to run closure, and also to use Module 561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// after the generated code, you will need to define var Module = {}; 571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// before the code. Then that object will be used in the code, and you 581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// can continue to use Module afterwards as well. 591b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Module; 601b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {}; 611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Sometimes an existing Module object exists with properties 631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// meant to overwrite the default module functionality. Here 641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// we collect those properties and reapply _after_ we configure 651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// the current environment's defaults to avoid having to be so 661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// defensive during initialization. 671b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar moduleOverrides = {}; 681b268ca467c924004286c97bac133db489cf43d0Ben Murdochfor (var key in Module) { 691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module.hasOwnProperty(key)) { 701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch moduleOverrides[key] = Module[key]; 711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// The environment setup code below is customized to use Module. 751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// *** Environment setup code *** 761b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function'; 771b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ENVIRONMENT_IS_WEB = typeof window === 'object'; 781b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; 791b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; 801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 811b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (ENVIRONMENT_IS_NODE) { 821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Expose functionality in the same simple way that the shells work 831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Note that we pollute the global namespace here, otherwise we break in node 841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['print']) Module['print'] = function print(x) { 851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch process['stdout'].write(x + '\n'); 861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['printErr']) Module['printErr'] = function printErr(x) { 881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch process['stderr'].write(x + '\n'); 891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var nodeFS = require('fs'); 921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var nodePath = require('path'); 931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['read'] = function read(filename, binary) { 951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch filename = nodePath['normalize'](filename); 961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = nodeFS['readFileSync'](filename); 971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // The path is absolute if the normalized version is the same as the resolved. 981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ret && filename != nodePath['resolve'](filename)) { 991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch filename = path.join(__dirname, '..', 'src', filename); 1001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = nodeFS['readFileSync'](filename); 1011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 1021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ret && !binary) ret = ret.toString(); 1031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 1041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 1051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) }; 1071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['load'] = function load(f) { 1091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch globalEval(read(f)); 1101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 1111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['arguments'] = process['argv'].slice(2); 1131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch module['exports'] = Module; 1151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1161b268ca467c924004286c97bac133db489cf43d0Ben Murdochelse if (ENVIRONMENT_IS_SHELL) { 1171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['print']) Module['print'] = print; 1181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm 1191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof read != 'undefined') { 1211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['read'] = read; 1221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 1231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['read'] = function read() { throw 'no read() available (jsc?)' }; 1241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 1251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['readBinary'] = function readBinary(f) { 1271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return read(f, 'binary'); 1281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 1291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof scriptArgs != 'undefined') { 1311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['arguments'] = scriptArgs; 1321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (typeof arguments != 'undefined') { 1331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['arguments'] = arguments; 1341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 1351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this['Module'] = Module; 1371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly) 1391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1401b268ca467c924004286c97bac133db489cf43d0Ben Murdochelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { 1411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['read'] = function read(url) { 1421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var xhr = new XMLHttpRequest(); 1431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.open('GET', url, false); 1441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.send(null); 1451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return xhr.responseText; 1461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 1471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof arguments != 'undefined') { 1491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['arguments'] = arguments; 1501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 1511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof console !== 'undefined') { 1531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['print']) Module['print'] = function print(x) { 1541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch console.log(x); 1551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 1561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['printErr']) Module['printErr'] = function printErr(x) { 1571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch console.log(x); 1581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 1591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 1601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Probably a worker, and without console.log. We can do very little here... 1611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var TRY_USE_DUMP = false; 1621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) { 1631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dump(x); 1641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }) : (function(x) { 1651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // self.postMessage(x); // enable this if you want stdout to be sent as messages 1661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch })); 1671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 1681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ENVIRONMENT_IS_WEB) { 1701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window['Module'] = Module; 1711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 1721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['load'] = importScripts; 1731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 1741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1751b268ca467c924004286c97bac133db489cf43d0Ben Murdochelse { 1761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Unreachable because SHELL is dependant on the others 1771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw 'Unknown runtime environment. Where are we?'; 1781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1801b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction globalEval(x) { 1811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch eval.call(null, x); 1821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1831b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module['load'] == 'undefined' && Module['read']) { 1841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['load'] = function load(f) { 1851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch globalEval(Module['read'](f)); 1861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 1871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1881b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module['print']) { 1891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['print'] = function(){}; 1901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1911b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module['printErr']) { 1921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['printErr'] = Module['print']; 1931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1941b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Module['arguments']) { 1951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['arguments'] = []; 1961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 1971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// *** Environment setup code *** 1981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 1991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Closure helpers 2001b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule.print = Module['print']; 2011b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule.printErr = Module['printErr']; 2021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Callbacks 2041b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['preRun'] = []; 2051b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['postRun'] = []; 2061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Merge back in the overrides 2081b268ca467c924004286c97bac133db489cf43d0Ben Murdochfor (var key in moduleOverrides) { 2091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (moduleOverrides.hasOwnProperty(key)) { 2101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module[key] = moduleOverrides[key]; 2111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 2121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 2131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// === Auto-generated preamble library stuff === 2171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//======================================== 2191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Runtime code shared with compiler 2201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//======================================== 2211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2221b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Runtime = { 2231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stackSave: function () { 2241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return STACKTOP; 2251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stackRestore: function (stackTop) { 2271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = stackTop; 2281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch forceAlign: function (target, quantum) { 2301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch quantum = quantum || 4; 2311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (quantum == 1) return target; 2321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (isNumber(target) && isNumber(quantum)) { 2331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Math.ceil(target/quantum)*quantum; 2341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (isNumber(quantum) && isPowerOfTwo(quantum)) { 2351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')'; 2361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 2371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum; 2381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isNumberType: function (type) { 2401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES; 2411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isPointerType: function isPointerType(type) { 2431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return type[type.length-1] == '*'; 2441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}, 2451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isStructType: function isStructType(type) { 2461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (isPointerType(type)) return false; 2471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (isArrayType(type)) return true; 2481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (/<?\{ ?[^}]* ?\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types 2491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // See comment in isStructPointerType() 2501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return type[0] == '%'; 2511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}, 2521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0}, 2531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FLOAT_TYPES: {"float":0,"double":0}, 2541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch or64: function (x, y) { 2551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var l = (x | 0) | (y | 0); 2561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296; 2571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return l + h; 2581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch and64: function (x, y) { 2601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var l = (x | 0) & (y | 0); 2611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296; 2621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return l + h; 2631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xor64: function (x, y) { 2651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var l = (x | 0) ^ (y | 0); 2661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296; 2671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return l + h; 2681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getNativeTypeSize: function (type) { 2701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch (type) { 2711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i1': case 'i8': return 1; 2721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i16': return 2; 2731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i32': return 4; 2741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i64': return 8; 2751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'float': return 4; 2761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'double': return 8; 2771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: { 2781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type[type.length-1] === '*') { 2791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Runtime.QUANTUM_SIZE; // A pointer 2801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (type[0] === 'i') { 2811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bits = parseInt(type.substr(1)); 2821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(bits % 8 === 0); 2831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return bits/8; 2841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 2851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 2861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 2871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 2881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 2891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getNativeFieldSize: function (type) { 2911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE); 2921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 2931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dedup: function dedup(items, ident) { 2941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var seen = {}; 2951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ident) { 2961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return items.filter(function(item) { 2971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (seen[item[ident]]) return false; 2981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch seen[item[ident]] = true; 2991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return true; 3001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 3011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 3021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return items.filter(function(item) { 3031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (seen[item]) return false; 3041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch seen[item] = true; 3051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return true; 3061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 3071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}, 3091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch set: function set() { 3101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var args = typeof arguments[0] === 'object' ? arguments[0] : arguments; 3111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = {}; 3121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < args.length; i++) { 3131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret[args[i]] = 0; 3141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 3161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}, 3171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACK_ALIGN: 8, 3181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getAlignSize: function (type, size, vararg) { 3191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we align i64s and doubles on 64-bit boundaries, unlike x86 3201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!vararg && (type == 'i64' || type == 'double')) return 8; 3211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!type) return Math.min(size, 8); // align structures internally to 64 bits 3221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE); 3231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 3241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch calculateStructAlignment: function calculateStructAlignment(type) { 3251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.flatSize = 0; 3261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.alignSize = 0; 3271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var diffs = []; 3281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var prev = -1; 3291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var index = 0; 3301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.flatIndexes = type.fields.map(function(field) { 3311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch index++; 3321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var size, alignSize; 3331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) { 3341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s. 3351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alignSize = Runtime.getAlignSize(field, size); 3361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (Runtime.isStructType(field)) { 3371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (field[1] === '0') { 3381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // this is [0 x something]. When inside another structure like here, it must be at the end, 3391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // and it adds no size 3401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!'); 3411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size = 0; 3421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Types.types[field]) { 3431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize); 3441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 3451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alignSize = type.alignSize || QUANTUM_SIZE; 3461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 3481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size = Types.types[field].flatSize; 3491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize); 3501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (field[0] == 'b') { 3521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // bN, large number field, like a [N x i8] 3531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size = field.substr(1)|0; 3541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alignSize = 1; 3551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (field[0] === '<') { 3561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // vector type 3571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size = alignSize = Types.types[field].flatSize; // fully aligned 3581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (field[0] === 'i') { 3591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // illegal integer field, that could not be legalized because it is an internal structure field 3601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // it is ok to have such fields, if we just use them as markers of field size and nothing more complex 3611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size = alignSize = parseInt(field.substr(1))/8; 3621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field); 3631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 3641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(false, 'invalid type for calculateStructAlignment'); 3651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type.packed) alignSize = 1; 3671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.alignSize = Math.max(type.alignSize, alignSize); 3681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory 3691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.flatSize = curr + size; 3701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (prev >= 0) { 3711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch diffs.push(curr-prev); 3721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch prev = curr; 3741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return curr; 3751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 3761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type.name_ && type.name_[0] === '[') { 3771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid 3781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // allocating a potentially huge array for [999999 x i8] etc. 3791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2; 3801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize); 3821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (diffs.length == 0) { 3831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.flatFactor = type.flatSize; 3841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (Runtime.dedup(diffs).length == 1) { 3851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.flatFactor = diffs[0]; 3861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type.needsFlattening = (type.flatFactor != 1); 3881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return type.flatIndexes; 3891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 3901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch generateStructInfo: function (struct, typeName, offset) { 3911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var type, alignment; 3921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeName) { 3931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch offset = offset || 0; 3941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName]; 3951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!type) return null; 3961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type.fields.length != struct.length) { 3971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo'); 3981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return null; 3991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alignment = type.flatIndexes; 4011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 4021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var type = { fields: struct.map(function(item) { return item[0] }) }; 4031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alignment = Runtime.calculateStructAlignment(type); 4041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = { 4061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch __size__: type.flatSize 4071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 4081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeName) { 4091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch struct.forEach(function(item, i) { 4101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof item === 'string') { 4111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret[item] = alignment[i] + offset; 4121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 4131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // embedded struct 4141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var key; 4151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var k in item) key = k; 4161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]); 4171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 4191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 4201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch struct.forEach(function(item, i) { 4211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret[item[1]] = alignment[i]; 4221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 4231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 4251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 4261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dynCall: function (sig, ptr, args) { 4271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (args && args.length) { 4281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!args.splice) args = Array.prototype.slice.call(args); 4291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch args.splice(0, 0, ptr); 4301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Module['dynCall_' + sig].apply(null, args); 4311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 4321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Module['dynCall_' + sig].call(null, ptr); 4331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 4351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch functionPointers: [], 4361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addFunction: function (func) { 4371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < Runtime.functionPointers.length; i++) { 4381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Runtime.functionPointers[i]) { 4391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.functionPointers[i] = func; 4401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 2*(1 + i); 4411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; 4441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 4451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch removeFunction: function (index) { 4461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.functionPointers[(index-2)/2] = null; 4471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 4481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getAsmConst: function (code, numArgs) { 4491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // code is a constant string on the heap, so we can cache these 4501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Runtime.asmConstCache) Runtime.asmConstCache = {}; 4511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var func = Runtime.asmConstCache[code]; 4521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func) return func; 4531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var args = []; 4541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < numArgs; i++) { 4551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch args.push(String.fromCharCode(36) + i); // $0, $1 etc 4561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var source = Pointer_stringify(code); 4581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (source[0] === '"') { 4591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct 4601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (source.indexOf('"', 1) === source.length-1) { 4611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch source = source.substr(1, source.length-2); 4621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 4631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // something invalid happened, e.g. EM_ASM("..code($0)..", input) 4641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch abort('invalid EM_ASM input |' + source + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)'); 4651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 4681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var evalled = eval('(function(' + args.join(',') + '){ ' + source + ' })'); // new Function does not allow upvars in node 4691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch(e) { 4701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.printErr('error in executing inline EM_ASM code: ' + e + ' on: \n\n' + source + '\n\nwith args |' + args + '| (make sure to use the right one out of EM_ASM, EM_ASM_ARGS, etc.)'); 4711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw e; 4721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Runtime.asmConstCache[code] = evalled; 4741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 4751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch warnOnce: function (text) { 4761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {}; 4771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Runtime.warnOnce.shown[text]) { 4781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.warnOnce.shown[text] = 1; 4791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.printErr(text); 4801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 4821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch funcWrappers: {}, 4831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getFuncWrapper: function (func, sig) { 4841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(sig); 4851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Runtime.funcWrappers[func]) { 4861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.funcWrappers[func] = function dynCall_wrapper() { 4871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Runtime.dynCall(sig, func, arguments); 4881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 4891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 4901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Runtime.funcWrappers[func]; 4911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 4921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch UTF8Processor: function () { 4931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var buffer = []; 4941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var needed = 0; 4951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.processCChar = function (code) { 4961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch code = code & 0xFF; 4971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 4981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (buffer.length == 0) { 4991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((code & 0x80) == 0x00) { // 0xxxxxxx 5001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return String.fromCharCode(code); 5011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer.push(code); 5031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((code & 0xE0) == 0xC0) { // 110xxxxx 5041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch needed = 1; 5051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if ((code & 0xF0) == 0xE0) { // 1110xxxx 5061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch needed = 2; 5071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { // 11110xxx 5081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch needed = 3; 5091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ''; 5111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (needed) { 5141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer.push(code); 5151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch needed--; 5161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (needed > 0) return ''; 5171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var c1 = buffer[0]; 5201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var c2 = buffer[1]; 5211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var c3 = buffer[2]; 5221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var c4 = buffer[3]; 5231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret; 5241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (buffer.length == 2) { 5251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = String.fromCharCode(((c1 & 0x1F) << 6) | (c2 & 0x3F)); 5261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (buffer.length == 3) { 5271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F)); 5281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 5291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae 5301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) | 5311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ((c3 & 0x3F) << 6) | (c4 & 0x3F); 5321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = String.fromCharCode( 5331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Math.floor((codePoint - 0x10000) / 0x400) + 0xD800, 5341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (codePoint - 0x10000) % 0x400 + 0xDC00); 5351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer.length = 0; 5371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 5381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.processJSString = function processJSString(string) { 5401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch /* TODO: use TextEncoder when present, 5411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var encoder = new TextEncoder(); 5421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch encoder['encoding'] = "utf-8"; 5431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var utf8Array = encoder['encode'](aMsg.data); 5441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch */ 5451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch string = unescape(encodeURIComponent(string)); 5461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = []; 5471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < string.length; i++) { 5481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(string.charCodeAt(i)); 5491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 5511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 5531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getCompilerSetting: function (name) { 5541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work'; 5551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 5561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; }, 5571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; }, 5581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; }, 5591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; }, 5601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; }, 5611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch GLOBAL_BASE: 8, 5621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch QUANTUM_SIZE: 4, 5631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch __dummy__: 0 5641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 5651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5671b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['Runtime'] = Runtime; 5681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//======================================== 5781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Runtime essentials 5791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch//======================================== 5801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5811b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __THREW__ = 0; // Used in checking for thrown exceptions. 5821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5831b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort() 5841b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar EXITSTATUS = 0; 5851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5861b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar undef = 0; 5871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// tempInt is used for 32-bit signed values or smaller. tempBigInt is used 5881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt 5891b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat; 5901b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar tempI64, tempI64b; 5911b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9; 5921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5931b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction assert(condition, text) { 5941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!condition) { 5951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch abort('Assertion failed: ' + text); 5961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 5971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 5981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 5991b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar globalScope = this; 6001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// C calling interface. A convenient way to call C functions (in C files, or 6021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// defined with extern "C"). 6031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 6041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note: LLVM optimizations can inline and remove functions, after which you will not be 6051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// able to call them. Closure can also do so. To avoid that, add your function to 6061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// the exports using something like 6071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 6081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]' 6091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 6101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C") 6111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and 6121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit). 6131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @param argTypes An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType, 6141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// except that 'array' is not possible (there is no way for us to know the length of the array) 6151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @param args An array of the arguments to the function, as native JS values (as in returnType) 6161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that string arguments will be stored on the stack (the JS string will become a C string on the stack). 6171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @return The return value, as a native JS value (as in returnType) 6181b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction ccall(ident, returnType, argTypes, args) { 6191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ccallFunc(getCFunc(ident), returnType, argTypes, args); 6201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 6211b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["ccall"] = ccall; 6221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) 6241b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction getCFunc(ident) { 6251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 6261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var func = Module['_' + ident]; // closure exported function 6271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!func) func = eval('_' + ident); // explicit lookup 6281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch(e) { 6291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 6301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)'); 6311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return func; 6321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 6331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Internal function that does a C call using a function, not an identifier 6351b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction ccallFunc(func, returnType, argTypes, args) { 6361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stack = 0; 6371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function toC(value, type) { 6381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type == 'string') { 6391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (value === null || value === undefined || value === 0) return 0; // null string 6401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch value = intArrayFromString(value); 6411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type = 'array'; 6421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 6431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type == 'array') { 6441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stack) stack = Runtime.stackSave(); 6451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = Runtime.stackAlloc(value.length); 6461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch writeArrayToMemory(value, ret); 6471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 6481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 6491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return value; 6501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 6511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function fromC(value, type) { 6521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type == 'string') { 6531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Pointer_stringify(value); 6541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 6551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(type != 'array'); 6561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return value; 6571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 6581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i = 0; 6591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var cArgs = args ? args.map(function(arg) { 6601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return toC(arg, argTypes[i++]); 6611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }) : []; 6621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = fromC(func.apply(null, cArgs), returnType); 6631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (stack) Runtime.stackRestore(stack); 6641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 6651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 6661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Returns a native JS wrapper for a C function. This is similar to ccall, but 6681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// returns a function you can call repeatedly in a normal way. For example: 6691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 6701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// var my_function = cwrap('my_c_function', 'number', ['number', 'number']); 6711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// alert(my_function(5, 22)); 6721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// alert(my_function(99, 12)); 6731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// 6741b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction cwrap(ident, returnType, argTypes) { 6751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var func = getCFunc(ident); 6761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return function() { 6771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments)); 6781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 6791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 6801b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["cwrap"] = cwrap; 6811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 6821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Sets a value in memory in a dynamic way at run-time. Uses the 6831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// type data. This is the same as makeSetValue, except that 6841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// makeSetValue is done at compile-time and generates the needed 6851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// code then, whereas this function picks the right code at 6861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// run-time. 6871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that setValue and getValue only do *aligned* writes and reads! 6881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that ccall uses JS types as for defining types, while setValue and 6891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation 6901b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setValue(ptr, value, type, noSafe) { 6911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type = type || 'i8'; 6921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit 6931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch(type) { 6941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i1': HEAP8[(ptr)]=value; break; 6951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i8': HEAP8[(ptr)]=value; break; 6961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i16': HEAP16[((ptr)>>1)]=value; break; 6971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i32': HEAP32[((ptr)>>2)]=value; break; 6981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; 6991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'float': HEAPF32[((ptr)>>2)]=value; break; 7001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'double': HEAPF64[((ptr)>>3)]=value; break; 7011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: abort('invalid type for setValue: ' + type); 7021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 7041b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['setValue'] = setValue; 7051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Parallel to setValue. 7071b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction getValue(ptr, type, noSafe) { 7081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type = type || 'i8'; 7091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit 7101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch(type) { 7111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i1': return HEAP8[(ptr)]; 7121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i8': return HEAP8[(ptr)]; 7131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i16': return HEAP16[((ptr)>>1)]; 7141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i32': return HEAP32[((ptr)>>2)]; 7151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'i64': return HEAP32[((ptr)>>2)]; 7161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'float': return HEAPF32[((ptr)>>2)]; 7171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'double': return HEAPF64[((ptr)>>3)]; 7181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: abort('invalid type for setValue: ' + type); 7191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return null; 7211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 7221b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['getValue'] = getValue; 7231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7241b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_NORMAL = 0; // Tries to use _malloc() 7251b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_STACK = 1; // Lives for the duration of the current function call 7261b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_STATIC = 2; // Cannot be freed 7271b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk 7281b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar ALLOC_NONE = 4; // Do not allocate 7291b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_NORMAL'] = ALLOC_NORMAL; 7301b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_STACK'] = ALLOC_STACK; 7311b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_STATIC'] = ALLOC_STATIC; 7321b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC; 7331b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['ALLOC_NONE'] = ALLOC_NONE; 7341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// allocate(): This is for internal use. You can use it yourself as well, but the interface 7361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// is a little tricky (see docs right below). The reason is that it is optimized 7371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// for multiple syntaxes to save space in generated code. So you should 7381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// normally not use allocate(), and instead allocate memory using _malloc(), 7391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// initialize it with setValue(), and so forth. 7401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @slab: An array of data, or a number. If a number, then the size of the block to allocate, 7411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// in *bytes* (note that this is sometimes confusing: the next parameter does not 7421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// affect this!) 7431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @types: Either an array of types, one for each byte (or 0 if no type at that position), 7441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// or a single type which is used for the entire block. This only matters if there 7451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// is initial data - if @slab is a number, then this does not matter at all and is 7461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// ignored. 7471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// @allocator: How to allocate memory, see ALLOC_* 7481b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction allocate(slab, types, allocator, ptr) { 7491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var zeroinit, size; 7501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof slab === 'number') { 7511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch zeroinit = true; 7521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size = slab; 7531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 7541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch zeroinit = false; 7551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size = slab.length; 7561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var singleType = typeof types === 'string' ? types : null; 7591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret; 7611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (allocator == ALLOC_NONE) { 7621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = ptr; 7631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 7641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); 7651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (zeroinit) { 7681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ptr = ret, stop; 7691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert((ret & 3) == 0); 7701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stop = ret + (size & ~3); 7711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (; ptr < stop; ptr += 4) { 7721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((ptr)>>2)]=0; 7731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stop = ret + size; 7751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (ptr < stop) { 7761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[((ptr++)|0)]=0; 7771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 7791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (singleType === 'i8') { 7821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (slab.subarray || slab.slice) { 7831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAPU8.set(slab, ret); 7841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 7851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAPU8.set(new Uint8Array(slab), ret); 7861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 7881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i = 0, type, typeSize, previousType; 7911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (i < size) { 7921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var curr = slab[i]; 7931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof curr === 'function') { 7951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch curr = Runtime.getFunctionIndex(curr); 7961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 7971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 7981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type = singleType || types[i]; 7991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type === 0) { 8001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i++; 8011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 8021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later 8051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch setValue(ret+i, curr, type); 8071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // no need to look up size unless type changes, so cache it 8091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (previousType !== type) { 8101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch typeSize = Runtime.getNativeTypeSize(type); 8111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch previousType = type; 8121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i += typeSize; 8141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 8171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 8181b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['allocate'] = allocate; 8191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8201b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction Pointer_stringify(ptr, /* optional */ length) { 8211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO: use TextDecoder 8221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Find the length, and check for UTF while doing so 8231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var hasUtf = false; 8241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var t; 8251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i = 0; 8261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 8271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch t = HEAPU8[(((ptr)+(i))|0)]; 8281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (t >= 128) hasUtf = true; 8291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch else if (t == 0 && !length) break; 8301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i++; 8311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (length && i == length) break; 8321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!length) length = i; 8341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = ''; 8361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!hasUtf) { 8381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack 8391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var curr; 8401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (length > 0) { 8411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK))); 8421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = ret ? ret + curr : curr; 8431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ptr += MAX_CHUNK; 8441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch length -= MAX_CHUNK; 8451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 8471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var utf8 = new Runtime.UTF8Processor(); 8501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (i = 0; i < length; i++) { 8511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch t = HEAPU8[(((ptr)+(i))|0)]; 8521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret += utf8.processCChar(t); 8531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 8551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 8561b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['Pointer_stringify'] = Pointer_stringify; 8571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns 8591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// a copy of that string as a Javascript String object. 8601b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction UTF16ToString(ptr) { 8611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i = 0; 8621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var str = ''; 8641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 8651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; 8661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (codeUnit == 0) 8671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return str; 8681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ++i; 8691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. 8701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch str += String.fromCharCode(codeUnit); 8711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 8731b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['UTF16ToString'] = UTF16ToString; 8741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', 8761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP. 8771b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stringToUTF16(str, outPtr) { 8781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for(var i = 0; i < str.length; ++i) { 8791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. 8801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var codeUnit = str.charCodeAt(i); // possibly a lead surrogate 8811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit; 8821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 8831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Null-terminate the pointer to the HEAP. 8841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP16[(((outPtr)+(str.length*2))>>1)]=0; 8851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 8861b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['stringToUTF16'] = stringToUTF16; 8871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns 8891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// a copy of that string as a Javascript String object. 8901b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction UTF32ToString(ptr) { 8911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i = 0; 8921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 8931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var str = ''; 8941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 8951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; 8961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (utf32 == 0) 8971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return str; 8981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ++i; 8991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // 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. 9001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (utf32 >= 0x10000) { 9011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ch = utf32 - 0x10000; 9021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); 9031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 9041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch str += String.fromCharCode(utf32); 9051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 9081b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['UTF32ToString'] = UTF32ToString; 9091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 9101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', 9111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP, 9121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string. 9131b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stringToUTF32(str, outPtr) { 9141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var iChar = 0; 9151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) { 9161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // 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. 9171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate 9181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { 9191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var trailSurrogate = str.charCodeAt(++iCodeUnit); 9201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); 9211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit; 9231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ++iChar; 9241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Null-terminate the pointer to the HEAP. 9261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[(((outPtr)+(iChar*4))>>2)]=0; 9271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 9281b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['stringToUTF32'] = stringToUTF32; 9291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 9301b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction demangle(func) { 9311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i = 3; 9321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // params, etc. 9331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var basicTypes = { 9341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'v': 'void', 9351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'b': 'bool', 9361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'c': 'char', 9371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 's': 'short', 9381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'i': 'int', 9391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'l': 'long', 9401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'f': 'float', 9411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'd': 'double', 9421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'w': 'wchar_t', 9431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'a': 'signed char', 9441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'h': 'unsigned char', 9451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 't': 'unsigned short', 9461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'j': 'unsigned int', 9471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'm': 'unsigned long', 9481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'x': 'long long', 9491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'y': 'unsigned long long', 9501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'z': '...' 9511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 9521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var subs = []; 9531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var first = true; 9541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function dump(x) { 9551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch //return; 9561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (x) Module.print(x); 9571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.print(func); 9581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var pre = ''; 9591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var a = 0; a < i; a++) pre += ' '; 9601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.print (pre + '^'); 9611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function parseNested() { 9631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i++; 9641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[i] === 'K') i++; // ignore const 9651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parts = []; 9661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (func[i] !== 'E') { 9671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[i] === 'S') { // substitution 9681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i++; 9691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var next = func.indexOf('_', i); 9701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var num = func.substring(i, next) || 0; 9711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.push(subs[num] || '?'); 9721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i = next+1; 9731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 9741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[i] === 'C') { // constructor 9761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.push(parts[parts.length-1]); 9771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i += 2; 9781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 9791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var size = parseInt(func.substr(i)); 9811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var pre = size.toString().length; 9821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!size || !pre) { i--; break; } // counter i++ below us 9831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var curr = func.substr(i + pre, size); 9841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.push(curr); 9851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch subs.push(curr); 9861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i += pre + size; 9871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i++; // skip E 9891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return parts; 9901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function parse(rawList, limit, allowVoid) { // main parser 9921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch limit = limit || Infinity; 9931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = '', list = []; 9941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function flushList() { 9951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return '(' + list.join(', ') + ')'; 9961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 9971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var name; 9981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[i] === 'N') { 9991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // namespaced N-E 10001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch name = parseNested().join('::'); 10011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch limit--; 10021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (limit === 0) return rawList ? [name] : name; 10031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 10041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // not namespaced 10051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L' 10061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var size = parseInt(func.substr(i)); 10071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (size) { 10081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var pre = size.toString().length; 10091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch name = func.substr(i + pre, size); 10101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i += pre + size; 10111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch first = false; 10141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[i] === 'I') { 10151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i++; 10161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var iList = parse(true); 10171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var iRet = parse(true, 1, true); 10181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>'; 10191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 10201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = name; 10211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch paramLoop: while (i < func.length && limit-- > 0) { 10231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch //dump('paramLoop'); 10241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var c = func[i++]; 10251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (c in basicTypes) { 10261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch list.push(basicTypes[c]); 10271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 10281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch (c) { 10291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer 10301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference 10311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'L': { // literal 10321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i++; // skip basic type 10331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var end = func.indexOf('E', i); 10341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var size = end - i; 10351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch list.push(func.substr(i, size)); 10361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i += size + 2; // size + 'EE' 10371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 10381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'A': { // array 10401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var size = parseInt(func.substr(i)); 10411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i += size.toString().length; 10421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[i] !== '_') throw '?'; 10431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i++; // skip _ 10441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch list.push(parse(true, 1, true)[0] + ' [' + size + ']'); 10451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 10461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'E': break paramLoop; 10481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: ret += '?' + c; break paramLoop; 10491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void) 10531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (rawList) { 10541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ret) { 10551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch list.push(ret + '?'); 10561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return list; 10581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 10591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret + flushList(); 10601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 10631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Special-case the entry point, since its name differs from other name mangling. 10641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func == 'Object._main' || func == '_main') { 10651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 'main()'; 10661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof func === 'number') func = Pointer_stringify(func); 10681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[0] !== '_') return func; 10691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[1] !== '_') return func; // C function 10701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (func[2] !== 'Z') return func; 10711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch (func[3]) { 10721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'n': return 'operator new()'; 10731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'd': return 'operator delete()'; 10741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return parse(); 10761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch(e) { 10771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return func; 10781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 10791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 10801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 10811b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction demangleAll(text) { 10821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') }); 10831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 10841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 10851b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stackTrace() { 10861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stack = new Error().stack; 10871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6. 10881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 10891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 10901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Memory management 10911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 10921b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar PAGE_SIZE = 4096; 10931b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction alignMemoryPage(x) { 10941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (x+4095)&-4096; 10951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 10961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 10971b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar HEAP; 10981b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; 10991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11001b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area 11011b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area 11021b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk 11031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11041b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction enlargeMemory() { 11051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch abort('Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + TOTAL_MEMORY + ', (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.'); 11061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 11071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11081b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880; 11091b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 134217728; 11101b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152; 11111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11121b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar totalMemory = 4096; 11131b268ca467c924004286c97bac133db489cf43d0Ben Murdochwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) { 11141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (totalMemory < 16*1024*1024) { 11151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch totalMemory *= 2; 11161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 11171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch totalMemory += 16*1024*1024 11181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 11191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 11201b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (totalMemory !== TOTAL_MEMORY) { 11211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable'); 11221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch TOTAL_MEMORY = totalMemory; 11231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 11241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Initialize the runtime's memory 11261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// check for full engine support (use string 'subarray' to avoid closure compiler confusion) 11271b268ca467c924004286c97bac133db489cf43d0Ben Murdochassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']), 11281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'JS engine does not provide full typed array support'); 11291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11301b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar buffer = new ArrayBuffer(TOTAL_MEMORY); 11311b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAP8 = new Int8Array(buffer); 11321b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAP16 = new Int16Array(buffer); 11331b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAP32 = new Int32Array(buffer); 11341b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPU8 = new Uint8Array(buffer); 11351b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPU16 = new Uint16Array(buffer); 11361b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPU32 = new Uint32Array(buffer); 11371b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPF32 = new Float32Array(buffer); 11381b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAPF64 = new Float64Array(buffer); 11391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Endianness check (note: assumes compiler arch was little-endian) 11411b268ca467c924004286c97bac133db489cf43d0Ben MurdochHEAP32[0] = 255; 11421b268ca467c924004286c97bac133db489cf43d0Ben Murdochassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system'); 11431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11441b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAP'] = HEAP; 11451b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAP8'] = HEAP8; 11461b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAP16'] = HEAP16; 11471b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAP32'] = HEAP32; 11481b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPU8'] = HEAPU8; 11491b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPU16'] = HEAPU16; 11501b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPU32'] = HEAPU32; 11511b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPF32'] = HEAPF32; 11521b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['HEAPF64'] = HEAPF64; 11531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11541b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction callRuntimeCallbacks(callbacks) { 11551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while(callbacks.length > 0) { 11561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var callback = callbacks.shift(); 11571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof callback == 'function') { 11581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callback(); 11591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 11601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 11611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var func = callback.func; 11621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof func === 'number') { 11631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (callback.arg === undefined) { 11641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.dynCall('v', func); 11651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 11661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.dynCall('vi', func, [callback.arg]); 11671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 11681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 11691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch func(callback.arg === undefined ? null : callback.arg); 11701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 11711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 11721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 11731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11741b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATPRERUN__ = []; // functions called before the runtime is initialized 11751b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATINIT__ = []; // functions called during startup 11761b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATMAIN__ = []; // functions called when main() is to be run 11771b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATEXIT__ = []; // functions called during shutdown 11781b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar __ATPOSTRUN__ = []; // functions called after the runtime has exited 11791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11801b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar runtimeInitialized = false; 11811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11821b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction preRun() { 11831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // compatibility - merge in anything from Module['preRun'] at this time 11841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['preRun']) { 11851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; 11861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (Module['preRun'].length) { 11871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addOnPreRun(Module['preRun'].shift()); 11881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 11891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 11901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callRuntimeCallbacks(__ATPRERUN__); 11911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 11921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11931b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction ensureInitRuntime() { 11941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (runtimeInitialized) return; 11951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch runtimeInitialized = true; 11961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callRuntimeCallbacks(__ATINIT__); 11971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 11981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 11991b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction preMain() { 12001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callRuntimeCallbacks(__ATMAIN__); 12011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12031b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction exitRuntime() { 12041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callRuntimeCallbacks(__ATEXIT__); 12051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12071b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction postRun() { 12081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // compatibility - merge in anything from Module['postRun'] at this time 12091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['postRun']) { 12101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; 12111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (Module['postRun'].length) { 12121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addOnPostRun(Module['postRun'].shift()); 12131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callRuntimeCallbacks(__ATPOSTRUN__); 12161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12181b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnPreRun(cb) { 12191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch __ATPRERUN__.unshift(cb); 12201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12211b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun; 12221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12231b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnInit(cb) { 12241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch __ATINIT__.unshift(cb); 12251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12261b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnInit'] = Module.addOnInit = addOnInit; 12271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12281b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnPreMain(cb) { 12291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch __ATMAIN__.unshift(cb); 12301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12311b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain; 12321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12331b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnExit(cb) { 12341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch __ATEXIT__.unshift(cb); 12351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12361b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnExit'] = Module.addOnExit = addOnExit; 12371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12381b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addOnPostRun(cb) { 12391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch __ATPOSTRUN__.unshift(cb); 12401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12411b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun; 12421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Tools 12441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// This processes a JS string into a C-line array of numbers, 0-terminated. 12461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// For LLVM-originating strings, see parser.js:parseLLVMString function 12471b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction intArrayFromString(stringy, dontAddNull, length /* optional */) { 12481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = (new Runtime.UTF8Processor()).processJSString(stringy); 12491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (length) { 12501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.length = length; 12511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!dontAddNull) { 12531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(0); 12541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 12561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12571b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['intArrayFromString'] = intArrayFromString; 12581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12591b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction intArrayToString(array) { 12601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = []; 12611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < array.length; i++) { 12621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var chr = array[i]; 12631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (chr > 0xFF) { 12641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch chr &= 0xFF; 12651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(String.fromCharCode(chr)); 12671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret.join(''); 12691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12701b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['intArrayToString'] = intArrayToString; 12711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Write a Javascript array to somewhere in the heap 12731b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction writeStringToMemory(string, buffer, dontAddNull) { 12741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var array = intArrayFromString(string, dontAddNull); 12751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i = 0; 12761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (i < array.length) { 12771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var chr = array[i]; 12781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[(((buffer)+(i))|0)]=chr; 12791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i = i + 1; 12801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12821b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['writeStringToMemory'] = writeStringToMemory; 12831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12841b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction writeArrayToMemory(array, buffer) { 12851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < array.length; i++) { 12861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[(((buffer)+(i))|0)]=array[i]; 12871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12891b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['writeArrayToMemory'] = writeArrayToMemory; 12901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12911b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction writeAsciiToMemory(str, buffer, dontAddNull) { 12921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < str.length; i++) { 12931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i); 12941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 12951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0; 12961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 12971b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['writeAsciiToMemory'] = writeAsciiToMemory; 12981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 12991b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction unSign(value, bits, ignore) { 13001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (value >= 0) { 13011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return value; 13021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 13031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts 13041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch : Math.pow(2, bits) + value; 13051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 13061b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction reSign(value, bits, ignore) { 13071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (value <= 0) { 13081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return value; 13091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 13101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 13111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch : Math.pow(2, bits-1); 13121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that 13131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors 13141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO: In i64 mode 1, resign the two parts separately and safely 13151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts 13161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 13171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return value; 13181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 13191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 ) 13211b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) { 13221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ah = a >>> 16; 13231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var al = a & 0xffff; 13241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bh = b >>> 16; 13251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bl = b & 0xffff; 13261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (al*bl + ((ah*bl + al*bh) << 16))|0; 13271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}; 13281b268ca467c924004286c97bac133db489cf43d0Ben MurdochMath.imul = Math['imul']; 13291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13311b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_abs = Math.abs; 13321b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_cos = Math.cos; 13331b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_sin = Math.sin; 13341b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_tan = Math.tan; 13351b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_acos = Math.acos; 13361b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_asin = Math.asin; 13371b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_atan = Math.atan; 13381b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_atan2 = Math.atan2; 13391b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_exp = Math.exp; 13401b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_log = Math.log; 13411b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_sqrt = Math.sqrt; 13421b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_ceil = Math.ceil; 13431b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_floor = Math.floor; 13441b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_pow = Math.pow; 13451b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_imul = Math.imul; 13461b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_fround = Math.fround; 13471b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_min = Math.min; 13481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// A counter of dependencies for calling run(). If we need to 13501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// do asynchronous work before running, increment this and 13511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// decrement it. Incrementing must happen in a place like 13521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// PRE_RUN_ADDITIONS (used by emcc to add file preloading). 13531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Note that you can add dependencies in preRun, even though 13541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// it happens right before run - run will be postponed until 13551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// the dependencies are met. 13561b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar runDependencies = 0; 13571b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar runDependencyWatcher = null; 13581b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled 13591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13601b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction addRunDependency(id) { 13611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch runDependencies++; 13621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['monitorRunDependencies']) { 13631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['monitorRunDependencies'](runDependencies); 13641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 13651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 13661b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['addRunDependency'] = addRunDependency; 13671b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction removeRunDependency(id) { 13681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch runDependencies--; 13691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['monitorRunDependencies']) { 13701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['monitorRunDependencies'](runDependencies); 13711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 13721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (runDependencies == 0) { 13731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (runDependencyWatcher !== null) { 13741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch clearInterval(runDependencyWatcher); 13751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch runDependencyWatcher = null; 13761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 13771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (dependenciesFulfilled) { 13781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var callback = dependenciesFulfilled; 13791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dependenciesFulfilled = null; 13801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callback(); // can add another dependenciesFulfilled 13811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 13821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 13831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 13841b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['removeRunDependency'] = removeRunDependency; 13851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13861b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["preloadedImages"] = {}; // maps url to image data 13871b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["preloadedAudios"] = {}; // maps url to audio data 13881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13901b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar memoryInitializer = null; 13911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// === Body === 13931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 13981b268ca467c924004286c97bac133db489cf43d0Ben MurdochSTATIC_BASE = 8; 13991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14001b268ca467c924004286c97bac133db489cf43d0Ben MurdochSTATICTOP = STATIC_BASE + Runtime.alignMemory(547); 14011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch/* global initializers */ __ATINIT__.push(); 14021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch/* memory initializer */ allocate([101,114,114,111,114,58,32,37,100,10,0,0,0,0,0,0,80,102,97,110,110,107,117,99,104,101,110,40,37,100,41,32,61,32,37,100,46,10,0,0,37,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE); 14051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14091b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8); 14101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14111b268ca467c924004286c97bac133db489cf43d0Ben Murdochassert(tempDoublePtr % 8 == 0); 14121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14131b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much 14141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr] = HEAP8[ptr]; 14161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; 14181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; 14201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; 14221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 14241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14251b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction copyTempDouble(ptr) { 14261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr] = HEAP8[ptr]; 14281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; 14301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; 14321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; 14341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; 14361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; 14381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; 14401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; 14421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 14441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86}; 14511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"}; 14531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ___errno_state=0;function ___setErrNo(value) { 14561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // For convenient setting and returning of errno. 14571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((___errno_state)>>2)]=value; 14581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return value; 14591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 14601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 14611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var PATH={splitPath:function (filename) { 14621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; 14631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return splitPathRe.exec(filename).slice(1); 14641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },normalizeArray:function (parts, allowAboveRoot) { 14651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if the path tries to go above the root, `up` ends up > 0 14661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var up = 0; 14671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = parts.length - 1; i >= 0; i--) { 14681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var last = parts[i]; 14691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (last === '.') { 14701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.splice(i, 1); 14711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (last === '..') { 14721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.splice(i, 1); 14731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch up++; 14741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (up) { 14751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.splice(i, 1); 14761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch up--; 14771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 14781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 14791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if the path is allowed to go above the root, restore leading ..s 14801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (allowAboveRoot) { 14811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (; up--; up) { 14821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.unshift('..'); 14831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 14841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 14851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return parts; 14861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },normalize:function (path) { 14871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var isAbsolute = path.charAt(0) === '/', 14881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch trailingSlash = path.substr(-1) === '/'; 14891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Normalize the path 14901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path = PATH.normalizeArray(path.split('/').filter(function(p) { 14911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return !!p; 14921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }), !isAbsolute).join('/'); 14931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!path && !isAbsolute) { 14941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path = '.'; 14951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 14961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (path && trailingSlash) { 14971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path += '/'; 14981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 14991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (isAbsolute ? '/' : '') + path; 15001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },dirname:function (path) { 15011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var result = PATH.splitPath(path), 15021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch root = result[0], 15031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dir = result[1]; 15041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!root && !dir) { 15051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // No dirname whatsoever 15061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return '.'; 15071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (dir) { 15091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // It has a dirname, strip trailing slash 15101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dir = dir.substr(0, dir.length - 1); 15111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return root + dir; 15131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },basename:function (path) { 15141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // EMSCRIPTEN return '/'' for '/', not an empty string 15151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (path === '/') return '/'; 15161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lastSlash = path.lastIndexOf('/'); 15171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (lastSlash === -1) return path; 15181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return path.substr(lastSlash+1); 15191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },extname:function (path) { 15201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return PATH.splitPath(path)[3]; 15211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },join:function () { 15221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var paths = Array.prototype.slice.call(arguments, 0); 15231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return PATH.normalize(paths.join('/')); 15241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },join2:function (l, r) { 15251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return PATH.normalize(l + '/' + r); 15261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },resolve:function () { 15271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var resolvedPath = '', 15281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch resolvedAbsolute = false; 15291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { 15301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = (i >= 0) ? arguments[i] : FS.cwd(); 15311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Skip empty and invalid entries 15321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof path !== 'string') { 15331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new TypeError('Arguments to path.resolve must be strings'); 15341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (!path) { 15351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 15361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch resolvedPath = path + '/' + resolvedPath; 15381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch resolvedAbsolute = path.charAt(0) === '/'; 15391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // At this point the path should be resolved to a full absolute path, but 15411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // handle relative paths to be safe (might happen when process.cwd() fails) 15421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { 15431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return !!p; 15441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }), !resolvedAbsolute).join('/'); 15451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; 15461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },relative:function (from, to) { 15471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch from = PATH.resolve(from).substr(1); 15481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch to = PATH.resolve(to).substr(1); 15491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function trim(arr) { 15501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var start = 0; 15511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (; start < arr.length; start++) { 15521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (arr[start] !== '') break; 15531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var end = arr.length - 1; 15551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (; end >= 0; end--) { 15561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (arr[end] !== '') break; 15571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (start > end) return []; 15591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return arr.slice(start, end - start + 1); 15601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var fromParts = trim(from.split('/')); 15621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var toParts = trim(to.split('/')); 15631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var length = Math.min(fromParts.length, toParts.length); 15641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var samePartsLength = length; 15651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < length; i++) { 15661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (fromParts[i] !== toParts[i]) { 15671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch samePartsLength = i; 15681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 15691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var outputParts = []; 15721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = samePartsLength; i < fromParts.length; i++) { 15731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch outputParts.push('..'); 15741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 15751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch outputParts = outputParts.concat(toParts.slice(samePartsLength)); 15761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return outputParts.join('/'); 15771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }}; 15781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 15791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var TTY={ttys:[],init:function () { 15801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // https://github.com/kripken/emscripten/pull/1555 15811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if (ENVIRONMENT_IS_NODE) { 15821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // currently, FS.init does not distinguish if process.stdin is a file or TTY 15831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // device, it always assumes it's a TTY device. because of this, we're forcing 15841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // process.stdin to UTF8 encoding to at least make stdin reading compatible 15851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // with text files until FS.init can be refactored. 15861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // process['stdin']['setEncoding']('utf8'); 15871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // } 15881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },shutdown:function () { 15891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // https://github.com/kripken/emscripten/pull/1555 15901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if (ENVIRONMENT_IS_NODE) { 15911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? 15921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // 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 15931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? 15941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle 15951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call 15961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // process['stdin']['pause'](); 15971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // } 15981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },register:function (dev, ops) { 15991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch TTY.ttys[dev] = { input: [], output: [], ops: ops }; 16001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.registerDevice(dev, TTY.stream_ops); 16011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },stream_ops:{open:function (stream) { 16021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tty = TTY.ttys[stream.node.rdev]; 16031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!tty) { 16041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENODEV); 16051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.tty = tty; 16071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.seekable = false; 16081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },close:function (stream) { 16091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // flush any pending line data 16101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (stream.tty.output.length) { 16111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.tty.ops.put_char(stream.tty, 10); 16121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },read:function (stream, buffer, offset, length, pos /* ignored */) { 16141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream.tty || !stream.tty.ops.get_char) { 16151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENXIO); 16161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytesRead = 0; 16181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < length; i++) { 16191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var result; 16201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 16211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch result = stream.tty.ops.get_char(stream.tty); 16221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 16231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EIO); 16241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (result === undefined && bytesRead === 0) { 16261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 16271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (result === null || result === undefined) break; 16291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch bytesRead++; 16301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer[offset+i] = result; 16311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (bytesRead) { 16331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.node.timestamp = Date.now(); 16341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return bytesRead; 16361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },write:function (stream, buffer, offset, length, pos) { 16371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream.tty || !stream.tty.ops.put_char) { 16381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENXIO); 16391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < length; i++) { 16411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 16421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.tty.ops.put_char(stream.tty, buffer[offset+i]); 16431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 16441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EIO); 16451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (length) { 16481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.node.timestamp = Date.now(); 16491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i; 16511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }},default_tty_ops:{get_char:function (tty) { 16521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!tty.input.length) { 16531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var result = null; 16541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ENVIRONMENT_IS_NODE) { 16551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch result = process['stdin']['read'](); 16561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!result) { 16571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) { 16581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return null; // EOF 16591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return undefined; // no data available 16611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (typeof window != 'undefined' && 16631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch typeof window.prompt == 'function') { 16641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Browser. 16651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch result = window.prompt('Input: '); // returns null on cancel 16661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (result !== null) { 16671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch result += '\n'; 16681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (typeof readline == 'function') { 16701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Command line. 16711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch result = readline(); 16721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (result !== null) { 16731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch result += '\n'; 16741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!result) { 16771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return null; 16781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tty.input = intArrayFromString(result, true); 16801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return tty.input.shift(); 16821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },put_char:function (tty, val) { 16831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (val === null || val === 10) { 16841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['print'](tty.output.join('')); 16851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tty.output = []; 16861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 16871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tty.output.push(TTY.utf8.processCChar(val)); 16881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }},default_tty1_ops:{put_char:function (tty, val) { 16901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (val === null || val === 10) { 16911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['printErr'](tty.output.join('')); 16921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tty.output = []; 16931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 16941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tty.output.push(TTY.utf8.processCChar(val)); 16951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 16961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }}}; 16971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 16981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) { 16991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); 17001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createNode:function (parent, name, mode, dev) { 17011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { 17021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // no supported 17031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 17041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 17051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!MEMFS.ops_table) { 17061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch MEMFS.ops_table = { 17071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dir: { 17081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node: { 17091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getattr: MEMFS.node_ops.getattr, 17101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch setattr: MEMFS.node_ops.setattr, 17111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch lookup: MEMFS.node_ops.lookup, 17121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mknod: MEMFS.node_ops.mknod, 17131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch rename: MEMFS.node_ops.rename, 17141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch unlink: MEMFS.node_ops.unlink, 17151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch rmdir: MEMFS.node_ops.rmdir, 17161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch readdir: MEMFS.node_ops.readdir, 17171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch symlink: MEMFS.node_ops.symlink 17181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 17191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream: { 17201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch llseek: MEMFS.stream_ops.llseek 17211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 17221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 17231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch file: { 17241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node: { 17251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getattr: MEMFS.node_ops.getattr, 17261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch setattr: MEMFS.node_ops.setattr 17271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 17281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream: { 17291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch llseek: MEMFS.stream_ops.llseek, 17301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch read: MEMFS.stream_ops.read, 17311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch write: MEMFS.stream_ops.write, 17321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch allocate: MEMFS.stream_ops.allocate, 17331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mmap: MEMFS.stream_ops.mmap 17341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 17351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 17361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch link: { 17371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node: { 17381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getattr: MEMFS.node_ops.getattr, 17391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch setattr: MEMFS.node_ops.setattr, 17401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch readlink: MEMFS.node_ops.readlink 17411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 17421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream: {} 17431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 17441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch chrdev: { 17451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node: { 17461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getattr: MEMFS.node_ops.getattr, 17471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch setattr: MEMFS.node_ops.setattr 17481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 17491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream: FS.chrdev_stream_ops 17501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 17511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 17521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 17531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.createNode(parent, name, mode, dev); 17541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(node.mode)) { 17551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops = MEMFS.ops_table.dir.node; 17561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.stream_ops = MEMFS.ops_table.dir.stream; 17571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contents = {}; 17581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isFile(node.mode)) { 17591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops = MEMFS.ops_table.file.node; 17601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.stream_ops = MEMFS.ops_table.file.stream; 17611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contents = []; 17621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contentMode = MEMFS.CONTENT_FLEXIBLE; 17631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isLink(node.mode)) { 17641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops = MEMFS.ops_table.link.node; 17651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.stream_ops = MEMFS.ops_table.link.stream; 17661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isChrdev(node.mode)) { 17671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops = MEMFS.ops_table.chrdev.node; 17681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.stream_ops = MEMFS.ops_table.chrdev.stream; 17691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 17701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.timestamp = Date.now(); 17711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // add the new node to the parent 17721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (parent) { 17731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parent.contents[name] = node; 17741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 17751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node; 17761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },ensureFlexible:function (node) { 17771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) { 17781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contents = node.contents; 17791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contents = Array.prototype.slice.call(contents); 17801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contentMode = MEMFS.CONTENT_FLEXIBLE; 17811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 17821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },node_ops:{getattr:function (node) { 17831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var attr = {}; 17841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // device numbers reuse inode numbers. 17851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.dev = FS.isChrdev(node.mode) ? node.id : 1; 17861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.ino = node.id; 17871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.mode = node.mode; 17881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.nlink = 1; 17891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.uid = 0; 17901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.gid = 0; 17911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.rdev = node.rdev; 17921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(node.mode)) { 17931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.size = 4096; 17941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isFile(node.mode)) { 17951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.size = node.contents.length; 17961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isLink(node.mode)) { 17971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.size = node.link.length; 17981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 17991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.size = 0; 18001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.atime = new Date(node.timestamp); 18021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.mtime = new Date(node.timestamp); 18031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.ctime = new Date(node.timestamp); 18041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), 18051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // but this is not required by the standard. 18061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.blksize = 4096; 18071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch attr.blocks = Math.ceil(attr.size / attr.blksize); 18081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return attr; 18091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },setattr:function (node, attr) { 18101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (attr.mode !== undefined) { 18111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.mode = attr.mode; 18121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (attr.timestamp !== undefined) { 18141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.timestamp = attr.timestamp; 18151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (attr.size !== undefined) { 18171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch MEMFS.ensureFlexible(node); 18181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contents = node.contents; 18191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (attr.size < contents.length) contents.length = attr.size; 18201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch else while (attr.size > contents.length) contents.push(0); 18211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },lookup:function (parent, name) { 18231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw FS.genericErrors[ERRNO_CODES.ENOENT]; 18241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mknod:function (parent, name, mode, dev) { 18251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return MEMFS.createNode(parent, name, mode, dev); 18261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },rename:function (old_node, new_dir, new_name) { 18271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we're overwriting a directory at new_name, make sure it's empty. 18281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(old_node.mode)) { 18291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var new_node; 18301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 18311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch new_node = FS.lookupNode(new_dir, new_name); 18321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 18331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (new_node) { 18351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i in new_node.contents) { 18361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); 18371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // do the internal rewiring 18411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch delete old_node.parent.contents[old_node.name]; 18421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch old_node.name = new_name; 18431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch new_dir.contents[new_name] = old_node; 18441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch old_node.parent = new_dir; 18451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },unlink:function (parent, name) { 18461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch delete parent.contents[name]; 18471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },rmdir:function (parent, name) { 18481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.lookupNode(parent, name); 18491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i in node.contents) { 18501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); 18511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch delete parent.contents[name]; 18531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },readdir:function (node) { 18541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var entries = ['.', '..'] 18551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var key in node.contents) { 18561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!node.contents.hasOwnProperty(key)) { 18571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 18581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch entries.push(key); 18601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return entries; 18621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },symlink:function (parent, newname, oldpath) { 18631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); 18641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.link = oldpath; 18651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node; 18661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },readlink:function (node) { 18671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isLink(node.mode)) { 18681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 18691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node.link; 18711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }},stream_ops:{read:function (stream, buffer, offset, length, position) { 18721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contents = stream.node.contents; 18731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (position >= contents.length) 18741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 18751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var size = Math.min(contents.length - position, length); 18761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(size >= 0); 18771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (size > 8 && contents.subarray) { // non-trivial, and typed array 18781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer.set(contents.subarray(position, position + size), offset); 18791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else 18801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch { 18811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < size; i++) { 18821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer[offset + i] = contents[position + i]; 18831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return size; 18861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },write:function (stream, buffer, offset, length, position, canOwn) { 18871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = stream.node; 18881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.timestamp = Date.now(); 18891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contents = node.contents; 18901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (length && contents.length === 0 && position === 0 && buffer.subarray) { 18911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // just replace it with the new data 18921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (canOwn && offset === 0) { 18931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source. 18941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED; 18951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 18961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contents = new Uint8Array(buffer.subarray(offset, offset+length)); 18971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contentMode = MEMFS.CONTENT_FIXED; 18981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 18991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return length; 19001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch MEMFS.ensureFlexible(node); 19021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contents = node.contents; 19031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (contents.length < position) contents.push(0); 19041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < length; i++) { 19051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch contents[position + i] = buffer[offset + i]; 19061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return length; 19081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },llseek:function (stream, offset, whence) { 19091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var position = offset; 19101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (whence === 1) { // SEEK_CUR. 19111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch position += stream.position; 19121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (whence === 2) { // SEEK_END. 19131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isFile(stream.node.mode)) { 19141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch position += stream.node.contents.length; 19151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (position < 0) { 19181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 19191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.ungotten = []; 19211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.position = position; 19221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return position; 19231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },allocate:function (stream, offset, length) { 19241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch MEMFS.ensureFlexible(stream.node); 19251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contents = stream.node.contents; 19261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var limit = offset + length; 19271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (limit > contents.length) contents.push(0); 19281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mmap:function (stream, buffer, offset, length, position, prot, flags) { 19291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isFile(stream.node.mode)) { 19301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENODEV); 19311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ptr; 19331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var allocated; 19341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contents = stream.node.contents; 19351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Only make a new copy when MAP_PRIVATE is specified. 19361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ( !(flags & 2) && 19371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (contents.buffer === buffer || contents.buffer === buffer.buffer) ) { 19381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // We can't emulate MAP_SHARED when the file is not backed by the buffer 19391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we're mapping to (e.g. the HEAP buffer). 19401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch allocated = false; 19411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ptr = contents.byteOffset; 19421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 19431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Try to avoid unnecessary slices. 19441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (position > 0 || position + length < contents.length) { 19451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (contents.subarray) { 19461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch contents = contents.subarray(position, position + length); 19471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 19481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch contents = Array.prototype.slice.call(contents, position, position + length); 19491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch allocated = true; 19521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ptr = _malloc(length); 19531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ptr) { 19541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOMEM); 19551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer.set(contents, ptr); 19571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return { ptr: ptr, allocated: allocated }; 19591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }}}; 19601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 19611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var IDBFS={dbs:{},indexedDB:function () { 19621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; 19631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) { 19641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // reuse all of the core MEMFS functionality 19651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return MEMFS.mount.apply(null, arguments); 19661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },syncfs:function (mount, populate, callback) { 19671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.getLocalSet(mount, function(err, local) { 19681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) return callback(err); 19691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 19701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.getRemoteSet(mount, function(err, remote) { 19711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) return callback(err); 19721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 19731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var src = populate ? remote : local; 19741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var dst = populate ? local : remote; 19751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 19761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.reconcile(src, dst, callback); 19771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 19781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 19791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getDB:function (name, callback) { 19801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // check the cache first 19811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var db = IDBFS.dbs[name]; 19821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (db) { 19831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(null, db); 19841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 19861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var req; 19871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 19881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION); 19891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 19901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(e); 19911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 19921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onupgradeneeded = function(e) { 19931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var db = e.target.result; 19941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var transaction = e.target.transaction; 19951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 19961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var fileStore; 19971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 19981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) { 19991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME); 20001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 20011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME); 20021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fileStore.createIndex('timestamp', 'timestamp', { unique: false }); 20051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 20061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onsuccess = function() { 20071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch db = req.result; 20081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // add to the cache 20101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.dbs[name] = db; 20111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callback(null, db); 20121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 20131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onerror = function() { 20141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callback(this.error); 20151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 20161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getLocalSet:function (mount, callback) { 20171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var entries = {}; 20181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function isRealDir(p) { 20201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return p !== '.' && p !== '..'; 20211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 20221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function toAbsolute(root) { 20231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return function(p) { 20241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return PATH.join2(root, p); 20251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 20271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint)); 20291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (check.length) { 20311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = check.pop(); 20321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stat; 20331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 20351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stat = FS.stat(path); 20361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 20371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(e); 20381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(stat.mode)) { 20411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path))); 20421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch entries[path] = { timestamp: stat.mtime }; 20451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(null, { type: 'local', entries: entries }); 20481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getRemoteSet:function (mount, callback) { 20491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var entries = {}; 20501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.getDB(mount.mountpoint, function(err, db) { 20521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) return callback(err); 20531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly'); 20551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch transaction.onerror = function() { callback(this.error); }; 20561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var store = transaction.objectStore(IDBFS.DB_STORE_NAME); 20581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var index = store.index('timestamp'); 20591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch index.openKeyCursor().onsuccess = function(event) { 20611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var cursor = event.target.result; 20621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!cursor) { 20641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(null, { type: 'remote', db: db, entries: entries }); 20651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch entries[cursor.primaryKey] = { timestamp: cursor.key }; 20681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch cursor.continue(); 20701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 20711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 20721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },loadLocalEntry:function (path, callback) { 20731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stat, node; 20741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 20761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path); 20771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = lookup.node; 20781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stat = FS.stat(path); 20791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 20801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(e); 20811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 20831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(stat.mode)) { 20841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(null, { timestamp: stat.mtime, mode: stat.mode }); 20851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isFile(stat.mode)) { 20861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents }); 20871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 20881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(new Error('node type not supported')); 20891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },storeLocalEntry:function (path, entry, callback) { 20911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 20921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(entry.mode)) { 20931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdir(path, entry.mode); 20941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isFile(entry.mode)) { 20951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true }); 20961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 20971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(new Error('node type not supported')); 20981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 20991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.utime(path, entry.timestamp, entry.timestamp); 21011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 21021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(e); 21031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callback(null); 21061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },removeLocalEntry:function (path, callback) { 21071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 21081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path); 21091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stat = FS.stat(path); 21101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(stat.mode)) { 21121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.rmdir(path); 21131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isFile(stat.mode)) { 21141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.unlink(path); 21151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 21171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(e); 21181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callback(null); 21211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },loadRemoteEntry:function (store, path, callback) { 21221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var req = store.get(path); 21231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onsuccess = function(event) { callback(null, event.target.result); }; 21241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onerror = function() { callback(this.error); }; 21251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },storeRemoteEntry:function (store, path, entry, callback) { 21261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var req = store.put(entry, path); 21271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onsuccess = function() { callback(null); }; 21281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onerror = function() { callback(this.error); }; 21291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },removeRemoteEntry:function (store, path, callback) { 21301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var req = store.delete(path); 21311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onsuccess = function() { callback(null); }; 21321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch req.onerror = function() { callback(this.error); }; 21331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },reconcile:function (src, dst, callback) { 21341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var total = 0; 21351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var create = []; 21371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.keys(src.entries).forEach(function (key) { 21381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var e = src.entries[key]; 21391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var e2 = dst.entries[key]; 21401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e2 || e.timestamp > e2.timestamp) { 21411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch create.push(key); 21421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch total++; 21431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 21451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var remove = []; 21471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.keys(dst.entries).forEach(function (key) { 21481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var e = dst.entries[key]; 21491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var e2 = src.entries[key]; 21501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e2) { 21511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch remove.push(key); 21521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch total++; 21531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 21551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!total) { 21571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(null); 21581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var errored = false; 21611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var completed = 0; 21621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var db = src.type === 'remote' ? src.db : dst.db; 21631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite'); 21641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var store = transaction.objectStore(IDBFS.DB_STORE_NAME); 21651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function done(err) { 21671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 21681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!done.errored) { 21691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch done.errored = true; 21701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(err); 21711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 21731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (++completed >= total) { 21751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(null); 21761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 21781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch transaction.onerror = function() { done(this.error); }; 21801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // sort paths in ascending order so directory entries are created 21821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // before the files inside them 21831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch create.sort().forEach(function (path) { 21841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (dst.type === 'local') { 21851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.loadRemoteEntry(store, path, function (err, entry) { 21861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) return done(err); 21871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.storeLocalEntry(path, entry, done); 21881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 21891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 21901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.loadLocalEntry(path, function (err, entry) { 21911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) return done(err); 21921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.storeRemoteEntry(store, path, entry, done); 21931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 21941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 21951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 21961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 21971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // sort paths in descending order so files are deleted before their 21981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // parent directories 21991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch remove.sort().reverse().forEach(function(path) { 22001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (dst.type === 'local') { 22011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.removeLocalEntry(path, done); 22021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 22031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch IDBFS.removeRemoteEntry(store, path, done); 22041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 22061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }}; 22071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 22081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var NODEFS={isWindows:false,staticInit:function () { 22091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch NODEFS.isWindows = !!process.platform.match(/^win/); 22101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mount:function (mount) { 22111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(ENVIRONMENT_IS_NODE); 22121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0); 22131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createNode:function (parent, name, mode, dev) { 22141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { 22151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 22161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.createNode(parent, name, mode); 22181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops = NODEFS.node_ops; 22191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.stream_ops = NODEFS.stream_ops; 22201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node; 22211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getMode:function (path) { 22221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stat; 22231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 22241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stat = fs.lstatSync(path); 22251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (NODEFS.isWindows) { 22261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so 22271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // propagate write bits to execute bits. 22281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stat.mode = stat.mode | ((stat.mode & 146) >> 1); 22291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 22311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 22321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 22331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stat.mode; 22351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },realPath:function (node) { 22361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parts = []; 22371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (node.parent !== node) { 22381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.push(node.name); 22391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = node.parent; 22401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.push(node.mount.opts.root); 22421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts.reverse(); 22431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return PATH.join.apply(null, parts); 22441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:function (flags) { 22451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flags in NODEFS.flagsToPermissionStringMap) { 22461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return NODEFS.flagsToPermissionStringMap[flags]; 22471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 22481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return flags; 22491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },node_ops:{getattr:function (node) { 22511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = NODEFS.realPath(node); 22521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stat; 22531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 22541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stat = fs.lstatSync(path); 22551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 22561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 22571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 22581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096. 22601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // See http://support.microsoft.com/kb/140365 22611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (NODEFS.isWindows && !stat.blksize) { 22621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stat.blksize = 4096; 22631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (NODEFS.isWindows && !stat.blocks) { 22651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0; 22661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return { 22681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dev: stat.dev, 22691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ino: stat.ino, 22701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode: stat.mode, 22711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch nlink: stat.nlink, 22721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch uid: stat.uid, 22731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch gid: stat.gid, 22741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch rdev: stat.rdev, 22751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size: stat.size, 22761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch atime: stat.atime, 22771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mtime: stat.mtime, 22781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ctime: stat.ctime, 22791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch blksize: stat.blksize, 22801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch blocks: stat.blocks 22811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 22821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },setattr:function (node, attr) { 22831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = NODEFS.realPath(node); 22841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 22851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (attr.mode !== undefined) { 22861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.chmodSync(path, attr.mode); 22871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // update the common node structure mode as well 22881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.mode = attr.mode; 22891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (attr.timestamp !== undefined) { 22911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var date = new Date(attr.timestamp); 22921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.utimesSync(path, date, date); 22931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (attr.size !== undefined) { 22951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.truncateSync(path, attr.size); 22961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 22971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 22981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 22991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },lookup:function (parent, name) { 23021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = PATH.join2(NODEFS.realPath(parent), name); 23031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mode = NODEFS.getMode(path); 23041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return NODEFS.createNode(parent, name, mode); 23051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mknod:function (parent, name, mode, dev) { 23061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = NODEFS.createNode(parent, name, mode, dev); 23071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create the backing node for this in the fs root as well 23081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = NODEFS.realPath(node); 23091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(node.mode)) { 23111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.mkdirSync(path, node.mode); 23121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 23131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.writeFileSync(path, '', { mode: node.mode }); 23141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node; 23201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },rename:function (oldNode, newDir, newName) { 23211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var oldPath = NODEFS.realPath(oldNode); 23221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var newPath = PATH.join2(NODEFS.realPath(newDir), newName); 23231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.renameSync(oldPath, newPath); 23251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },unlink:function (parent, name) { 23301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = PATH.join2(NODEFS.realPath(parent), name); 23311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.unlinkSync(path); 23331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },rmdir:function (parent, name) { 23381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = PATH.join2(NODEFS.realPath(parent), name); 23391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.rmdirSync(path); 23411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },readdir:function (node) { 23461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = NODEFS.realPath(node); 23471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return fs.readdirSync(path); 23491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },symlink:function (parent, newName, oldPath) { 23541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var newPath = PATH.join2(NODEFS.realPath(parent), newName); 23551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.symlinkSync(oldPath, newPath); 23571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },readlink:function (node) { 23621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = NODEFS.realPath(node); 23631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return fs.readlinkSync(path); 23651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }},stream_ops:{open:function (stream) { 23701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = NODEFS.realPath(stream.node); 23711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isFile(stream.node.mode)) { 23731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags)); 23741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },close:function (stream) { 23801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isFile(stream.node.mode) && stream.nfd) { 23821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fs.closeSync(stream.nfd); 23831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!e.code) throw e; 23861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },read:function (stream, buffer, offset, length, position) { 23891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // FIXME this is terrible. 23901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var nbuffer = new Buffer(length); 23911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var res; 23921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 23931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch res = fs.readSync(stream.nfd, nbuffer, 0, length, position); 23941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 23951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 23961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 23971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (res > 0) { 23981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < res; i++) { 23991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer[offset + i] = nbuffer[i]; 24001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return res; 24031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },write:function (stream, buffer, offset, length, position) { 24041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // FIXME this is terrible. 24051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var nbuffer = new Buffer(buffer.subarray(offset, offset + length)); 24061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var res; 24071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 24081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch res = fs.writeSync(stream.nfd, nbuffer, 0, length, position); 24091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 24101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 24111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return res; 24131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },llseek:function (stream, offset, whence) { 24141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var position = offset; 24151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (whence === 1) { // SEEK_CUR. 24161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch position += stream.position; 24171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (whence === 2) { // SEEK_END. 24181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isFile(stream.node.mode)) { 24191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 24201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stat = fs.fstatSync(stream.nfd); 24211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch position += stat.size; 24221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 24231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES[e.code]); 24241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (position < 0) { 24291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 24301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.position = position; 24331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return position; 24341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }}}; 24351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _stdin=allocate(1, "i32*", ALLOC_STATIC); 24371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _stdout=allocate(1, "i32*", ALLOC_STATIC); 24391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _stderr=allocate(1, "i32*", ALLOC_STATIC); 24411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _fflush(stream) { 24431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // int fflush(FILE *stream); 24441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html 24451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we don't currently perform any user-space buffering of data 24461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) { 24471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); 24481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ___setErrNo(e.errno); 24491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },lookupPath:function (path, opts) { 24501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path = PATH.resolve(FS.cwd(), path); 24511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts = opts || {}; 24521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var defaults = { 24541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch follow_mount: true, 24551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch recurse_count: 0 24561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 24571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var key in defaults) { 24581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (opts[key] === undefined) { 24591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts[key] = defaults[key]; 24601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (opts.recurse_count > 8) { // max recursive lookup of 8 24641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ELOOP); 24651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // split the path 24681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parts = PATH.normalizeArray(path.split('/').filter(function(p) { 24691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return !!p; 24701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }), false); 24711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // start at the root 24731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var current = FS.root; 24741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var current_path = '/'; 24751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < parts.length; i++) { 24771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var islast = (i === parts.length-1); 24781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (islast && opts.parent) { 24791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // stop resolving 24801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 24811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch current = FS.lookupNode(current, parts[i]); 24841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch current_path = PATH.join2(current_path, parts[i]); 24851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // jump to the mount's root node if this is a mountpoint 24871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isMountpoint(current)) { 24881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!islast || (islast && opts.follow_mount)) { 24891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch current = current.mounted.root; 24901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 24921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 24931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // by default, lookupPath will not follow a symlink if it is the final path component. 24941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // setting opts.follow = true will override this behavior. 24951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!islast || opts.follow) { 24961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var count = 0; 24971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (FS.isLink(current.mode)) { 24981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var link = FS.readlink(current_path); 24991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch current_path = PATH.resolve(PATH.dirname(current_path), link); 25001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 25011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); 25021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch current = lookup.node; 25031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 25041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). 25051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ELOOP); 25061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 25111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return { path: current_path, node: current }; 25121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getPath:function (node) { 25131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path; 25141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (true) { 25151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isRoot(node)) { 25161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mount = node.mount.mountpoint; 25171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!path) return mount; 25181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; 25191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path = path ? node.name + '/' + path : node.name; 25211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = node.parent; 25221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },hashName:function (parentid, name) { 25241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var hash = 0; 25251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 25261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 25271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < name.length; i++) { 25281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; 25291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ((parentid + hash) >>> 0) % FS.nameTable.length; 25311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },hashAddNode:function (node) { 25321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var hash = FS.hashName(node.parent.id, node.name); 25331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.name_next = FS.nameTable[hash]; 25341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.nameTable[hash] = node; 25351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },hashRemoveNode:function (node) { 25361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var hash = FS.hashName(node.parent.id, node.name); 25371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.nameTable[hash] === node) { 25381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.nameTable[hash] = node.name_next; 25391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 25401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var current = FS.nameTable[hash]; 25411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (current) { 25421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (current.name_next === node) { 25431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch current.name_next = node.name_next; 25441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 25451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch current = current.name_next; 25471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },lookupNode:function (parent, name) { 25501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.mayLookup(parent); 25511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 25521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 25531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var hash = FS.hashName(parent.id, name); 25551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var node = FS.nameTable[hash]; node; node = node.name_next) { 25561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var nodeName = node.name; 25571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (node.parent.id === parent.id && nodeName === name) { 25581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node; 25591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we failed to find it in the cache, call into the VFS 25621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.lookup(parent, name); 25631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createNode:function (parent, name, mode, rdev) { 25641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.FSNode) { 25651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.FSNode = function(parent, name, mode, rdev) { 25661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!parent) { 25671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parent = this; // root node sets parent to itself 25681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 25691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.parent = parent; 25701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.mount = parent.mount; 25711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.mounted = null; 25721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.id = FS.nextInode++; 25731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.name = name; 25741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.mode = mode; 25751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.node_ops = {}; 25761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.stream_ops = {}; 25771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.rdev = rdev; 25781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 25791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 25801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.FSNode.prototype = {}; 25811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 25821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // compatibility 25831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var readMode = 292 | 73; 25841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var writeMode = 146; 25851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 25861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // NOTE we must use Object.defineProperties instead of individual calls to 25871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Object.defineProperty in order to make closure compiler happy 25881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.defineProperties(FS.FSNode.prototype, { 25891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch read: { 25901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { return (this.mode & readMode) === readMode; }, 25911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; } 25921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 25931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch write: { 25941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { return (this.mode & writeMode) === writeMode; }, 25951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; } 25961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 25971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isFolder: { 25981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { return FS.isDir(this.mode); }, 25991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 26001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isDevice: { 26011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { return FS.isChrdev(this.mode); }, 26021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 26031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 26041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 26061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = new FS.FSNode(parent, name, mode, rdev); 26071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 26081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.hashAddNode(node); 26091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 26101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node; 26111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },destroyNode:function (node) { 26121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.hashRemoveNode(node); 26131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isRoot:function (node) { 26141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node === node.parent; 26151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isMountpoint:function (node) { 26161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return !!node.mounted; 26171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isFile:function (mode) { 26181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (mode & 61440) === 32768; 26191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isDir:function (mode) { 26201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (mode & 61440) === 16384; 26211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isLink:function (mode) { 26221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (mode & 61440) === 40960; 26231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isChrdev:function (mode) { 26241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (mode & 61440) === 8192; 26251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isBlkdev:function (mode) { 26261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (mode & 61440) === 24576; 26271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isFIFO:function (mode) { 26281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (mode & 61440) === 4096; 26291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },isSocket:function (mode) { 26301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return (mode & 49152) === 49152; 26311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) { 26321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var flags = FS.flagModes[str]; 26331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof flags === 'undefined') { 26341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new Error('Unknown file open mode: ' + str); 26351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return flags; 26371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },flagsToPermissionString:function (flag) { 26381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var accmode = flag & 2097155; 26391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var perms = ['r', 'w', 'rw'][accmode]; 26401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((flag & 512)) { 26411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch perms += 'w'; 26421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return perms; 26441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },nodePermissions:function (node, perms) { 26451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.ignorePermissions) { 26461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 26471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // return 0 if any user, group or owner bits are set. 26491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { 26501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.EACCES; 26511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { 26521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.EACCES; 26531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { 26541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.EACCES; 26551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 26571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mayLookup:function (dir) { 26581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.nodePermissions(dir, 'x'); 26591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mayCreate:function (dir, name) { 26601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 26611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.lookupNode(dir, name); 26621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.EEXIST; 26631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 26641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.nodePermissions(dir, 'wx'); 26661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mayDelete:function (dir, name, isdir) { 26671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node; 26681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 26691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = FS.lookupNode(dir, name); 26701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 26711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return e.errno; 26721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.nodePermissions(dir, 'wx'); 26741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 26751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return err; 26761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (isdir) { 26781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isDir(node.mode)) { 26791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.ENOTDIR; 26801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { 26821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.EBUSY; 26831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 26851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(node.mode)) { 26861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.EISDIR; 26871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 26901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mayOpen:function (node, flags) { 26911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!node) { 26921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.ENOENT; 26931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 26941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isLink(node.mode)) { 26951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.ELOOP; 26961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (FS.isDir(node.mode)) { 26971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((flags & 2097155) !== 0 || // opening for write 26981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (flags & 512)) { 26991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.EISDIR; 27001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); 27031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) { 27041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fd_start = fd_start || 0; 27051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch fd_end = fd_end || FS.MAX_OPEN_FDS; 27061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var fd = fd_start; fd <= fd_end; fd++) { 27071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.streams[fd]) { 27081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return fd; 27091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EMFILE); 27121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getStream:function (fd) { 27131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.streams[fd]; 27141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createStream:function (stream, fd_start, fd_end) { 27151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.FSStream) { 27161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.FSStream = function(){}; 27171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.FSStream.prototype = {}; 27181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // compatibility 27191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.defineProperties(FS.FSStream.prototype, { 27201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch object: { 27211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { return this.node; }, 27221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch set: function(val) { this.node = val; } 27231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 27241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isRead: { 27251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { return (this.flags & 2097155) !== 1; } 27261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 27271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isWrite: { 27281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { return (this.flags & 2097155) !== 0; } 27291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 27301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isAppend: { 27311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { return (this.flags & 1024); } 27321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 27341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (0) { 27361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // reuse the object 27371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.__proto__ = FS.FSStream.prototype; 27381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 27391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var newStream = new FS.FSStream(); 27401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var p in stream) { 27411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch newStream[p] = stream[p]; 27421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream = newStream; 27441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var fd = FS.nextfd(fd_start, fd_end); 27461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.fd = fd; 27471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.streams[fd] = stream; 27481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stream; 27491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },closeStream:function (fd) { 27501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.streams[fd] = null; 27511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getStreamFromPtr:function (ptr) { 27521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.streams[ptr - 1]; 27531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getPtrForStream:function (stream) { 27541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stream ? stream.fd + 1 : 0; 27551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },chrdev_stream_ops:{open:function (stream) { 27561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var device = FS.getDevice(stream.node.rdev); 27571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // override node's stream ops with the device's 27581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.stream_ops = device.stream_ops; 27591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // forward the open call 27601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (stream.stream_ops.open) { 27611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.stream_ops.open(stream); 27621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },llseek:function () { 27641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); 27651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }},major:function (dev) { 27661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ((dev) >> 8); 27671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },minor:function (dev) { 27681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ((dev) & 0xff); 27691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },makedev:function (ma, mi) { 27701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ((ma) << 8 | (mi)); 27711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },registerDevice:function (dev, ops) { 27721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.devices[dev] = { stream_ops: ops }; 27731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getDevice:function (dev) { 27741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.devices[dev]; 27751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getMounts:function (mount) { 27761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mounts = []; 27771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var check = [mount]; 27781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 27791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (check.length) { 27801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var m = check.pop(); 27811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 27821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mounts.push(m); 27831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 27841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch check.push.apply(check, m.mounts); 27851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 27871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return mounts; 27881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },syncfs:function (populate, callback) { 27891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof(populate) === 'function') { 27901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callback = populate; 27911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch populate = false; 27921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 27931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 27941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mounts = FS.getMounts(FS.root.mount); 27951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var completed = 0; 27961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 27971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function done(err) { 27981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 27991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!done.errored) { 28001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch done.errored = true; 28011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return callback(err); 28021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 28041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (++completed >= mounts.length) { 28061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch callback(null); 28071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 28091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // sync all mounts 28111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mounts.forEach(function (mount) { 28121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!mount.type.syncfs) { 28131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return done(null); 28141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mount.type.syncfs(mount, populate, done); 28161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 28171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mount:function (type, opts, mountpoint) { 28181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var root = mountpoint === '/'; 28191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var pseudo = !mountpoint; 28201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node; 28211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (root && FS.root) { 28231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 28241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (!root && !pseudo) { 28251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); 28261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mountpoint = lookup.path; // use the absolute path 28281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = lookup.node; 28291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isMountpoint(node)) { 28311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 28321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isDir(node.mode)) { 28351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); 28361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mount = { 28401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type: type, 28411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts: opts, 28421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mountpoint: mountpoint, 28431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mounts: [] 28441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 28451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create a root node for the fs 28471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mountRoot = type.mount(mount); 28481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mountRoot.mount = mount; 28491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mount.root = mountRoot; 28501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (root) { 28521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.root = mountRoot; 28531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (node) { 28541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // set as a mountpoint 28551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.mounted = mount; 28561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // add the new mount to the current mount's children 28581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (node.mount) { 28591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.mount.mounts.push(mount); 28601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return mountRoot; 28641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },unmount:function (mountpoint) { 28651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); 28661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isMountpoint(lookup.node)) { 28681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 28691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // destroy the nodes for this mount, and all its child mounts 28721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = lookup.node; 28731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mount = node.mounted; 28741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mounts = FS.getMounts(mount); 28751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.keys(FS.nameTable).forEach(function (hash) { 28771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var current = FS.nameTable[hash]; 28781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (current) { 28801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var next = current.name_next; 28811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (mounts.indexOf(current.mount) !== -1) { 28831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.destroyNode(current); 28841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch current = next; 28871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 28881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 28891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // no longer a mountpoint 28911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.mounted = null; 28921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 28931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // remove this mount from the child mounts 28941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var idx = node.mount.mounts.indexOf(mount); 28951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(idx !== -1); 28961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.mount.mounts.splice(idx, 1); 28971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },lookup:function (parent, name) { 28981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return parent.node_ops.lookup(parent, name); 28991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mknod:function (path, mode, dev) { 29001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { parent: true }); 29011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parent = lookup.node; 29021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var name = PATH.basename(path); 29031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.mayCreate(parent, name); 29041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 29051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 29061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!parent.node_ops.mknod) { 29081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 29091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return parent.node_ops.mknod(parent, name, mode, dev); 29111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },create:function (path, mode) { 29121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode = mode !== undefined ? mode : 438 /* 0666 */; 29131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode &= 4095; 29141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode |= 32768; 29151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.mknod(path, mode, 0); 29161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mkdir:function (path, mode) { 29171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode = mode !== undefined ? mode : 511 /* 0777 */; 29181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode &= 511 | 512; 29191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode |= 16384; 29201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.mknod(path, mode, 0); 29211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mkdev:function (path, mode, dev) { 29221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof(dev) === 'undefined') { 29231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dev = mode; 29241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode = 438 /* 0666 */; 29251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode |= 8192; 29271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.mknod(path, mode, dev); 29281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },symlink:function (oldpath, newpath) { 29291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(newpath, { parent: true }); 29301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parent = lookup.node; 29311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var newname = PATH.basename(newpath); 29321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.mayCreate(parent, newname); 29331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 29341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 29351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!parent.node_ops.symlink) { 29371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 29381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return parent.node_ops.symlink(parent, newname, oldpath); 29401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },rename:function (old_path, new_path) { 29411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var old_dirname = PATH.dirname(old_path); 29421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var new_dirname = PATH.dirname(new_path); 29431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var old_name = PATH.basename(old_path); 29441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var new_name = PATH.basename(new_path); 29451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // parents must exist 29461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup, old_dir, new_dir; 29471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 29481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch lookup = FS.lookupPath(old_path, { parent: true }); 29491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch old_dir = lookup.node; 29501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch lookup = FS.lookupPath(new_path, { parent: true }); 29511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch new_dir = lookup.node; 29521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 29531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 29541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // need to be part of the same mount 29561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (old_dir.mount !== new_dir.mount) { 29571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EXDEV); 29581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // source must exist 29601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var old_node = FS.lookupNode(old_dir, old_name); 29611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // old path should not be an ancestor of the new path 29621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var relative = PATH.relative(old_path, new_dirname); 29631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (relative.charAt(0) !== '.') { 29641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 29651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // new path should not be an ancestor of the old path 29671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch relative = PATH.relative(new_path, old_dirname); 29681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (relative.charAt(0) !== '.') { 29691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); 29701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // see if the new path already exists 29721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var new_node; 29731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 29741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch new_node = FS.lookupNode(new_dir, new_name); 29751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 29761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // not fatal 29771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // early out if nothing needs to change 29791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (old_node === new_node) { 29801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 29811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we'll need to delete the old entry 29831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var isdir = FS.isDir(old_node.mode); 29841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.mayDelete(old_dir, old_name, isdir); 29851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 29861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 29871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // need delete permissions if we'll be overwriting. 29891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // need create permissions if new doesn't already exist. 29901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch err = new_node ? 29911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mayDelete(new_dir, new_name, isdir) : 29921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mayCreate(new_dir, new_name); 29931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 29941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 29951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!old_dir.node_ops.rename) { 29971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 29981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 29991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { 30001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 30011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we are going to change the parent, check write permissions 30031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (new_dir !== old_dir) { 30041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch err = FS.nodePermissions(old_dir, 'w'); 30051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 30061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 30071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // remove the node from the lookup hash 30101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.hashRemoveNode(old_node); 30111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // do the underlying fs rename 30121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 30131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch old_dir.node_ops.rename(old_node, new_dir, new_name); 30141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 30151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw e; 30161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } finally { 30171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // add the node back to the hash (in case node_ops.rename 30181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // changed its name) 30191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.hashAddNode(old_node); 30201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },rmdir:function (path) { 30221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { parent: true }); 30231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parent = lookup.node; 30241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var name = PATH.basename(path); 30251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.lookupNode(parent, name); 30261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.mayDelete(parent, name, true); 30271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 30281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 30291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!parent.node_ops.rmdir) { 30311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 30321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isMountpoint(node)) { 30341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 30351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parent.node_ops.rmdir(parent, name); 30371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.destroyNode(node); 30381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },readdir:function (path) { 30391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { follow: true }); 30401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = lookup.node; 30411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!node.node_ops.readdir) { 30421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); 30431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node.node_ops.readdir(node); 30451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },unlink:function (path) { 30461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { parent: true }); 30471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parent = lookup.node; 30481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var name = PATH.basename(path); 30491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.lookupNode(parent, name); 30501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.mayDelete(parent, name, false); 30511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 30521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // POSIX says unlink should set EPERM, not EISDIR 30531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM; 30541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 30551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!parent.node_ops.unlink) { 30571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 30581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isMountpoint(node)) { 30601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 30611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parent.node_ops.unlink(parent, name); 30631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.destroyNode(node); 30641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },readlink:function (path) { 30651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path); 30661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var link = lookup.node; 30671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!link.node_ops.readlink) { 30681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 30691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return link.node_ops.readlink(link); 30711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },stat:function (path, dontFollow) { 30721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { follow: !dontFollow }); 30731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = lookup.node; 30741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!node.node_ops.getattr) { 30751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 30761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node.node_ops.getattr(node); 30781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },lstat:function (path) { 30791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.stat(path, true); 30801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },chmod:function (path, mode, dontFollow) { 30811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node; 30821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof path === 'string') { 30831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { follow: !dontFollow }); 30841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = lookup.node; 30851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 30861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = path; 30871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!node.node_ops.setattr) { 30891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 30901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 30911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops.setattr(node, { 30921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode: (mode & 4095) | (node.mode & ~4095), 30931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch timestamp: Date.now() 30941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 30951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },lchmod:function (path, mode) { 30961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.chmod(path, mode, true); 30971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },fchmod:function (fd, mode) { 30981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.getStream(fd); 30991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream) { 31001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBADF); 31011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.chmod(stream.node, mode); 31031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },chown:function (path, uid, gid, dontFollow) { 31041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node; 31051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof path === 'string') { 31061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { follow: !dontFollow }); 31071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = lookup.node; 31081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 31091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = path; 31101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!node.node_ops.setattr) { 31121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 31131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops.setattr(node, { 31151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch timestamp: Date.now() 31161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we ignore the uid / gid for now 31171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 31181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },lchown:function (path, uid, gid) { 31191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.chown(path, uid, gid, true); 31201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },fchown:function (fd, uid, gid) { 31211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.getStream(fd); 31221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream) { 31231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBADF); 31241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.chown(stream.node, uid, gid); 31261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },truncate:function (path, len) { 31271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (len < 0) { 31281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 31291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node; 31311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof path === 'string') { 31321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { follow: true }); 31331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = lookup.node; 31341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 31351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = path; 31361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!node.node_ops.setattr) { 31381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EPERM); 31391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(node.mode)) { 31411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EISDIR); 31421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isFile(node.mode)) { 31441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 31451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.nodePermissions(node, 'w'); 31471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 31481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 31491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops.setattr(node, { 31511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch size: len, 31521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch timestamp: Date.now() 31531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 31541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },ftruncate:function (fd, len) { 31551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.getStream(fd); 31561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream) { 31571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBADF); 31581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((stream.flags & 2097155) === 0) { 31601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 31611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.truncate(stream.node, len); 31631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },utime:function (path, atime, mtime) { 31641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { follow: true }); 31651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = lookup.node; 31661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.node_ops.setattr(node, { 31671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch timestamp: Math.max(atime, mtime) 31681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 31691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },open:function (path, flags, mode, fd_start, fd_end) { 31701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; 31711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; 31721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((flags & 64)) { 31731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode = (mode & 4095) | 32768; 31741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 31751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mode = 0; 31761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node; 31781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof path === 'object') { 31791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = path; 31801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 31811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path = PATH.normalize(path); 31821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 31831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { 31841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch follow: !(flags & 131072) 31851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 31861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = lookup.node; 31871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 31881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // ignore 31891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // perhaps we need to create the node 31921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((flags & 64)) { 31931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (node) { 31941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if O_CREAT and O_EXCL are set, error out if the node already exists 31951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((flags & 128)) { 31961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EEXIST); 31971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 31981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 31991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // node doesn't exist, try to create it 32001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = FS.mknod(path, mode, 0); 32011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!node) { 32041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOENT); 32051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // can't truncate a device 32071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isChrdev(node.mode)) { 32081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flags &= ~512; 32091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // check permissions 32111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.mayOpen(node, flags); 32121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 32131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 32141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // do truncation if necessary 32161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((flags & 512)) { 32171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.truncate(node, 0); 32181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we've already handled these, don't pass down to the underlying vfs 32201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flags &= ~(128 | 512); 32211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 32221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // register the stream with the filesystem 32231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.createStream({ 32241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node: node, 32251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path: FS.getPath(node), // we want the absolute path to the node 32261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flags: flags, 32271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch seekable: true, 32281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch position: 0, 32291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream_ops: node.stream_ops, 32301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // used by the file family libc calls (fopen, fwrite, ferror, etc.) 32311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ungotten: [], 32321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch error: false 32331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, fd_start, fd_end); 32341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // call the new stream's open function 32351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (stream.stream_ops.open) { 32361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.stream_ops.open(stream); 32371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['logReadFiles'] && !(flags & 1)) { 32391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.readFiles) FS.readFiles = {}; 32401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(path in FS.readFiles)) { 32411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.readFiles[path] = 1; 32421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['printErr']('read file: ' + path); 32431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stream; 32461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },close:function (stream) { 32471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 32481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (stream.stream_ops.close) { 32491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.stream_ops.close(stream); 32501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 32521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw e; 32531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } finally { 32541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.closeStream(stream.fd); 32551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },llseek:function (stream, offset, whence) { 32571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream.seekable || !stream.stream_ops.llseek) { 32581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); 32591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stream.stream_ops.llseek(stream, offset, whence); 32611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },read:function (stream, buffer, offset, length, position) { 32621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (length < 0 || position < 0) { 32631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 32641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((stream.flags & 2097155) === 1) { 32661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBADF); 32671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(stream.node.mode)) { 32691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EISDIR); 32701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream.stream_ops.read) { 32721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 32731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var seeking = true; 32751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof position === 'undefined') { 32761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch position = stream.position; 32771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch seeking = false; 32781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (!stream.seekable) { 32791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); 32801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); 32821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!seeking) stream.position += bytesRead; 32831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return bytesRead; 32841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },write:function (stream, buffer, offset, length, position, canOwn) { 32851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (length < 0 || position < 0) { 32861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 32871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((stream.flags & 2097155) === 0) { 32891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBADF); 32901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.isDir(stream.node.mode)) { 32921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EISDIR); 32931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream.stream_ops.write) { 32951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 32961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 32971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var seeking = true; 32981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof position === 'undefined') { 32991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch position = stream.position; 33001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch seeking = false; 33011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (!stream.seekable) { 33021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); 33031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (stream.flags & 1024) { 33051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // seek to the end before writing in append mode 33061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.llseek(stream, 0, 2); 33071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); 33091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!seeking) stream.position += bytesWritten; 33101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return bytesWritten; 33111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },allocate:function (stream, offset, length) { 33121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (offset < 0 || length <= 0) { 33131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 33141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((stream.flags & 2097155) === 0) { 33161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EBADF); 33171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) { 33191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENODEV); 33201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream.stream_ops.allocate) { 33221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); 33231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.stream_ops.allocate(stream, offset, length); 33251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mmap:function (stream, buffer, offset, length, position, prot, flags) { 33261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO if PROT is PROT_WRITE, make sure we have write access 33271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((stream.flags & 2097155) === 1) { 33281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EACCES); 33291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream.stream_ops.mmap) { 33311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENODEV); 33321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags); 33341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },ioctl:function (stream, cmd, arg) { 33351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream.stream_ops.ioctl) { 33361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTTY); 33371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stream.stream_ops.ioctl(stream, cmd, arg); 33391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },readFile:function (path, opts) { 33401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts = opts || {}; 33411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts.flags = opts.flags || 'r'; 33421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts.encoding = opts.encoding || 'binary'; 33431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { 33441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new Error('Invalid encoding type "' + opts.encoding + '"'); 33451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret; 33471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.open(path, opts.flags); 33481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stat = FS.stat(path); 33491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var length = stat.size; 33501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var buf = new Uint8Array(length); 33511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.read(stream, buf, 0, length, 0); 33521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (opts.encoding === 'utf8') { 33531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = ''; 33541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var utf8 = new Runtime.UTF8Processor(); 33551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < length; i++) { 33561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret += utf8.processCChar(buf[i]); 33571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (opts.encoding === 'binary') { 33591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = buf; 33601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.close(stream); 33621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 33631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },writeFile:function (path, data, opts) { 33641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts = opts || {}; 33651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts.flags = opts.flags || 'w'; 33661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch opts.encoding = opts.encoding || 'utf8'; 33671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { 33681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new Error('Invalid encoding type "' + opts.encoding + '"'); 33691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.open(path, opts.flags, opts.mode); 33711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (opts.encoding === 'utf8') { 33721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var utf8 = new Runtime.UTF8Processor(); 33731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var buf = new Uint8Array(utf8.processJSString(data)); 33741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.write(stream, buf, 0, buf.length, 0, opts.canOwn); 33751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (opts.encoding === 'binary') { 33761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.write(stream, data, 0, data.length, 0, opts.canOwn); 33771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.close(stream); 33791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },cwd:function () { 33801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.currentPath; 33811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },chdir:function (path) { 33821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { follow: true }); 33831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.isDir(lookup.node.mode)) { 33841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); 33851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var err = FS.nodePermissions(lookup.node, 'x'); 33871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (err) { 33881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(err); 33891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 33901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.currentPath = lookup.path; 33911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createDefaultDirectories:function () { 33921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdir('/tmp'); 33931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createDefaultDevices:function () { 33941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create /dev 33951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdir('/dev'); 33961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // setup /dev/null 33971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.registerDevice(FS.makedev(1, 3), { 33981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch read: function() { return 0; }, 33991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch write: function() { return 0; } 34001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 34011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdev('/dev/null', FS.makedev(1, 3)); 34021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // setup /dev/tty and /dev/tty1 34031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // stderr needs to print output using Module['printErr'] 34041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // so we register a second tty just for it. 34051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); 34061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); 34071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdev('/dev/tty', FS.makedev(5, 0)); 34081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdev('/dev/tty1', FS.makedev(6, 0)); 34091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we're not going to emulate the actual shm device, 34101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // just create the tmp dirs that reside in it commonly 34111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdir('/dev/shm'); 34121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdir('/dev/shm/tmp'); 34131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createStandardStreams:function () { 34141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO deprecate the old functionality of a single 34151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // input / output callback and that utilizes FS.createDevice 34161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // and instead require a unique set of stream ops 34171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // by default, we symlink the standard streams to the 34191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // default tty devices. however, if the standard streams 34201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // have been overwritten we create a unique device for 34211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // them instead. 34221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['stdin']) { 34231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.createDevice('/dev', 'stdin', Module['stdin']); 34241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 34251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.symlink('/dev/tty', '/dev/stdin'); 34261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 34271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['stdout']) { 34281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.createDevice('/dev', 'stdout', null, Module['stdout']); 34291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 34301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.symlink('/dev/tty', '/dev/stdout'); 34311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 34321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['stderr']) { 34331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.createDevice('/dev', 'stderr', null, Module['stderr']); 34341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 34351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.symlink('/dev/tty1', '/dev/stderr'); 34361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 34371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // open default streams for the stdin, stdout and stderr devices 34391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stdin = FS.open('/dev/stdin', 'r'); 34401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin); 34411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); 34421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stdout = FS.open('/dev/stdout', 'w'); 34441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout); 34451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); 34461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stderr = FS.open('/dev/stderr', 'w'); 34481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr); 34491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); 34501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },ensureErrnoError:function () { 34511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.ErrnoError) return; 34521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.ErrnoError = function ErrnoError(errno) { 34531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.errno = errno; 34541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var key in ERRNO_CODES) { 34551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ERRNO_CODES[key] === errno) { 34561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.code = key; 34571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 34581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 34591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 34601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.message = ERRNO_MESSAGES[errno]; 34611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 34621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.ErrnoError.prototype = new Error(); 34631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.ErrnoError.prototype.constructor = FS.ErrnoError; 34641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) 34651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch [ERRNO_CODES.ENOENT].forEach(function(code) { 34661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.genericErrors[code] = new FS.ErrnoError(code); 34671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.genericErrors[code].stack = '<generic error, no stack>'; 34681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 34691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },staticInit:function () { 34701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.ensureErrnoError(); 34711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.nameTable = new Array(4096); 34731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mount(MEMFS, {}, '/'); 34751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.createDefaultDirectories(); 34771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.createDefaultDevices(); 34781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },init:function (input, output, error) { 34791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 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)'); 34801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.init.initialized = true; 34811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.ensureErrnoError(); 34831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here 34851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['stdin'] = input || Module['stdin']; 34861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['stdout'] = output || Module['stdout']; 34871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['stderr'] = error || Module['stderr']; 34881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 34891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.createStandardStreams(); 34901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },quit:function () { 34911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.init.initialized = false; 34921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < FS.streams.length; i++) { 34931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.streams[i]; 34941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream) { 34951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 34961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 34971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.close(stream); 34981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 34991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getMode:function (canRead, canWrite) { 35001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mode = 0; 35011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (canRead) mode |= 292 | 73; 35021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (canWrite) mode |= 146; 35031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return mode; 35041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },joinPath:function (parts, forceRelative) { 35051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = PATH.join.apply(null, parts); 35061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (forceRelative && path[0] == '/') path = path.substr(1); 35071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return path; 35081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },absolutePath:function (relative, base) { 35091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return PATH.resolve(base, relative); 35101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },standardizePath:function (path) { 35111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return PATH.normalize(path); 35121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },findObject:function (path, dontResolveLastLink) { 35131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = FS.analyzePath(path, dontResolveLastLink); 35141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ret.exists) { 35151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret.object; 35161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 35171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ___setErrNo(ret.error); 35181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return null; 35191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 35201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },analyzePath:function (path, dontResolveLastLink) { 35211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // operate from within the context of the symlink's target 35221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 35231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); 35241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path = lookup.path; 35251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 35261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 35271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = { 35281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isRoot: false, exists: false, error: 0, name: null, path: null, object: null, 35291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parentExists: false, parentPath: null, parentObject: null 35301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 35311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 35321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lookup = FS.lookupPath(path, { parent: true }); 35331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.parentExists = true; 35341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.parentPath = lookup.path; 35351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.parentObject = lookup.node; 35361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.name = PATH.basename(path); 35371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); 35381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.exists = true; 35391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.path = lookup.path; 35401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.object = lookup.node; 35411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.name = lookup.node.name; 35421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.isRoot = lookup.path === '/'; 35431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 35441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.error = e.errno; 35451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 35461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 35471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createFolder:function (parent, name, canRead, canWrite) { 35481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); 35491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mode = FS.getMode(canRead, canWrite); 35501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.mkdir(path, mode); 35511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createPath:function (parent, path, canRead, canWrite) { 35521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parent = typeof parent === 'string' ? parent : FS.getPath(parent); 35531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parts = path.split('/').reverse(); 35541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (parts.length) { 35551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var part = parts.pop(); 35561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!part) continue; 35571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var current = PATH.join2(parent, part); 35581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 35591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.mkdir(current); 35601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 35611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // ignore EEXIST 35621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 35631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parent = current; 35641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 35651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return current; 35661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createFile:function (parent, name, properties, canRead, canWrite) { 35671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); 35681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mode = FS.getMode(canRead, canWrite); 35691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.create(path, mode); 35701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) { 35711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; 35721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mode = FS.getMode(canRead, canWrite); 35731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.create(path, mode); 35741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (data) { 35751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof data === 'string') { 35761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var arr = new Array(data.length); 35771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); 35781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch data = arr; 35791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 35801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // make sure we can write to the file 35811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.chmod(node, mode | 146); 35821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.open(node, 'w'); 35831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.write(stream, data, 0, data.length, 0, canOwn); 35841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.close(stream); 35851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.chmod(node, mode); 35861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 35871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node; 35881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createDevice:function (parent, name, input, output) { 35891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); 35901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mode = FS.getMode(!!input, !!output); 35911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.createDevice.major) FS.createDevice.major = 64; 35921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var dev = FS.makedev(FS.createDevice.major++, 0); 35931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Create a fake device that a set of stream ops to emulate 35941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // the old behavior. 35951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.registerDevice(dev, { 35961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch open: function(stream) { 35971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.seekable = false; 35981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 35991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch close: function(stream) { 36001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // flush any pending line data 36011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (output && output.buffer && output.buffer.length) { 36021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch output(10); 36031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 36051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch read: function(stream, buffer, offset, length, pos /* ignored */) { 36061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytesRead = 0; 36071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < length; i++) { 36081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var result; 36091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 36101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch result = input(); 36111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 36121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EIO); 36131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (result === undefined && bytesRead === 0) { 36151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 36161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (result === null || result === undefined) break; 36181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch bytesRead++; 36191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer[offset+i] = result; 36201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (bytesRead) { 36221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.node.timestamp = Date.now(); 36231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return bytesRead; 36251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 36261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch write: function(stream, buffer, offset, length, pos) { 36271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < length; i++) { 36281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 36291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch output(buffer[offset+i]); 36301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 36311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EIO); 36321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (length) { 36351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream.node.timestamp = Date.now(); 36361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i; 36381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 36401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.mkdev(path, mode, dev); 36411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createLink:function (parent, name, target, canRead, canWrite) { 36421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); 36431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.symlink(target, path); 36441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },forceLoadFile:function (obj) { 36451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; 36461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var success = true; 36471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof XMLHttpRequest !== 'undefined') { 36481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 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."); 36491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (Module['read']) { 36501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Command-line. 36511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 36521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as 36531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // read() will try to parse UTF8. 36541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch obj.contents = intArrayFromString(Module['read'](obj.url), true); 36551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 36561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch success = false; 36571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 36591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new Error('Cannot load without read() or XMLHttpRequest.'); 36601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!success) ___setErrNo(ERRNO_CODES.EIO); 36621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return success; 36631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createLazyFile:function (parent, name, url, canRead, canWrite) { 36641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. 36651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function LazyUint8Array() { 36661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.lengthKnown = false; 36671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.chunks = []; // Loaded chunks. Index is the chunk number 36681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { 36701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (idx > this.length-1 || idx < 0) { 36711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return undefined; 36721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var chunkOffset = idx % this.chunkSize; 36741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var chunkNum = Math.floor(idx / this.chunkSize); 36751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return this.getter(chunkNum)[chunkOffset]; 36761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { 36781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.getter = getter; 36791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 36801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { 36811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Find length 36821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var xhr = new XMLHttpRequest(); 36831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.open('HEAD', url, false); 36841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.send(null); 36851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); 36861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var datalength = Number(xhr.getResponseHeader("Content-length")); 36871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var header; 36881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; 36891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var chunkSize = 1024*1024; // Chunk size in bytes 36901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 36911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!hasByteServing) chunkSize = datalength; 36921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 36931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Function to get a range from the remote URL. 36941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var doXHR = (function(from, to) { 36951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); 36961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); 36971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 36981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. 36991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var xhr = new XMLHttpRequest(); 37001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.open('GET', url, false); 37011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); 37021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 37031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Some hints to the browser that we want binary data. 37041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; 37051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (xhr.overrideMimeType) { 37061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.overrideMimeType('text/plain; charset=x-user-defined'); 37071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 37091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.send(null); 37101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); 37111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (xhr.response !== undefined) { 37121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return new Uint8Array(xhr.response || []); 37131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 37141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return intArrayFromString(xhr.responseText || '', true); 37151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 37171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lazyArray = this; 37181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch lazyArray.setDataGetter(function(chunkNum) { 37191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var start = chunkNum * chunkSize; 37201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var end = (chunkNum+1) * chunkSize - 1; // including this byte 37211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block 37221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { 37231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch lazyArray.chunks[chunkNum] = doXHR(start, end); 37241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); 37261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return lazyArray.chunks[chunkNum]; 37271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 37281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 37291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this._length = datalength; 37301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this._chunkSize = chunkSize; 37311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.lengthKnown = true; 37321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof XMLHttpRequest !== 'undefined') { 37341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; 37351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var lazyArray = new LazyUint8Array(); 37361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.defineProperty(lazyArray, "length", { 37371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { 37381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if(!this.lengthKnown) { 37391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.cacheLength(); 37401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return this._length; 37421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 37441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.defineProperty(lazyArray, "chunkSize", { 37451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch get: function() { 37461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if(!this.lengthKnown) { 37471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.cacheLength(); 37481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return this._chunkSize; 37501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 37521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 37531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var properties = { isDevice: false, contents: lazyArray }; 37541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 37551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var properties = { isDevice: false, url: url }; 37561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 37581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.createFile(parent, name, properties, canRead, canWrite); 37591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // This is a total hack, but I want to get this lazy file code out of the 37601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // core of MEMFS. If we want to keep this lazy file concept I feel it should 37611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // be its own thin LAZYFS proxying calls to MEMFS. 37621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (properties.contents) { 37631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contents = properties.contents; 37641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (properties.url) { 37651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.contents = null; 37661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.url = properties.url; 37671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // override each stream op with one that tries to force load the lazy file first 37691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream_ops = {}; 37701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var keys = Object.keys(node.stream_ops); 37711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch keys.forEach(function(key) { 37721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var fn = node.stream_ops[key]; 37731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream_ops[key] = function forceLoadLazyFile() { 37741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.forceLoadFile(node)) { 37751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EIO); 37761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return fn.apply(null, arguments); 37781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 37791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 37801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // use a custom read function 37811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { 37821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!FS.forceLoadFile(node)) { 37831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EIO); 37841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contents = stream.node.contents; 37861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (position >= contents.length) 37871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 37881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var size = Math.min(contents.length - position, length); 37891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(size >= 0); 37901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (contents.slice) { // normal array 37911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < size; i++) { 37921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer[offset + i] = contents[position + i]; 37931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 37951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR 37961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer[offset + i] = contents.get(position + i); 37971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 37991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return size; 38001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 38011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.stream_ops = stream_ops; 38021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return node; 38031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) { 38041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.init(); 38051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO we should allow people to just pass in a complete filename instead 38061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // of parent and name being that we just join them anyways 38071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent; 38081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function processData(byteArray) { 38091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function finish(byteArray) { 38101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!dontCreateFile) { 38111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); 38121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (onload) onload(); 38141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch removeRunDependency('cp ' + fullname); 38151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var handled = false; 38171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['preloadPlugins'].forEach(function(plugin) { 38181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (handled) return; 38191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (plugin['canHandle'](fullname)) { 38201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch plugin['handle'](byteArray, fullname, finish, function() { 38211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (onerror) onerror(); 38221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch removeRunDependency('cp ' + fullname); 38231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 38241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch handled = true; 38251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 38271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!handled) finish(byteArray); 38281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addRunDependency('cp ' + fullname); 38301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof url == 'string') { 38311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.asyncLoad(url, function(byteArray) { 38321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch processData(byteArray); 38331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, onerror); 38341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 38351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch processData(url); 38361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },indexedDB:function () { 38381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; 38391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },DB_NAME:function () { 38401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 'EM_FS_' + window.location.pathname; 38411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) { 38421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onload = onload || function(){}; 38431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onerror = onerror || function(){}; 38441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var indexedDB = FS.indexedDB(); 38451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 38461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); 38471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 38481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return onerror(e); 38491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { 38511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch console.log('creating db'); 38521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var db = openRequest.result; 38531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch db.createObjectStore(FS.DB_STORE_NAME); 38541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 38551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch openRequest.onsuccess = function openRequest_onsuccess() { 38561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var db = openRequest.result; 38571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); 38581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var files = transaction.objectStore(FS.DB_STORE_NAME); 38591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ok = 0, fail = 0, total = paths.length; 38601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function finish() { 38611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (fail == 0) onload(); else onerror(); 38621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch paths.forEach(function(path) { 38641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var putRequest = files.put(FS.analyzePath(path).object.contents, path); 38651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; 38661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; 38671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 38681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch transaction.onerror = onerror; 38691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 38701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch openRequest.onerror = onerror; 38711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },loadFilesFromDB:function (paths, onload, onerror) { 38721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onload = onload || function(){}; 38731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onerror = onerror || function(){}; 38741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var indexedDB = FS.indexedDB(); 38751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 38761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); 38771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 38781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return onerror(e); 38791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch openRequest.onupgradeneeded = onerror; // no database to load from 38811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch openRequest.onsuccess = function openRequest_onsuccess() { 38821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var db = openRequest.result; 38831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 38841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); 38851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch(e) { 38861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onerror(e); 38871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 38881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var files = transaction.objectStore(FS.DB_STORE_NAME); 38901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ok = 0, fail = 0, total = paths.length; 38911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function finish() { 38921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (fail == 0) onload(); else onerror(); 38931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 38941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch paths.forEach(function(path) { 38951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var getRequest = files.get(path); 38961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getRequest.onsuccess = function getRequest_onsuccess() { 38971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (FS.analyzePath(path).exists) { 38981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.unlink(path); 38991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 39001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); 39011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ok++; 39021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ok + fail == total) finish(); 39031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 39041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; 39051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 39061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch transaction.onerror = onerror; 39071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 39081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch openRequest.onerror = onerror; 39091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }}; 39101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) { 39151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); 39161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createSocket:function (family, type, protocol) { 39171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var streaming = type == 1; 39181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (protocol) { 39191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp 39201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 39211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create our internal socket structure 39231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var sock = { 39241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch family: family, 39251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type: type, 39261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch protocol: protocol, 39271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch server: null, 39281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peers: {}, 39291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch pending: [], 39301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch recv_queue: [], 39311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock_ops: SOCKFS.websocket_sock_ops 39321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 39331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create the filesystem node to store the socket structure 39351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var name = SOCKFS.nextname(); 39361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var node = FS.createNode(SOCKFS.root, name, 49152, 0); 39371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node.sock = sock; 39381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // and the wrapping stream that enables library functions such 39401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // as read and write to indirectly interact with the socket 39411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.createStream({ 39421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch path: name, 39431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node: node, 39441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flags: FS.modeStringToFlags('r+'), 39451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch seekable: false, 39461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream_ops: SOCKFS.stream_ops 39471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 39481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // map the new stream to the socket structure (sockets have a 1:1 39501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // relationship with a stream) 39511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.stream = stream; 39521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return sock; 39541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getSocket:function (fd) { 39551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.getStream(fd); 39561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream || !FS.isSocket(stream.node.mode)) { 39571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return null; 39581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 39591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stream.node.sock; 39601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },stream_ops:{poll:function (stream) { 39611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var sock = stream.node.sock; 39621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return sock.sock_ops.poll(sock); 39631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },ioctl:function (stream, request, varargs) { 39641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var sock = stream.node.sock; 39651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return sock.sock_ops.ioctl(sock, request, varargs); 39661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },read:function (stream, buffer, offset, length, position /* ignored */) { 39671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var sock = stream.node.sock; 39681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var msg = sock.sock_ops.recvmsg(sock, length); 39691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!msg) { 39701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // socket is closed 39711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 39721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 39731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer.set(msg.buffer, offset); 39741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return msg.buffer.length; 39751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },write:function (stream, buffer, offset, length, position /* ignored */) { 39761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var sock = stream.node.sock; 39771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return sock.sock_ops.sendmsg(sock, buffer, offset, length); 39781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },close:function (stream) { 39791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var sock = stream.node.sock; 39801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.sock_ops.close(sock); 39811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }},nextname:function () { 39821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!SOCKFS.nextname.current) { 39831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch SOCKFS.nextname.current = 0; 39841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 39851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 'socket[' + (SOCKFS.nextname.current++) + ']'; 39861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },websocket_sock_ops:{createPeer:function (sock, addr, port) { 39871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ws; 39881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof addr === 'object') { 39901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ws = addr; 39911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr = null; 39921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port = null; 39931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 39941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 39951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ws) { 39961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // for sockets that've already connected (e.g. we're the server) 39971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we can inspect the _socket property for the address 39981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ws._socket) { 39991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr = ws._socket.remoteAddress; 40001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port = ws._socket.remotePort; 40011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we're just now initializing a connection to the remote, 40031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // inspect the url property 40041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch else { 40051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); 40061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!result) { 40071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new Error('WebSocket URL must be in the format ws(s)://address:port'); 40081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr = result[1]; 40101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port = parseInt(result[2], 10); 40111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 40131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create the actual websocket object and connect 40141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 40151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // runtimeConfig gets set to true if WebSocket runtime configuration is available. 40161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var runtimeConfig = (Module['websocket'] && ('object' === typeof Module['websocket'])); 40171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // The default value is 'ws://' the replace is needed because the compiler replaces "//" comments with '#' 40191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // comments without checking context, so we'd end up with ws:#, the replace swaps the "#" for "//" again. 40201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var url = 'ws:#'.replace('#', '//'); 40211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (runtimeConfig) { 40231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ('string' === typeof Module['websocket']['url']) { 40241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch url = Module['websocket']['url']; // Fetch runtime WebSocket URL config. 40251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it. 40291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch url = url + addr + ':' + port; 40301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set. 40331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var subProtocols = 'binary'; // The default value is 'binary' 40341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (runtimeConfig) { 40361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ('string' === typeof Module['websocket']['subprotocol']) { 40371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch subProtocols = Module['websocket']['subprotocol']; // Fetch runtime WebSocket subprotocol config. 40381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // The regex trims the string (removes spaces at the beginning and end, then splits the string by 40421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // <any space>,<any space> into an Array. Whitespace removal is important for Websockify and ws. 40431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */); 40441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // The node ws library API for specifying optional subprotocol is slightly different than the browser's. 40461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var opts = ENVIRONMENT_IS_NODE ? {'protocol': subProtocols.toString()} : subProtocols; 40471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // If node we use the ws library. 40491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket']; 40501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ws = new WebSocket(url, opts); 40511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ws.binaryType = 'arraybuffer'; 40521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 40531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH); 40541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var peer = { 40591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr: addr, 40601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port: port, 40611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch socket: ws, 40621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dgram_send_queue: [] 40631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 40641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch SOCKFS.websocket_sock_ops.addPeer(sock, peer); 40661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); 40671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if this is a bound dgram socket, send the port number first to allow 40691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // us to override the ephemeral port reported to us by remotePort on the 40701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // remote end. 40711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 2 && typeof sock.sport !== 'undefined') { 40721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.dgram_send_queue.push(new Uint8Array([ 40731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 255, 255, 255, 255, 40741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0), 40751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff) 40761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ])); 40771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return peer; 40801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getPeer:function (sock, addr, port) { 40811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return sock.peers[addr + ':' + port]; 40821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },addPeer:function (sock, peer) { 40831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.peers[peer.addr + ':' + peer.port] = peer; 40841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },removePeer:function (sock, peer) { 40851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch delete sock.peers[peer.addr + ':' + peer.port]; 40861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },handlePeerEvents:function (sock, peer) { 40871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var first = true; 40881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 40891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var handleOpen = function () { 40901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 40911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var queued = peer.dgram_send_queue.shift(); 40921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (queued) { 40931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.socket.send(queued); 40941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch queued = peer.dgram_send_queue.shift(); 40951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 40961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 40971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // not much we can do here in the way of proper error handling as we've already 40981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // lied and said this data was sent. shut it down. 40991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.socket.close(); 41001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 41021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function handleMessage(data) { 41041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(typeof data !== 'string' && data.byteLength !== undefined); // must receive an ArrayBuffer 41051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch data = new Uint8Array(data); // make a typed array view on the array buffer 41061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if this is the port message, override the peer's port with it 41091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var wasfirst = first; 41101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch first = false; 41111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (wasfirst && 41121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch data.length === 10 && 41131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && 41141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) { 41151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // update the peer's port and it's key in the peer map 41161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var newport = ((data[8] << 8) | data[9]); 41171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch SOCKFS.websocket_sock_ops.removePeer(sock, peer); 41181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.port = newport; 41191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch SOCKFS.websocket_sock_ops.addPeer(sock, peer); 41201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 41211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data }); 41241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 41251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ENVIRONMENT_IS_NODE) { 41271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.socket.on('open', handleOpen); 41281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.socket.on('message', function(data, flags) { 41291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!flags.binary) { 41301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 41311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch handleMessage((new Uint8Array(data)).buffer); // copy from node Buffer -> ArrayBuffer 41331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 41341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.socket.on('error', function() { 41351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // don't throw 41361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 41371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 41381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.socket.onopen = handleOpen; 41391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.socket.onmessage = function peer_socket_onmessage(event) { 41401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch handleMessage(event.data); 41411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 41421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },poll:function (sock) { 41441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 1 && sock.server) { 41451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // listen sockets should only say they're available for reading 41461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if there are pending clients. 41471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return sock.pending.length ? (64 | 1) : 0; 41481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var mask = 0; 41511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var dest = sock.type === 1 ? // we only care about the socket state for connection-based sockets 41521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : 41531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch null; 41541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.recv_queue.length || 41561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch !dest || // connection-less sockets are always ready to read 41571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (dest && dest.socket.readyState === dest.socket.CLOSING) || 41581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (dest && dest.socket.readyState === dest.socket.CLOSED)) { // let recv return 0 once closed 41591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mask |= (64 | 1); 41601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!dest || // connection-less sockets are always ready to write 41631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (dest && dest.socket.readyState === dest.socket.OPEN)) { 41641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mask |= 4; 41651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((dest && dest.socket.readyState === dest.socket.CLOSING) || 41681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (dest && dest.socket.readyState === dest.socket.CLOSED)) { 41691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch mask |= 16; 41701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 41721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return mask; 41731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },ioctl:function (sock, request, arg) { 41741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch (request) { 41751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 21531: 41761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytes = 0; 41771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.recv_queue.length) { 41781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch bytes = sock.recv_queue[0].data.length; 41791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((arg)>>2)]=bytes; 41811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 41821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: 41831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ERRNO_CODES.EINVAL; 41841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },close:function (sock) { 41861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we've spawned a listen server, close it 41871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.server) { 41881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 41891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server.close(); 41901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 41911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server = null; 41931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 41941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // close any peer connections 41951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var peers = Object.keys(sock.peers); 41961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < peers.length; i++) { 41971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var peer = sock.peers[peers[i]]; 41981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 41991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch peer.socket.close(); 42001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 42011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch SOCKFS.websocket_sock_ops.removePeer(sock, peer); 42031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 42051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },bind:function (sock, addr, port) { 42061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') { 42071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already bound 42081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.saddr = addr; 42101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.sport = port || _mkport(); 42111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // in order to emulate dgram sockets, we need to launch a listen server when 42121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // binding on a connection-less socket 42131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // note: this is only required on the server side 42141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 2) { 42151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // close the existing server if it exists 42161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.server) { 42171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server.close(); 42181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server = null; 42191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // swallow error operation not supported error that occurs when binding in the 42211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // browser where this isn't supported 42221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 42231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.sock_ops.listen(sock, 0); 42241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 42251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(e instanceof FS.ErrnoError)) throw e; 42261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e; 42271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },connect:function (sock, addr, port) { 42301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.server) { 42311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP); 42321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 42341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO autobind 42351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if (!sock.addr && sock.type == 2) { 42361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // } 42371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 42381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // early out if we're already connected / in the middle of connecting 42391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') { 42401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); 42411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (dest) { 42421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (dest.socket.readyState === dest.socket.CONNECTING) { 42431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EALREADY); 42441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 42451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EISCONN); 42461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 42501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // add the socket to our peer list and set our 42511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // destination address / port to match 42521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); 42531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.daddr = peer.addr; 42541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.dport = peer.port; 42551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 42561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // always "fail" in non-blocking mode 42571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS); 42581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },listen:function (sock, backlog) { 42591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ENVIRONMENT_IS_NODE) { 42601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); 42611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.server) { 42631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already listening 42641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var WebSocketServer = require('ws').Server; 42661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var host = sock.saddr; 42671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server = new WebSocketServer({ 42681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch host: host, 42691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port: sock.sport 42701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO support backlog 42711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 42721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 42731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server.on('connection', function(ws) { 42741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 1) { 42751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); 42761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 42771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create a peer on the new socket 42781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); 42791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch newsock.daddr = peer.addr; 42801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch newsock.dport = peer.port; 42811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 42821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // push to queue for accept to pick up 42831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.pending.push(newsock); 42841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 42851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create a peer on the listen socket so calling sendto 42861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // with the listen socket and an address will resolve 42871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // to the correct client 42881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch SOCKFS.websocket_sock_ops.createPeer(sock, ws); 42891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 42901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 42911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server.on('closed', function() { 42921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server = null; 42931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 42941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.server.on('error', function() { 42951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // don't throw 42961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 42971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },accept:function (listensock) { 42981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!listensock.server) { 42991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 43001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var newsock = listensock.pending.shift(); 43021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch newsock.stream.flags = listensock.stream.flags; 43031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return newsock; 43041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getname:function (sock, peer) { 43051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var addr, port; 43061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (peer) { 43071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.daddr === undefined || sock.dport === undefined) { 43081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); 43091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr = sock.daddr; 43111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port = sock.dport; 43121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 43131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO saddr and sport will be set for bind()'d UDP sockets, but what 43141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // should we be returning for TCP sockets that've been connect()'d? 43151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr = sock.saddr || 0; 43161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port = sock.sport || 0; 43171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return { addr: addr, port: port }; 43191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },sendmsg:function (sock, buffer, offset, length, addr, port) { 43201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 2) { 43211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // connection-less sockets will honor the message address, 43221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // and otherwise fall back to the bound destination address 43231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (addr === undefined || port === undefined) { 43241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr = sock.daddr; 43251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port = sock.dport; 43261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if there was no address to fall back to, error out 43281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (addr === undefined || port === undefined) { 43291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ); 43301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 43321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // connection-based sockets will only use the bound 43331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr = sock.daddr; 43341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port = sock.dport; 43351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 43371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // find the peer for the destination address 43381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); 43391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 43401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // early out if not connected with a connection-based socket 43411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 1) { 43421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { 43431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); 43441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (dest.socket.readyState === dest.socket.CONNECTING) { 43451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 43461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 43491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create a copy of the incoming data to send, as the WebSocket API 43501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // doesn't work entirely with an ArrayBufferView, it'll just send 43511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // the entire underlying buffer 43521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var data; 43531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (buffer instanceof Array || buffer instanceof ArrayBuffer) { 43541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch data = buffer.slice(offset, offset + length); 43551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { // ArrayBufferView 43561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length); 43571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 43591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we're emulating a connection-less dgram socket and don't have 43601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // a cached connection, queue the buffer to send upon connect and 43611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // lie, saying the data was sent now. 43621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 2) { 43631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!dest || dest.socket.readyState !== dest.socket.OPEN) { 43641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we're not connected, open a new connection 43651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { 43661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); 43671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dest.dgram_send_queue.push(data); 43691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return length; 43701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 43731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 43741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // send the actual data 43751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch dest.socket.send(data); 43761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return length; 43771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 43781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 43791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },recvmsg:function (sock, length) { 43811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html 43821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 1 && sock.server) { 43831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // tcp servers should not be recv()'ing on the listen socket 43841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); 43851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 43871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var queued = sock.recv_queue.shift(); 43881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!queued) { 43891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 1) { 43901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); 43911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 43921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!dest) { 43931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we have a destination address but are not connected, error out 43941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); 43951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 43961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { 43971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // return null if the socket has closed 43981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return null; 43991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch else { 44011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // else, our socket is in a valid state but truly has nothing available 44021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 44031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 44051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 44061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // queued.data will be an ArrayBuffer if it's unadulterated, but if it's 44101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // requeued TCP data it'll be an ArrayBufferView 44111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var queuedLength = queued.data.byteLength || queued.data.length; 44121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var queuedOffset = queued.data.byteOffset || 0; 44131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var queuedBuffer = queued.data.buffer || queued.data; 44141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytesRead = Math.min(length, queuedLength); 44151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var res = { 44161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), 44171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addr: queued.addr, 44181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch port: queued.port 44191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 44201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // push back any unread data for TCP connections 44231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (sock.type === 1 && bytesRead < queuedLength) { 44241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytesRemaining = queuedLength - bytesRead; 44251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); 44261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch sock.recv_queue.unshift(queued); 44271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return res; 44301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }}};function _send(fd, buf, len, flags) { 44311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var sock = SOCKFS.getSocket(fd); 44321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!sock) { 44331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ___setErrNo(ERRNO_CODES.EBADF); 44341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return -1; 44351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO honor flags 44371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return _write(fd, buf, len); 44381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _pwrite(fildes, buf, nbyte, offset) { 44411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset); 44421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html 44431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.getStream(fildes); 44441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream) { 44451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ___setErrNo(ERRNO_CODES.EBADF); 44461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return -1; 44471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 44491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var slab = HEAP8; 44501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.write(stream, slab, buf, nbyte, offset); 44511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 44521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.handleFSError(e); 44531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return -1; 44541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }function _write(fildes, buf, nbyte) { 44561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // ssize_t write(int fildes, const void *buf, size_t nbyte); 44571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html 44581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stream = FS.getStream(fildes); 44591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream) { 44601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ___setErrNo(ERRNO_CODES.EBADF); 44611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return -1; 44621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 44661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var slab = HEAP8; 44671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return FS.write(stream, slab, buf, nbyte); 44681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 44691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch FS.handleFSError(e); 44701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return -1; 44711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _fileno(stream) { 44751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // int fileno(FILE *stream); 44761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html 44771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch stream = FS.getStreamFromPtr(stream); 44781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!stream) return -1; 44791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return stream.fd; 44801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }function _fwrite(ptr, size, nitems, stream) { 44811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream); 44821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html 44831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytesToWrite = nitems * size; 44841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (bytesToWrite == 0) return 0; 44851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var fd = _fileno(stream); 44861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bytesWritten = _write(fd, ptr, bytesToWrite); 44871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (bytesWritten == -1) { 44881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var streamObj = FS.getStreamFromPtr(stream); 44891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (streamObj) streamObj.error = true; 44901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 44911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 44921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Math.floor(bytesWritten / size); 44931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 44981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["_strlen"] = _strlen; 44991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 45001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function __reallyNegative(x) { 45011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return x < 0 || (x === 0 && (1/x) === -Infinity); 45021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }function __formatString(format, varargs) { 45031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var textIndex = format; 45041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var argIndex = 0; 45051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function getNextArg(type) { 45061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // NOTE: Explicitly ignoring type safety. Otherwise this fails: 45071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // int x = 4; printf("%c\n", (char)x); 45081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret; 45091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (type === 'double') { 45101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = HEAPF64[(((varargs)+(argIndex))>>3)]; 45111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (type == 'i64') { 45121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = [HEAP32[(((varargs)+(argIndex))>>2)], 45131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[(((varargs)+(argIndex+4))>>2)]]; 45141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 45151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 45161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch type = 'i32'; // varargs are always i32, i64, or double 45171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = HEAP32[(((varargs)+(argIndex))>>2)]; 45181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argIndex += Runtime.getNativeFieldSize(type); 45201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 45211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 45231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = []; 45241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var curr, next, currArg; 45251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while(1) { 45261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var startTextIndex = textIndex; 45271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch curr = HEAP8[(textIndex)]; 45281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (curr === 0) break; 45291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = HEAP8[((textIndex+1)|0)]; 45301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (curr == 37) { 45311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Handle flags. 45321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var flagAlwaysSigned = false; 45331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var flagLeftAlign = false; 45341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var flagAlternative = false; 45351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var flagZeroPad = false; 45361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var flagPadSign = false; 45371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flagsLoop: while (1) { 45381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch (next) { 45391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 43: 45401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flagAlwaysSigned = true; 45411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 45421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 45: 45431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flagLeftAlign = true; 45441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 45451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 35: 45461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flagAlternative = true; 45471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 45481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 48: 45491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagZeroPad) { 45501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break flagsLoop; 45511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 45521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flagZeroPad = true; 45531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 45541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 32: 45561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flagPadSign = true; 45571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 45581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: 45591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break flagsLoop; 45601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex++; 45621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = HEAP8[((textIndex+1)|0)]; 45631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 45651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Handle width. 45661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var width = 0; 45671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next == 42) { 45681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch width = getNextArg('i32'); 45691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex++; 45701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = HEAP8[((textIndex+1)|0)]; 45711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 45721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (next >= 48 && next <= 57) { 45731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch width = width * 10 + (next - 48); 45741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex++; 45751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = HEAP8[((textIndex+1)|0)]; 45761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 45791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Handle precision. 45801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var precisionSet = false, precision = -1; 45811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next == 46) { 45821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precision = 0; 45831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precisionSet = true; 45841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex++; 45851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = HEAP8[((textIndex+1)|0)]; 45861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next == 42) { 45871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precision = getNextArg('i32'); 45881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex++; 45891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 45901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while(1) { 45911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var precisionChr = HEAP8[((textIndex+1)|0)]; 45921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (precisionChr < 48 || 45931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precisionChr > 57) break; 45941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precision = precision * 10 + (precisionChr - 48); 45951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex++; 45961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 45981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = HEAP8[((textIndex+1)|0)]; 45991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (precision < 0) { 46011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precision = 6; // Standard default. 46021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precisionSet = false; 46031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 46051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Handle integer sizes. WARNING: These assume a 32-bit architecture! 46061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var argSize; 46071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch (String.fromCharCode(next)) { 46081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'h': 46091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var nextNext = HEAP8[((textIndex+2)|0)]; 46101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (nextNext == 104) { 46111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex++; 46121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argSize = 1; // char (actually i32 in varargs) 46131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 46141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argSize = 2; // short (actually i32 in varargs) 46151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 46171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'l': 46181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var nextNext = HEAP8[((textIndex+2)|0)]; 46191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (nextNext == 108) { 46201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex++; 46211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argSize = 8; // long long 46221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 46231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argSize = 4; // long 46241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 46261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'L': // long long 46271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'q': // int64_t 46281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'j': // intmax_t 46291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argSize = 8; 46301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 46311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'z': // size_t 46321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 't': // ptrdiff_t 46331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'I': // signed ptrdiff_t or unsigned size_t 46341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argSize = 4; 46351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 46361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: 46371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argSize = null; 46381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (argSize) textIndex++; 46401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = HEAP8[((textIndex+1)|0)]; 46411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 46421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Handle type specifier. 46431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch (String.fromCharCode(next)) { 46441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': { 46451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Integer. 46461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var signed = next == 100 || next == 105; 46471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argSize = argSize || 4; 46481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var currArg = getNextArg('i' + (argSize * 8)); 46491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var argText; 46501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Flatten i64-1 [low, high] into a (slightly rounded) double 46511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (argSize == 8) { 46521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117); 46531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Truncate to requested size. 46551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (argSize <= 4) { 46561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var limit = Math.pow(256, argSize) - 1; 46571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8); 46581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Format the number. 46601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var currAbsArg = Math.abs(currArg); 46611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var prefix = ''; 46621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next == 100 || next == 105) { 46631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = reSign(currArg, 8 * argSize, 1).toString(10); 46641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (next == 117) { 46651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = unSign(currArg, 8 * argSize, 1).toString(10); 46661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch currArg = Math.abs(currArg); 46671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (next == 111) { 46681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8); 46691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (next == 120 || next == 88) { 46701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch prefix = (flagAlternative && currArg != 0) ? '0x' : ''; 46711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (currArg < 0) { 46721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Represent negative numbers in hex as 2's complement. 46731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch currArg = -currArg; 46741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = (currAbsArg - 1).toString(16); 46751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var buffer = []; 46761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < argText.length; i++) { 46771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch buffer.push((0xF - parseInt(argText[i], 16)).toString(16)); 46781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = buffer.join(''); 46801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (argText.length < argSize * 2) argText = 'f' + argText; 46811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 46821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = currAbsArg.toString(16); 46831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next == 88) { 46851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch prefix = prefix.toUpperCase(); 46861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = argText.toUpperCase(); 46871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (next == 112) { 46891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (currAbsArg === 0) { 46901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = '(nil)'; 46911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 46921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch prefix = '0x'; 46931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = currAbsArg.toString(16); 46941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 46961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (precisionSet) { 46971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (argText.length < precision) { 46981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = '0' + argText; 46991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Add sign if needed 47031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (currArg >= 0) { 47041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagAlwaysSigned) { 47051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch prefix = '+' + prefix; 47061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (flagPadSign) { 47071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch prefix = ' ' + prefix; 47081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Move sign to prefix so we zero-pad after the sign 47121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (argText.charAt(0) == '-') { 47131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch prefix = '-' + prefix; 47141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = argText.substr(1); 47151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Add padding. 47181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (prefix.length + argText.length < width) { 47191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagLeftAlign) { 47201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText += ' '; 47211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 47221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagZeroPad) { 47231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = '0' + argText; 47241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 47251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch prefix = ' ' + prefix; 47261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Insert the result into the buffer. 47311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = prefix + argText; 47321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText.split('').forEach(function(chr) { 47331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(chr.charCodeAt(0)); 47341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 47351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 47361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': { 47381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Float. 47391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var currArg = getNextArg('double'); 47401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var argText; 47411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (isNaN(currArg)) { 47421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = 'nan'; 47431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flagZeroPad = false; 47441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (!isFinite(currArg)) { 47451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = (currArg < 0 ? '-' : '') + 'inf'; 47461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flagZeroPad = false; 47471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 47481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var isGeneral = false; 47491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var effectivePrecision = Math.min(precision, 20); 47501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Convert g/G to f/F or e/E, as per: 47521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html 47531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next == 103 || next == 71) { 47541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch isGeneral = true; 47551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precision = precision || 1; 47561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10); 47571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (precision > exponent && exponent >= -4) { 47581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = ((next == 103) ? 'f' : 'F').charCodeAt(0); 47591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precision -= exponent + 1; 47601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 47611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch next = ((next == 103) ? 'e' : 'E').charCodeAt(0); 47621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch precision--; 47631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch effectivePrecision = Math.min(precision, 20); 47651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next == 101 || next == 69) { 47681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = currArg.toExponential(effectivePrecision); 47691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Make sure the exponent has at least 2 digits. 47701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (/[eE][-+]\d$/.test(argText)) { 47711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = argText.slice(0, -1) + '0' + argText.slice(-1); 47721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (next == 102 || next == 70) { 47741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = currArg.toFixed(effectivePrecision); 47751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (currArg === 0 && __reallyNegative(currArg)) { 47761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = '-' + argText; 47771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var parts = argText.split('e'); 47811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (isGeneral && !flagAlternative) { 47821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Discard trailing zeros and periods. 47831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (parts[0].length > 1 && parts[0].indexOf('.') != -1 && 47841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) { 47851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch parts[0] = parts[0].slice(0, -1); 47861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 47881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Make sure we have a period in alternative mode. 47891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.'; 47901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Zero pad until required precision. 47911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (precision > effectivePrecision++) parts[0] += '0'; 47921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 47931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : ''); 47941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Capitalize 'E' if needed. 47961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next == 69) argText = argText.toUpperCase(); 47971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 47981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Add sign. 47991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (currArg >= 0) { 48001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagAlwaysSigned) { 48011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = '+' + argText; 48021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (flagPadSign) { 48031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = ' ' + argText; 48041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 48081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Add padding. 48091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (argText.length < width) { 48101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagLeftAlign) { 48111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText += ' '; 48121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 48131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) { 48141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = argText[0] + '0' + argText.slice(1); 48151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 48161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText = (flagZeroPad ? '0' : ' ') + argText; 48171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 48211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Adjust case. 48221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (next < 97) argText = argText.toUpperCase(); 48231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 48241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Insert the result into the buffer. 48251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argText.split('').forEach(function(chr) { 48261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(chr.charCodeAt(0)); 48271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 48281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 48291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 's': { 48311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // String. 48321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var arg = getNextArg('i8*'); 48331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var argLength = arg ? _strlen(arg) : '(null)'.length; 48341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (precisionSet) argLength = Math.min(argLength, precision); 48351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!flagLeftAlign) { 48361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (argLength < width--) { 48371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(32); 48381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (arg) { 48411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < argLength; i++) { 48421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(HEAPU8[((arg++)|0)]); 48431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 48451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true)); 48461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagLeftAlign) { 48481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (argLength < width--) { 48491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(32); 48501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 48531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'c': { 48551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Character. 48561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (flagLeftAlign) ret.push(getNextArg('i8')); 48571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (--width > 0) { 48581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(32); 48591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!flagLeftAlign) ret.push(getNextArg('i8')); 48611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 48621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 'n': { 48641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Write the length written so far to the next parameter. 48651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ptr = getNextArg('i32*'); 48661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((ptr)>>2)]=ret.length; 48671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 48681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case '%': { 48701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Literal percent sign. 48711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(curr); 48721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 48731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: { 48751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Unknown specifiers remain untouched. 48761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = startTextIndex; i < textIndex + 2; i++) { 48771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(HEAP8[(i)]); 48781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex += 2; 48821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO: Support a/A (hex float) and m (last error) specifiers. 48831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO: Support %1${specifier} for arg selection. 48841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 48851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret.push(curr); 48861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch textIndex += 1; 48871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 48891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 48901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }function _fprintf(stream, format, varargs) { 48911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // int fprintf(FILE *restrict stream, const char *restrict format, ...); 48921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html 48931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var result = __formatString(format, varargs); 48941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stack = Runtime.stackSave(); 48951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream); 48961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.stackRestore(stack); 48971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 48981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }function _printf(format, varargs) { 48991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // int printf(const char *restrict format, ...); 49001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html 49011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var stdout = HEAP32[((_stdout)>>2)]; 49021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return _fprintf(stdout, format, varargs); 49031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 49041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 49051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 49061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _fputc(c, stream) { 49071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // int fputc(int c, FILE *stream); 49081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html 49091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var chr = unSign(c & 0xFF); 49101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[((_fputc.ret)|0)]=chr; 49111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var fd = _fileno(stream); 49121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = _write(fd, _fputc.ret, 1); 49131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ret == -1) { 49141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var streamObj = FS.getStreamFromPtr(stream); 49151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (streamObj) streamObj.error = true; 49161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return -1; 49171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 49181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return chr; 49191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 49201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }function _putchar(c) { 49211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // int putchar(int c); 49221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/000095399/functions/putchar.html 49231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return _fputc(c, HEAP32[((_stdout)>>2)]); 49241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 49251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 49261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _sbrk(bytes) { 49271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Implement a Linux-like 'memory area' for our 'process'. 49281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Changes the size of the memory area by |bytes|; returns the 49291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // address of the previous top ('break') of the memory area 49301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP 49311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var self = _sbrk; 49321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!self.called) { 49331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned 49341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch self.called = true; 49351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(Runtime.dynamicAlloc); 49361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch self.alloc = Runtime.dynamicAlloc; 49371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') }; 49381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 49391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = DYNAMICTOP; 49401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (bytes != 0) self.alloc(bytes); 49411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; // Previous break location. 49421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 49431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 49441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _sysconf(name) { 49451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // long sysconf(int name); 49461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html 49471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch(name) { 49481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 30: return PAGE_SIZE; 49491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 132: 49501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 133: 49511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 12: 49521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 137: 49531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 138: 49541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 15: 49551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 235: 49561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 16: 49571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 17: 49581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 18: 49591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 19: 49601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 20: 49611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 149: 49621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 13: 49631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 10: 49641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 236: 49651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 153: 49661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 9: 49671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 21: 49681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 22: 49691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 159: 49701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 154: 49711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 14: 49721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 77: 49731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 78: 49741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 139: 49751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 80: 49761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 81: 49771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 79: 49781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 82: 49791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 68: 49801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 67: 49811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 164: 49821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 11: 49831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 29: 49841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 47: 49851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 48: 49861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 95: 49871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 52: 49881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 51: 49891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 46: 49901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 200809; 49911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 27: 49921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 246: 49931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 127: 49941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 128: 49951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 23: 49961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 24: 49971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 160: 49981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 161: 49991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 181: 50001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 182: 50011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 242: 50021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 183: 50031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 184: 50041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 243: 50051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 244: 50061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 245: 50071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 165: 50081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 178: 50091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 179: 50101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 49: 50111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 50: 50121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 168: 50131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 169: 50141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 175: 50151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 170: 50161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 171: 50171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 172: 50181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 97: 50191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 76: 50201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 32: 50211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 173: 50221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 35: 50231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return -1; 50241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 176: 50251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 177: 50261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 7: 50271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 155: 50281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 8: 50291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 157: 50301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 125: 50311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 126: 50321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 92: 50331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 93: 50341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 129: 50351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 130: 50361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 131: 50371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 94: 50381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 91: 50391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 1; 50401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 74: 50411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 60: 50421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 69: 50431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 70: 50441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 4: 50451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 1024; 50461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 31: 50471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 42: 50481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 72: 50491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 32; 50501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 87: 50511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 26: 50521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 33: 50531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 2147483647; 50541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 34: 50551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 1: 50561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 47839; 50571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 38: 50581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 36: 50591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 99; 50601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 43: 50611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 37: 50621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 2048; 50631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 0: return 2097152; 50641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 3: return 65536; 50651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 28: return 32768; 50661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 44: return 32767; 50671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 75: return 16384; 50681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 39: return 1000; 50691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 89: return 700; 50701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 71: return 256; 50711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 40: return 255; 50721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 2: return 100; 50731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 180: return 64; 50741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 25: return 20; 50751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 5: return 16; 50761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 6: return 6; 50771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 73: return 4; 50781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 84: return 1; 50791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 50801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ___setErrNo(ERRNO_CODES.EINVAL); 50811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return -1; 50821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 50831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 50841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 50851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["_memset"] = _memset; 50861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 50871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function ___errno_location() { 50881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ___errno_state; 50891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 50901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 50911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _abort() { 50921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['abort'](); 50931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 50941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 50951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Browser={mainLoop:{scheduler:null,method:"",shouldPause:false,paused:false,queue:[],pause:function () { 50961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mainLoop.shouldPause = true; 50971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },resume:function () { 50981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.mainLoop.paused) { 50991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mainLoop.paused = false; 51001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mainLoop.scheduler(); 51011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mainLoop.shouldPause = false; 51031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },updateStatus:function () { 51041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['setStatus']) { 51051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var message = Module['statusMessage'] || 'Please wait...'; 51061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var remaining = Browser.mainLoop.remainingBlockers; 51071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var expected = Browser.mainLoop.expectedBlockers; 51081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (remaining) { 51091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (remaining < expected) { 51101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')'); 51111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 51121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['setStatus'](message); 51131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 51151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['setStatus'](''); 51161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () { 51191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers 51201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 51211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.initted || ENVIRONMENT_IS_WORKER) return; 51221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.initted = true; 51231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 51241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 51251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch new Blob(); 51261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.hasBlobConstructor = true; 51271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch(e) { 51281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.hasBlobConstructor = false; 51291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch console.log("warning: no blob constructor, cannot create blobs with mimetypes"); 51301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null)); 51321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined; 51331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') { 51341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."); 51351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.noImageDecoding = true; 51361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 51381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Support for plugins that can process preloaded files. You can add more of these to 51391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // your app by creating and appending to Module.preloadPlugins. 51401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // 51411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Each plugin is asked if it can handle a file based on the file's name. If it can, 51421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // it is given the file's raw data. When it is done, it calls a callback with the file's 51431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // (possibly modified) data. For example, a plugin might decompress a file, or it 51441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // might create some side data structure for use later (like an Image element, etc.). 51451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 51461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var imagePlugin = {}; 51471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch imagePlugin['canHandle'] = function imagePlugin_canHandle(name) { 51481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name); 51491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 51501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) { 51511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var b = null; 51521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.hasBlobConstructor) { 51531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 51541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch b = new Blob([byteArray], { type: Browser.getMimetype(name) }); 51551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (b.size !== byteArray.length) { // Safari bug #118630 51561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Safari's Blob can only take an ArrayBuffer 51571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) }); 51581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch(e) { 51601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder'); 51611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!b) { 51641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var bb = new Browser.BlobBuilder(); 51651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range 51661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch b = bb.getBlob(); 51671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 51681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var url = Browser.URLObject.createObjectURL(b); 51691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var img = new Image(); 51701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch img.onload = function img_onload() { 51711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(img.complete, 'Image ' + name + ' could not be decoded'); 51721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var canvas = document.createElement('canvas'); 51731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.width = img.width; 51741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.height = img.height; 51751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ctx = canvas.getContext('2d'); 51761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ctx.drawImage(img, 0, 0); 51771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["preloadedImages"][name] = canvas; 51781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.URLObject.revokeObjectURL(url); 51791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (onload) onload(byteArray); 51801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 51811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch img.onerror = function img_onerror(event) { 51821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch console.log('Image ' + url + ' could not be decoded'); 51831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (onerror) onerror(); 51841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 51851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch img.src = url; 51861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 51871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['preloadPlugins'].push(imagePlugin); 51881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 51891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var audioPlugin = {}; 51901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch audioPlugin['canHandle'] = function audioPlugin_canHandle(name) { 51911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 }; 51921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 51931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) { 51941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var done = false; 51951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function finish(audio) { 51961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (done) return; 51971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch done = true; 51981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["preloadedAudios"][name] = audio; 51991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (onload) onload(byteArray); 52001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function fail() { 52021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (done) return; 52031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch done = true; 52041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["preloadedAudios"][name] = new Audio(); // empty shim 52051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (onerror) onerror(); 52061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.hasBlobConstructor) { 52081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 52091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); 52101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch(e) { 52111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return fail(); 52121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this! 52141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var audio = new Audio(); 52151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926 52161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch audio.onerror = function audio_onerror(event) { 52171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (done) return; 52181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach'); 52191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function encode64(data) { 52201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 52211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var PAD = '='; 52221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = ''; 52231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var leftchar = 0; 52241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var leftbits = 0; 52251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < data.length; i++) { 52261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch leftchar = (leftchar << 8) | data[i]; 52271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch leftbits += 8; 52281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (leftbits >= 6) { 52291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var curr = (leftchar >> (leftbits-6)) & 0x3f; 52301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch leftbits -= 6; 52311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret += BASE[curr]; 52321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (leftbits == 2) { 52351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret += BASE[(leftchar&3) << 4]; 52361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret += PAD + PAD; 52371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (leftbits == 4) { 52381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret += BASE[(leftchar&0xf) << 2]; 52391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ret += PAD; 52401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 52421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray); 52441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch finish(audio); // we don't wait for confirmation this worked - but it's worth trying 52451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 52461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch audio.src = url; 52471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror 52481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.safeSetTimeout(function() { 52491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch finish(audio); // try to use it even though it is not necessarily ready to play 52501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 10000); 52511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 52521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return fail(); 52531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 52551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['preloadPlugins'].push(audioPlugin); 52561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 52571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Canvas event setup 52581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 52591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var canvas = Module['canvas']; 52601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 52611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module 52621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Module['forcedAspectRatio'] = 4 / 3; 52631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 52641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.requestPointerLock = canvas['requestPointerLock'] || 52651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas['mozRequestPointerLock'] || 52661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas['webkitRequestPointerLock'] || 52671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas['msRequestPointerLock'] || 52681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function(){}; 52691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.exitPointerLock = document['exitPointerLock'] || 52701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['mozExitPointerLock'] || 52711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['webkitExitPointerLock'] || 52721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['msExitPointerLock'] || 52731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function(){}; // no-op if function does not exist 52741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.exitPointerLock = canvas.exitPointerLock.bind(document); 52751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 52761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function pointerLockChange() { 52771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.pointerLock = document['pointerLockElement'] === canvas || 52781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['mozPointerLockElement'] === canvas || 52791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['webkitPointerLockElement'] === canvas || 52801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['msPointerLockElement'] === canvas; 52811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 52831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document.addEventListener('pointerlockchange', pointerLockChange, false); 52841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document.addEventListener('mozpointerlockchange', pointerLockChange, false); 52851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document.addEventListener('webkitpointerlockchange', pointerLockChange, false); 52861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document.addEventListener('mspointerlockchange', pointerLockChange, false); 52871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 52881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['elementPointerLock']) { 52891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.addEventListener("click", function(ev) { 52901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Browser.pointerLock && canvas.requestPointerLock) { 52911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.requestPointerLock(); 52921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ev.preventDefault(); 52931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, false); 52951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 52961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) { 52971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ctx; 52981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var errorInfo = '?'; 52991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function onContextCreationError(event) { 53001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch errorInfo = event.statusMessage || errorInfo; 53011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 53031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (useWebGL) { 53041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var contextAttributes = { 53051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch antialias: false, 53061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alpha: false 53071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 53081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (webGLContextAttributes) { 53101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var attribute in webGLContextAttributes) { 53111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch contextAttributes[attribute] = webGLContextAttributes[attribute]; 53121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false); 53171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 53181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ['experimental-webgl', 'webgl'].some(function(webglId) { 53191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ctx = canvas.getContext(webglId, contextAttributes); 53201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 53211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } finally { 53221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false); 53231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 53251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ctx = canvas.getContext('2d'); 53261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ctx) throw ':('; 53281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } catch (e) { 53291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.print('Could not create canvas: ' + [errorInfo, e]); 53301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return null; 53311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (useWebGL) { 53331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Set the background of the WebGL canvas to black 53341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.style.backgroundColor = "black"; 53351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Warn on context loss 53371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.addEventListener('webglcontextlost', function(event) { 53381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch alert('WebGL context lost. You will need to reload the page.'); 53391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, false); 53401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (setInModule) { 53421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch GLctx = Module.ctx = ctx; 53431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.useWebGL = useWebGL; 53441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() }); 53451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.init(); 53461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ctx; 53481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) { 53491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.lockPointer = lockPointer; 53501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.resizeCanvas = resizeCanvas; 53511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true; 53521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false; 53531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var canvas = Module['canvas']; 53551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function fullScreenChange() { 53561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.isFullScreen = false; 53571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var canvasContainer = canvas.parentNode; 53581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] || 53591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['mozFullScreenElement'] || document['mozFullscreenElement'] || 53601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['fullScreenElement'] || document['fullscreenElement'] || 53611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['msFullScreenElement'] || document['msFullscreenElement'] || 53621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['webkitCurrentFullScreenElement']) === canvasContainer) { 53631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.cancelFullScreen = document['cancelFullScreen'] || 53641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['mozCancelFullScreen'] || 53651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['webkitCancelFullScreen'] || 53661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['msExitFullscreen'] || 53671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['exitFullscreen'] || 53681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function() {}; 53691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document); 53701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.lockPointer) canvas.requestPointerLock(); 53711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.isFullScreen = true; 53721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize(); 53731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 53741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen 53761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvasContainer.parentNode.insertBefore(canvas, canvasContainer); 53771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvasContainer.parentNode.removeChild(canvasContainer); 53781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.resizeCanvas) Browser.setWindowedCanvasSize(); 53801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen); 53821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.updateCanvasDimensions(canvas); 53831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Browser.fullScreenHandlersInstalled) { 53861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.fullScreenHandlersInstalled = true; 53871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document.addEventListener('fullscreenchange', fullScreenChange, false); 53881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document.addEventListener('mozfullscreenchange', fullScreenChange, false); 53891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document.addEventListener('webkitfullscreenchange', fullScreenChange, false); 53901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document.addEventListener('MSFullscreenChange', fullScreenChange, false); 53911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 53921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root 53941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var canvasContainer = document.createElement("div"); 53951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.parentNode.insertBefore(canvasContainer, canvas); 53961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvasContainer.appendChild(canvas); 53971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 53981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size) 53991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] || 54001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvasContainer['mozRequestFullScreen'] || 54011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvasContainer['msRequestFullscreen'] || 54021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null); 54031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvasContainer.requestFullScreen(); 54041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },requestAnimationFrame:function requestAnimationFrame(func) { 54051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js) 54061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch setTimeout(func, 1000/60); 54071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 54081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!window.requestAnimationFrame) { 54091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window.requestAnimationFrame = window['requestAnimationFrame'] || 54101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window['mozRequestAnimationFrame'] || 54111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window['webkitRequestAnimationFrame'] || 54121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window['msRequestAnimationFrame'] || 54131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window['oRequestAnimationFrame'] || 54141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window['setTimeout']; 54151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 54161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window.requestAnimationFrame(func); 54171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 54181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },safeCallback:function (func) { 54191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return function() { 54201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ABORT) return func.apply(null, arguments); 54211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 54221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },safeRequestAnimationFrame:function (func) { 54231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Browser.requestAnimationFrame(function() { 54241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ABORT) func(); 54251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 54261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },safeSetTimeout:function (func, timeout) { 54271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return setTimeout(function() { 54281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ABORT) func(); 54291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, timeout); 54301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },safeSetInterval:function (func, timeout) { 54311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return setInterval(function() { 54321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ABORT) func(); 54331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, timeout); 54341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getMimetype:function (name) { 54351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return { 54361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'jpg': 'image/jpeg', 54371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'jpeg': 'image/jpeg', 54381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'png': 'image/png', 54391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'bmp': 'image/bmp', 54401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'ogg': 'audio/ogg', 54411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'wav': 'audio/wav', 54421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'mp3': 'audio/mpeg' 54431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }[name.substr(name.lastIndexOf('.')+1)]; 54441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getUserMedia:function (func) { 54451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if(!window.getUserMedia) { 54461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window.getUserMedia = navigator['getUserMedia'] || 54471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch navigator['mozGetUserMedia']; 54481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 54491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch window.getUserMedia(func); 54501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getMovementX:function (event) { 54511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return event['movementX'] || 54521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch event['mozMovementX'] || 54531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch event['webkitMovementX'] || 54541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 0; 54551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getMovementY:function (event) { 54561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return event['movementY'] || 54571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch event['mozMovementY'] || 54581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch event['webkitMovementY'] || 54591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 0; 54601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },getMouseWheelDelta:function (event) { 54611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta)); 54621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup 54631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.pointerLock) { 54641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // When the pointer is locked, calculate the coordinates 54651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // based on the movement of the mouse. 54661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Workaround for Firefox bug 764498 54671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (event.type != 'mousemove' && 54681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ('mozMovementX' in event)) { 54691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseMovementX = Browser.mouseMovementY = 0; 54701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 54711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseMovementX = Browser.getMovementX(event); 54721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseMovementY = Browser.getMovementY(event); 54731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 54741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 54751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // check if SDL is available 54761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof SDL != "undefined") { 54771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseX = SDL.mouseX + Browser.mouseMovementX; 54781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseY = SDL.mouseY + Browser.mouseMovementY; 54791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 54801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // just add the mouse delta to the current absolut mouse position 54811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // FIXME: ideally this should be clamped against the canvas size and zero 54821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseX += Browser.mouseMovementX; 54831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseY += Browser.mouseMovementY; 54841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 54851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 54861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Otherwise, calculate the movement based on the changes 54871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // in the coordinates. 54881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var rect = Module["canvas"].getBoundingClientRect(); 54891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var x, y; 54901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 54911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Neither .scrollX or .pageXOffset are defined in a spec, but 54921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // we prefer .scrollX because it is currently in a spec draft. 54931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/) 54941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset); 54951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset); 54961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (event.type == 'touchstart' || 54971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch event.type == 'touchend' || 54981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch event.type == 'touchmove') { 54991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var t = event.touches.item(0); 55001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (t) { 55011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch x = t.pageX - (scrollX + rect.left); 55021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch y = t.pageY - (scrollY + rect.top); 55031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 55041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 55051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 55071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch x = event.pageX - (scrollX + rect.left); 55081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch y = event.pageY - (scrollY + rect.top); 55091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 55111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // the canvas might be CSS-scaled compared to its backbuffer; 55121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // SDL-using content will want mouse coordinates in terms 55131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // of backbuffer units. 55141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var cw = Module["canvas"].width; 55151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ch = Module["canvas"].height; 55161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch x = x * (cw / rect.width); 55171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch y = y * (ch / rect.height); 55181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 55191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseMovementX = x - Browser.mouseX; 55201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseMovementY = y - Browser.mouseY; 55211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseX = x; 55221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.mouseY = y; 55231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },xhrLoad:function (url, onload, onerror) { 55251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var xhr = new XMLHttpRequest(); 55261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.open('GET', url, true); 55271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.responseType = 'arraybuffer'; 55281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.onload = function xhr_onload() { 55291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 55301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onload(xhr.response); 55311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 55321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onerror(); 55331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }; 55351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.onerror = onerror; 55361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch xhr.send(null); 55371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },asyncLoad:function (url, onload, onerror, noRunDep) { 55381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.xhrLoad(url, function(arrayBuffer) { 55391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); 55401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onload(new Uint8Array(arrayBuffer)); 55411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!noRunDep) removeRunDependency('al ' + url); 55421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, function(event) { 55431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (onerror) { 55441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch onerror(); 55451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 55461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw 'Loading data file "' + url + '" failed.'; 55471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 55491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!noRunDep) addRunDependency('al ' + url); 55501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },resizeListeners:[],updateResizeListeners:function () { 55511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var canvas = Module['canvas']; 55521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.resizeListeners.forEach(function(listener) { 55531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch listener(canvas.width, canvas.height); 55541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 55551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },setCanvasSize:function (width, height, noUpdates) { 55561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var canvas = Module['canvas']; 55571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.updateCanvasDimensions(canvas, width, height); 55581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!noUpdates) Browser.updateResizeListeners(); 55591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () { 55601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // check if SDL is available 55611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof SDL != "undefined") { 55621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]; 55631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flags = flags | 0x00800000; // set SDL_FULLSCREEN flag 55641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags 55651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.updateResizeListeners(); 55671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },setWindowedCanvasSize:function () { 55681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // check if SDL is available 55691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof SDL != "undefined") { 55701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]; 55711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag 55721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags 55731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.updateResizeListeners(); 55751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch },updateCanvasDimensions:function (canvas, wNative, hNative) { 55761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (wNative && hNative) { 55771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.widthNative = wNative; 55781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.heightNative = hNative; 55791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 55801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch wNative = canvas.widthNative; 55811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch hNative = canvas.heightNative; 55821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var w = wNative; 55841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var h = hNative; 55851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) { 55861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (w/h < Module['forcedAspectRatio']) { 55871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch w = Math.round(h * Module['forcedAspectRatio']); 55881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 55891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch h = Math.round(w / Module['forcedAspectRatio']); 55901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 55921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] || 55931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['mozFullScreenElement'] || document['mozFullscreenElement'] || 55941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['fullScreenElement'] || document['fullscreenElement'] || 55951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['msFullScreenElement'] || document['msFullscreenElement'] || 55961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) { 55971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var factor = Math.min(screen.width / w, screen.height / h); 55981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch w = Math.round(w * factor); 55991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch h = Math.round(h * factor); 56001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 56011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Browser.resizeCanvas) { 56021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (canvas.width != w) canvas.width = w; 56031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (canvas.height != h) canvas.height = h; 56041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof canvas.style != 'undefined') { 56051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.style.removeProperty( "width"); 56061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.style.removeProperty("height"); 56071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 56081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 56091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (canvas.width != wNative) canvas.width = wNative; 56101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (canvas.height != hNative) canvas.height = hNative; 56111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof canvas.style != 'undefined') { 56121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (w != wNative || h != hNative) { 56131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.style.setProperty( "width", w + "px", "important"); 56141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.style.setProperty("height", h + "px", "important"); 56151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 56161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.style.removeProperty( "width"); 56171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch canvas.style.removeProperty("height"); 56181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 56191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 56201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 56211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }}; 56221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _time(ptr) { 56241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = Math.floor(Date.now()/1000); 56251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ptr) { 56261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[((ptr)>>2)]=ret; 56271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 56281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return ret; 56291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 56301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function _emscripten_memcpy_big(dest, src, num) { 56341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAPU8.set(HEAPU8.subarray(src, src+num), dest); 56351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return dest; 56361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 56371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["_memcpy"] = _memcpy; 56381b268ca467c924004286c97bac133db489cf43d0Ben MurdochFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice; 56391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0; 56401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor(); 56411b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); } 56421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } }); 56431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch_fputc.ret = allocate([0], "i8", ALLOC_STATIC); 56441b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) }; 56451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) }; 56461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) }; 56471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() }; 56481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() }; 56491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() } 56501b268ca467c924004286c97bac133db489cf43d0Ben MurdochSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP); 56511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56521b268ca467c924004286c97bac133db489cf43d0Ben MurdochstaticSealed = true; // seal the static portion of memory 56531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56541b268ca467c924004286c97bac133db489cf43d0Ben MurdochSTACK_MAX = STACK_BASE + 5242880; 56551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56561b268ca467c924004286c97bac133db489cf43d0Ben MurdochDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX); 56571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56581b268ca467c924004286c97bac133db489cf43d0Ben Murdochassert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack"); 56591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56611b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar Math_min = Math.min; 56621b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction asmPrintInt(x, y) { 56631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack); 56641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 56651b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction asmPrintFloat(x, y) { 56661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack); 56671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 56681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// EMSCRIPTEN_START_ASM 56691b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar asm = Wasm.instantiateModuleFromAsm((function Module(global, env, buffer) { 56701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 'use asm'; 56711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var HEAP8 = new global.Int8Array(buffer); 56721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var HEAP16 = new global.Int16Array(buffer); 56731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var HEAP32 = new global.Int32Array(buffer); 56741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var HEAPU8 = new global.Uint8Array(buffer); 56751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var HEAPU16 = new global.Uint16Array(buffer); 56761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var HEAPU32 = new global.Uint32Array(buffer); 56771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var HEAPF32 = new global.Float32Array(buffer); 56781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var HEAPF64 = new global.Float64Array(buffer); 56791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var STACKTOP=env.STACKTOP|0; 56811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var STACK_MAX=env.STACK_MAX|0; 56821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempDoublePtr=env.tempDoublePtr|0; 56831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ABORT=env.ABORT|0; 56841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var __THREW__ = 0; 56861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var threwValue = 0; 56871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var setjmpId = 0; 56881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var undef = 0; 56891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var nan = +env.NaN, inf = +env.Infinity; 56901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0; 56911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 56921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet0 = 0; 56931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet1 = 0; 56941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet2 = 0; 56951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet3 = 0; 56961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet4 = 0; 56971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet5 = 0; 56981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet6 = 0; 56991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet7 = 0; 57001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet8 = 0; 57011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempRet9 = 0; 57021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_floor=global.Math.floor; 57031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_abs=global.Math.abs; 57041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_sqrt=global.Math.sqrt; 57051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_pow=global.Math.pow; 57061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_cos=global.Math.cos; 57071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_sin=global.Math.sin; 57081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_tan=global.Math.tan; 57091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_acos=global.Math.acos; 57101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_asin=global.Math.asin; 57111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_atan=global.Math.atan; 57121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_atan2=global.Math.atan2; 57131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_exp=global.Math.exp; 57141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_log=global.Math.log; 57151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_ceil=global.Math.ceil; 57161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_imul=global.Math.imul; 57171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var abort=env.abort; 57181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var assert=env.assert; 57191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var asmPrintInt=env.asmPrintInt; 57201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var asmPrintFloat=env.asmPrintFloat; 57211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var Math_min=env.min; 57221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _fflush=env._fflush; 57231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _emscripten_memcpy_big=env._emscripten_memcpy_big; 57241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _putchar=env._putchar; 57251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _fputc=env._fputc; 57261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _send=env._send; 57271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _pwrite=env._pwrite; 57281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _abort=env._abort; 57291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var __reallyNegative=env.__reallyNegative; 57301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _fwrite=env._fwrite; 57311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _sbrk=env._sbrk; 57321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _mkport=env._mkport; 57331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _fprintf=env._fprintf; 57341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ___setErrNo=env.___setErrNo; 57351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var __formatString=env.__formatString; 57361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _fileno=env._fileno; 57371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _printf=env._printf; 57381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _time=env._time; 57391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _sysconf=env._sysconf; 57401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var _write=env._write; 57411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ___errno_location=env.___errno_location; 57421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var tempFloat = 0.0; 57431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 57441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// EMSCRIPTEN_START_FUNCS 57451b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _malloc(i12) { 57461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i12 | 0; 57471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0, i26 = 0, i27 = 0, i28 = 0, i29 = 0, i30 = 0, i31 = 0, i32 = 0; 57481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = STACKTOP; 57491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 57501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i12 >>> 0 < 245) { 57511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i12 >>> 0 < 11) { 57521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = 16; 57531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 57541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i12 + 11 & -8; 57551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 57561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i12 >>> 3; 57571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[14] | 0; 57581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = i18 >>> i20; 57591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i21 & 3 | 0) != 0) { 57601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = (i21 & 1 ^ 1) + i20 | 0; 57611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i6 << 1; 57621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 96 + (i5 << 2) | 0; 57631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 96 + (i5 + 2 << 2) | 0; 57641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i5 >> 2] | 0; 57651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i7 + 8 | 0; 57661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[i2 >> 2] | 0; 57671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 57681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) != (i4 | 0)) { 57691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i4 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 57701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 57711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 57721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i4 + 12 | 0; 57731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i8 >> 2] | 0) == (i7 | 0)) { 57741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i8 >> 2] = i3; 57751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 >> 2] = i4; 57761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 57771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 57781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 57791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 57801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 57811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = i18 & ~(1 << i6); 57821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 57831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 57841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i6 << 3; 57851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i7 + 4 >> 2] = i32 | 3; 57861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i7 + (i32 | 4) | 0; 57871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1; 57881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i2; 57891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 57901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 57911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 57921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i12 >>> 0 > (HEAP32[64 >> 2] | 0) >>> 0) { 57931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i21 | 0) != 0) { 57941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 2 << i20; 57951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i21 << i20 & (i7 | 0 - i7); 57961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = (i7 & 0 - i7) + -1 | 0; 57971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i7 >>> 12 & 16; 57981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 >>> i2; 57991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i7 >>> 5 & 8; 58001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 >>> i6; 58011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i7 >>> 2 & 4; 58021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 >>> i5; 58031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i7 >>> 1 & 2; 58041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 >>> i4; 58051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i7 >>> 1 & 1; 58061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = (i6 | i2 | i5 | i4 | i3) + (i7 >>> i3) | 0; 58071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i3 << 1; 58081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 96 + (i7 << 2) | 0; 58091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 96 + (i7 + 2 << 2) | 0; 58101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i7 >> 2] | 0; 58111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i5 + 8 | 0; 58121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[i2 >> 2] | 0; 58131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 58141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 | 0) != (i6 | 0)) { 58151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 58161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 58171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i6 + 12 | 0; 58191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i8 >> 2] | 0) == (i5 | 0)) { 58201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i8 >> 2] = i4; 58211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i7 >> 2] = i6; 58221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 58231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 58241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 58251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 58271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = i18 & ~(1 << i3); 58281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 58301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i3 << 3; 58311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i6 - i12 | 0; 58321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 4 >> 2] = i12 | 3; 58331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i5 + i12 | 0; 58341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i12 | 4) >> 2] = i4 | 1; 58351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + i6 >> 2] = i4; 58361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[64 >> 2] | 0; 58371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) != 0) { 58381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[76 >> 2] | 0; 58391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i6 >>> 3; 58401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i8 << 1; 58411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 96 + (i9 << 2) | 0; 58421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[14] | 0; 58431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 1 << i8; 58441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 & i8 | 0) != 0) { 58451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 96 + (i9 + 2 << 2) | 0; 58461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = HEAP32[i7 >> 2] | 0; 58471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i8 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 58481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 58491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 58501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i28 = i7; 58511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = i8; 58521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 58541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = i7 | i8; 58551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i28 = 96 + (i9 + 2 << 2) | 0; 58561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = i6; 58571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i28 >> 2] = i5; 58591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i27 + 12 >> 2] = i5; 58601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 8 >> 2] = i27; 58611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 12 >> 2] = i6; 58621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = i4; 58641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[76 >> 2] = i3; 58651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i2; 58661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 58671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 58681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[60 >> 2] | 0; 58701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i18 | 0) != 0) { 58711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = (i18 & 0 - i18) + -1 | 0; 58721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = i2 >>> 12 & 16; 58731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 >>> i31; 58741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i30 = i2 >>> 5 & 8; 58751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 >>> i30; 58761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i2 >>> 2 & 4; 58771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 >>> i32; 58781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i2 >>> 1 & 2; 58791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 >>> i6; 58801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i2 >>> 1 & 1; 58811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[360 + ((i30 | i31 | i32 | i6 | i3) + (i2 >>> i3) << 2) >> 2] | 0; 58821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = (HEAP32[i3 + 4 >> 2] & -8) - i12 | 0; 58831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i3; 58841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 58851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i6 + 16 >> 2] | 0; 58861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 58871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i6 + 20 >> 2] | 0; 58881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 58891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 58901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = (HEAP32[i5 + 4 >> 2] & -8) - i12 | 0; 58931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i6 >>> 0 < i2 >>> 0; 58941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i4 ? i6 : i2; 58951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i5; 58961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i4 ? i5 : i3; 58971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 58981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[72 >> 2] | 0; 58991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < i6 >>> 0) { 59001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i3 + i12 | 0; 59031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i3 >>> 0 < i4 >>> 0)) { 59041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i3 + 24 >> 2] | 0; 59071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i3 + 12 >> 2] | 0; 59081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 59091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) == (i3 | 0)) { 59101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i3 + 20 | 0; 59111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i8 >> 2] | 0; 59121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) == 0) { 59131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i3 + 16 | 0; 59141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i8 >> 2] | 0; 59151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) == 0) { 59161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = 0; 59171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 59181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 59211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i7 + 20 | 0; 59221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i10 >> 2] | 0; 59231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) != 0) { 59241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i9; 59251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i10; 59261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 59271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i7 + 16 | 0; 59291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i10 >> 2] | 0; 59301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) == 0) { 59311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 59321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 59331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i9; 59341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i10; 59351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i8 >>> 0 < i6 >>> 0) { 59381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 59401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i8 >> 2] = 0; 59411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = i7; 59421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 59431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 59451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = HEAP32[i3 + 8 >> 2] | 0; 59461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i8 >>> 0 < i6 >>> 0) { 59471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i8 + 12 | 0; 59501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i6 >> 2] | 0) != (i3 | 0)) { 59511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i7 + 8 | 0; 59541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i9 >> 2] | 0) == (i3 | 0)) { 59551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = i7; 59561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 >> 2] = i8; 59571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = i7; 59581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 59591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 59601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 59641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 59651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) != 0) { 59661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i3 + 28 >> 2] | 0; 59671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 360 + (i7 << 2) | 0; 59681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) == (HEAP32[i6 >> 2] | 0)) { 59691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = i26; 59701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i26 | 0) == 0) { 59711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i7); 59721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 59731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 59751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 59761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i5 + 16 | 0; 59791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i6 >> 2] | 0) == (i3 | 0)) { 59801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = i26; 59811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 59821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 20 >> 2] = i26; 59831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i26 | 0) == 0) { 59851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 59861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i26 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 59891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 59911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i26 + 24 >> 2] = i5; 59921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i3 + 16 >> 2] | 0; 59931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 59941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) != 0) { 59951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 59961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 59971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 59981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i26 + 16 >> 2] = i5; 59991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 24 >> 2] = i26; 60001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 60011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 60041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i3 + 20 >> 2] | 0; 60051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) != 0) { 60061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 60071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 60081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i26 + 20 >> 2] = i5; 60101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 24 >> 2] = i26; 60111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 60121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 60161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i2 >>> 0 < 16) { 60171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i2 + i12 | 0; 60181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 4 >> 2] = i32 | 3; 60191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i3 + (i32 + 4) | 0; 60201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1; 60211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 4 >> 2] = i12 | 3; 60231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + (i12 | 4) >> 2] = i2 | 1; 60241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + (i2 + i12) >> 2] = i2; 60251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[64 >> 2] | 0; 60261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) != 0) { 60271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[76 >> 2] | 0; 60281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i6 >>> 3; 60291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i8 << 1; 60301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 96 + (i9 << 2) | 0; 60311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[14] | 0; 60321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 1 << i8; 60331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 & i8 | 0) != 0) { 60341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 96 + (i9 + 2 << 2) | 0; 60351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = HEAP32[i7 >> 2] | 0; 60361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i8 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 60371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 60381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i7; 60401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i8; 60411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = i7 | i8; 60441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 96 + (i9 + 2 << 2) | 0; 60451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i6; 60461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i25 >> 2] = i5; 60481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + 12 >> 2] = i5; 60491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 8 >> 2] = i24; 60501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 12 >> 2] = i6; 60511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = i2; 60531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[76 >> 2] = i4; 60541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i3 + 8 | 0; 60561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 60571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 60581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i12 >>> 0 > 4294967231)) { 60621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i12 + 11 | 0; 60631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i24 & -8; 60641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = HEAP32[60 >> 2] | 0; 60651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i26 | 0) != 0) { 60661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 0 - i12 | 0; 60671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i24 >>> 8; 60681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i24 | 0) != 0) { 60691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i12 >>> 0 > 16777215) { 60701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = 31; 60711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = (i24 + 1048320 | 0) >>> 16 & 8; 60731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i24 << i31; 60741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i30 = (i32 + 520192 | 0) >>> 16 & 4; 60751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 << i30; 60761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = (i32 + 245760 | 0) >>> 16 & 2; 60771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = 14 - (i30 | i31 | i27) + (i32 << i27 >>> 15) | 0; 60781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = i12 >>> (i27 + 7 | 0) & 1 | i27 << 1; 60791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = 0; 60821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i30 = HEAP32[360 + (i27 << 2) >> 2] | 0; 60841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L126 : do { 60851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i30 | 0) == 0) { 60861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i29 = 0; 60871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = 0; 60881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i27 | 0) == 31) { 60901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = 0; 60911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 60921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = 25 - (i27 >>> 1) | 0; 60931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 60941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i29 = 0; 60951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i28 = i12 << i24; 60961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = 0; 60971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 60981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = HEAP32[i30 + 4 >> 2] & -8; 60991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = i32 - i12 | 0; 61001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i31 >>> 0 < i25 >>> 0) { 61011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i32 | 0) == (i12 | 0)) { 61021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i31; 61031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i29 = i30; 61041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i30; 61051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L126; 61061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 61071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i31; 61081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i30; 61091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = HEAP32[i30 + 20 >> 2] | 0; 61121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i30 = HEAP32[i30 + (i28 >>> 31 << 2) + 16 >> 2] | 0; 61131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i29 = (i31 | 0) == 0 | (i31 | 0) == (i30 | 0) ? i29 : i31; 61141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i30 | 0) == 0) { 61151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 61161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 61171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i28 = i28 << 1; 61181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 61221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i29 | 0) == 0 & (i24 | 0) == 0) { 61231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = 2 << i27; 61241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = i26 & (i32 | 0 - i32); 61251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i26 | 0) == 0) { 61261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 61271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = (i26 & 0 - i26) + -1 | 0; 61291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i28 = i32 >>> 12 & 16; 61301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 >>> i28; 61311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = i32 >>> 5 & 8; 61321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 >>> i27; 61331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i30 = i32 >>> 2 & 4; 61341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 >>> i30; 61351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = i32 >>> 1 & 2; 61361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 >>> i31; 61371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i29 = i32 >>> 1 & 1; 61381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i29 = HEAP32[360 + ((i27 | i28 | i30 | i31 | i29) + (i32 >>> i29) << 2) >> 2] | 0; 61391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i29 | 0) != 0) { 61411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 61421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = (HEAP32[i29 + 4 >> 2] & -8) - i12 | 0; 61431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = i27 >>> 0 < i25 >>> 0; 61441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i26 ? i27 : i25; 61451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i26 ? i29 : i24; 61461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = HEAP32[i29 + 16 >> 2] | 0; 61471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i26 | 0) != 0) { 61481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i29 = i26; 61491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 61501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i29 = HEAP32[i29 + 20 >> 2] | 0; 61521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i29 | 0) == 0) { 61531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 61541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i24 | 0) != 0 ? i25 >>> 0 < ((HEAP32[64 >> 2] | 0) - i12 | 0) >>> 0 : 0) { 61581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[72 >> 2] | 0; 61591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i24 >>> 0 < i4 >>> 0) { 61601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 61611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i24 + i12 | 0; 61631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i24 >>> 0 < i2 >>> 0)) { 61641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 61651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[i24 + 24 >> 2] | 0; 61671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[i24 + 12 >> 2] | 0; 61681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 61691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) == (i24 | 0)) { 61701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i24 + 20 | 0; 61711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i6 >> 2] | 0; 61721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 61731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i24 + 16 | 0; 61741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i6 >> 2] | 0; 61751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 61761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = 0; 61771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 61781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 61811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i5 + 20 | 0; 61821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i8 >> 2] | 0; 61831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) != 0) { 61841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i7; 61851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i8; 61861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 61871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i5 + 16 | 0; 61891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = HEAP32[i7 >> 2] | 0; 61901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) == 0) { 61911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 61921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 61931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i8; 61941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i7; 61951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 61971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i6 >>> 0 < i4 >>> 0) { 61981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 61991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = 0; 62011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = i5; 62021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 62031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i24 + 8 >> 2] | 0; 62061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i5 >>> 0 < i4 >>> 0) { 62071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 62081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i5 + 12 | 0; 62101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i7 >> 2] | 0) != (i24 | 0)) { 62111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 62121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i6 + 8 | 0; 62141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) { 62151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i7 >> 2] = i6; 62161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = i5; 62171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = i6; 62181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 62191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 62211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 62241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 62251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) != 0) { 62261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[i24 + 28 >> 2] | 0; 62271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 360 + (i4 << 2) | 0; 62281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i24 | 0) == (HEAP32[i5 >> 2] | 0)) { 62291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 >> 2] = i22; 62301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i22 | 0) == 0) { 62311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i4); 62321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 62331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 62361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 62371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i3 + 16 | 0; 62391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) { 62401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = i22; 62411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 20 >> 2] = i22; 62431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i22 | 0) == 0) { 62451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 62461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i22 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 62491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 62501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i22 + 24 >> 2] = i3; 62521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[i24 + 16 >> 2] | 0; 62531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 62541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) != 0) { 62551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 62561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 62571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i22 + 16 >> 2] = i3; 62591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 24 >> 2] = i22; 62601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 62611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 62641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[i24 + 20 >> 2] | 0; 62651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) != 0) { 62661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 62671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 62681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i22 + 20 >> 2] = i3; 62701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 24 >> 2] = i22; 62711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 62721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 62761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L204 : do { 62771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i25 >>> 0 < 16)) { 62781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + 4 >> 2] = i12 | 3; 62791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 | 4) >> 2] = i25 | 1; 62801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i25 + i12) >> 2] = i25; 62811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i25 >>> 3; 62821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i25 >>> 0 < 256) { 62831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i4 << 1; 62841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 96 + (i6 << 2) | 0; 62851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[14] | 0; 62861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 1 << i4; 62871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 & i4 | 0) != 0) { 62881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 96 + (i6 + 2 << 2) | 0; 62891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[i5 >> 2] | 0; 62901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i4 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 62911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 62921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = i5; 62941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i4; 62951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 62961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 62971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = i5 | i4; 62981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = 96 + (i6 + 2 << 2) | 0; 62991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i3; 63001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i21 >> 2] = i2; 63021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i20 + 12 >> 2] = i2; 63031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 8) >> 2] = i20; 63041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 12) >> 2] = i3; 63051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 63061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i25 >>> 8; 63081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) != 0) { 63091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i25 >>> 0 > 16777215) { 63101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 31; 63111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 63121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = (i3 + 1048320 | 0) >>> 16 & 8; 63131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i3 << i31; 63141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i30 = (i32 + 520192 | 0) >>> 16 & 4; 63151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 << i30; 63161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = (i32 + 245760 | 0) >>> 16 & 2; 63171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0; 63181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i25 >>> (i3 + 7 | 0) & 1 | i3 << 1; 63191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 63211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0; 63221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 360 + (i3 << 2) | 0; 63241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 28) >> 2] = i3; 63251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 20) >> 2] = 0; 63261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 16) >> 2] = 0; 63271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[60 >> 2] | 0; 63281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 1 << i3; 63291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 & i5 | 0) == 0) { 63301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = i4 | i5; 63311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = i2; 63321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 24) >> 2] = i6; 63331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 12) >> 2] = i2; 63341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 8) >> 2] = i2; 63351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 63361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[i6 >> 2] | 0; 63381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) == 31) { 63391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0; 63401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 63411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 25 - (i3 >>> 1) | 0; 63421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L225 : do { 63441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i25 | 0)) { 63451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i25 << i3; 63461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 63471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i4 + (i3 >>> 31 << 2) + 16 | 0; 63481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i6 >> 2] | 0; 63491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 63501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 63511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i25 | 0)) { 63531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i5; 63541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L225; 63551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 63561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 << 1; 63571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i5; 63581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 63611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 63621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 63631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = i2; 63641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 24) >> 2] = i4; 63651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 12) >> 2] = i2; 63661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 8) >> 2] = i2; 63671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L204; 63681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 63701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i4; 63711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 63731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i18 + 8 | 0; 63741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[i4 >> 2] | 0; 63751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[72 >> 2] | 0; 63761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i18 >>> 0 < i5 >>> 0) { 63771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 63781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < i5 >>> 0) { 63801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 63811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 63821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 12 >> 2] = i2; 63831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = i2; 63841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 8) >> 2] = i3; 63851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 12) >> 2] = i18; 63861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + (i12 + 24) >> 2] = 0; 63871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 63881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 63901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i25 + i12 | 0; 63911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i24 + 4 >> 2] = i32 | 3; 63921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i24 + (i32 + 4) | 0; 63931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1; 63941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 63951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 63961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i24 + 8 | 0; 63971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 63981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 63991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 64021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = -1; 64031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 64061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[64 >> 2] | 0; 64071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i12 >>> 0 > i18 >>> 0)) { 64081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i18 - i12 | 0; 64091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = HEAP32[76 >> 2] | 0; 64101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 > 15) { 64111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[76 >> 2] = i2 + i12; 64121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = i3; 64131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + (i12 + 4) >> 2] = i3 | 1; 64141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + i18 >> 2] = i3; 64151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 4 >> 2] = i12 | 3; 64161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 64171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = 0; 64181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[76 >> 2] = 0; 64191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 4 >> 2] = i18 | 3; 64201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i2 + (i18 + 4) | 0; 64211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1; 64221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i2 + 8 | 0; 64241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 64251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 64261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[68 >> 2] | 0; 64281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i12 >>> 0 < i18 >>> 0) { 64291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = i18 - i12 | 0; 64301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[68 >> 2] = i31; 64311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = HEAP32[80 >> 2] | 0; 64321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[80 >> 2] = i32 + i12; 64331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1; 64341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i32 + 4 >> 2] = i12 | 3; 64351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 + 8 | 0; 64361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 64371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 64381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 64401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[132] | 0) == 0) { 64411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = _sysconf(30) | 0; 64421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i18 + -1 & i18 | 0) == 0) { 64431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[536 >> 2] = i18; 64441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[532 >> 2] = i18; 64451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[540 >> 2] = -1; 64461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[544 >> 2] = -1; 64471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[548 >> 2] = 0; 64481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[500 >> 2] = 0; 64491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[132] = (_time(0) | 0) & -16 ^ 1431655768; 64501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 64511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 64521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 64531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 64561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i12 + 48 | 0; 64571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = HEAP32[536 >> 2] | 0; 64581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = i12 + 47 | 0; 64591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = i25 + i21 | 0; 64601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 0 - i25 | 0; 64611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i22 & i25; 64621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i18 >>> 0 > i12 >>> 0)) { 64631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = 0; 64641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 64651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 64661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = HEAP32[496 >> 2] | 0; 64681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i24 | 0) != 0 ? (i31 = HEAP32[488 >> 2] | 0, i32 = i31 + i18 | 0, i32 >>> 0 <= i31 >>> 0 | i32 >>> 0 > i24 >>> 0) : 0) { 64691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = 0; 64701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 64711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 64721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L269 : do { 64741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[500 >> 2] & 4 | 0) == 0) { 64751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = HEAP32[80 >> 2] | 0; 64761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L271 : do { 64771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i26 | 0) != 0) { 64781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = 504 | 0; 64791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 64801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i27 = HEAP32[i24 >> 2] | 0; 64811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i27 >>> 0 > i26 >>> 0) ? (i23 = i24 + 4 | 0, (i27 + (HEAP32[i23 >> 2] | 0) | 0) >>> 0 > i26 >>> 0) : 0) { 64821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 64831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = HEAP32[i24 + 8 >> 2] | 0; 64851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i24 | 0) == 0) { 64861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 182; 64871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L271; 64881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 64901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i24 | 0) != 0) { 64911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i22 - (HEAP32[68 >> 2] | 0) & i25; 64921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i25 >>> 0 < 2147483647) { 64931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = _sbrk(i25 | 0) | 0; 64941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = (i13 | 0) == ((HEAP32[i24 >> 2] | 0) + (HEAP32[i23 >> 2] | 0) | 0); 64951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = i13; 64961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i25; 64971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i23 = i26 ? i13 : -1; 64981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i26 ? i25 : 0; 64991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 191; 65001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 65011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 0; 65021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 65041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 182; 65051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 65071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 182; 65081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 65101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 65111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) == 182) { 65121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i23 = _sbrk(0) | 0; 65131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i23 | 0) != (-1 | 0)) { 65141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i23; 65151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = HEAP32[532 >> 2] | 0; 65161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i22 + -1 | 0; 65171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i25 & i24 | 0) == 0) { 65181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i18; 65191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 65201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i18 - i24 + (i25 + i24 & 0 - i22) | 0; 65211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = HEAP32[488 >> 2] | 0; 65231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i26 = i24 + i25 | 0; 65241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i25 >>> 0 > i12 >>> 0 & i25 >>> 0 < 2147483647) { 65251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = HEAP32[496 >> 2] | 0; 65261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i22 | 0) != 0 ? i26 >>> 0 <= i24 >>> 0 | i26 >>> 0 > i22 >>> 0 : 0) { 65271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 0; 65281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 65291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i22 = _sbrk(i25 | 0) | 0; 65311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = (i22 | 0) == (i23 | 0); 65321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i25; 65331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i23 = i13 ? i23 : -1; 65341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = i13 ? i25 : 0; 65351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 191; 65361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 65371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 0; 65381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 65401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 0; 65411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 65441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L291 : do { 65451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) == 191) { 65461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 0 - i24 | 0; 65471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i23 | 0) != (-1 | 0)) { 65481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i17 = i23; 65491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i25; 65501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 202; 65511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L269; 65521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 65541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i22 | 0) != (-1 | 0) & i24 >>> 0 < 2147483647 & i24 >>> 0 < i20 >>> 0 ? (i19 = HEAP32[536 >> 2] | 0, i19 = i21 - i24 + i19 & 0 - i19, i19 >>> 0 < 2147483647) : 0) { 65551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((_sbrk(i19 | 0) | 0) == (-1 | 0)) { 65561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _sbrk(i13 | 0) | 0; 65571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L291; 65581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 65591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i24 = i19 + i24 | 0; 65601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 65611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 65641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i22 | 0) != (-1 | 0)) { 65651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i17 = i22; 65661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i24; 65671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 202; 65681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L269; 65691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 65721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[500 >> 2] = HEAP32[500 >> 2] | 4; 65731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 199; 65741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 65751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i25 = 0; 65761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 199; 65771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 65791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((((i13 | 0) == 199 ? i18 >>> 0 < 2147483647 : 0) ? (i17 = _sbrk(i18 | 0) | 0, i16 = _sbrk(0) | 0, (i16 | 0) != (-1 | 0) & (i17 | 0) != (-1 | 0) & i17 >>> 0 < i16 >>> 0) : 0) ? (i15 = i16 - i17 | 0, i14 = i15 >>> 0 > (i12 + 40 | 0) >>> 0, i14) : 0) { 65801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i14 ? i15 : i25; 65811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 202; 65821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) == 202) { 65841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = (HEAP32[488 >> 2] | 0) + i14 | 0; 65851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[488 >> 2] = i15; 65861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i15 >>> 0 > (HEAP32[492 >> 2] | 0) >>> 0) { 65871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[492 >> 2] = i15; 65881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 65891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = HEAP32[80 >> 2] | 0; 65901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L311 : do { 65911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) != 0) { 65921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = 504 | 0; 65931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 65941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = HEAP32[i21 >> 2] | 0; 65951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = i21 + 4 | 0; 65961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = HEAP32[i19 >> 2] | 0; 65971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i17 | 0) == (i16 + i20 | 0)) { 65981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 214; 65991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 66001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[i21 + 8 >> 2] | 0; 66021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i18 | 0) == 0) { 66031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 66041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 66051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = i18; 66061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (((i13 | 0) == 214 ? (HEAP32[i21 + 12 >> 2] & 8 | 0) == 0 : 0) ? i15 >>> 0 >= i16 >>> 0 & i15 >>> 0 < i17 >>> 0 : 0) { 66091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i19 >> 2] = i20 + i14; 66101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = (HEAP32[68 >> 2] | 0) + i14 | 0; 66111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i15 + 8 | 0; 66121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 & 7 | 0) == 0) { 66131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0; 66141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 66151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0 - i3 & 7; 66161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i2 - i3 | 0; 66181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[80 >> 2] = i15 + i3; 66191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[68 >> 2] = i32; 66201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + (i3 + 4) >> 2] = i32 | 1; 66211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + (i2 + 4) >> 2] = 40; 66221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[84 >> 2] = HEAP32[544 >> 2]; 66231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 66241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i17 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 66261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[72 >> 2] = i17; 66271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = i17 + i14 | 0; 66291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = 504 | 0; 66301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 66311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i16 >> 2] | 0) == (i19 | 0)) { 66321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 224; 66331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 66341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[i16 + 8 >> 2] | 0; 66361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i18 | 0) == 0) { 66371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 66381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 66391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i18; 66401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) == 224 ? (HEAP32[i16 + 12 >> 2] & 8 | 0) == 0 : 0) { 66431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i16 >> 2] = i17; 66441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i16 + 4 | 0; 66451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i14; 66461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i17 + 8 | 0; 66471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 & 7 | 0) == 0) { 66481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 0; 66491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 66501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 0 - i6 & 7; 66511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i17 + (i14 + 8) | 0; 66531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 & 7 | 0) == 0) { 66541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 0; 66551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 66561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 0 - i7 & 7; 66571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = i17 + (i13 + i14) | 0; 66591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i6 + i12 | 0; 66601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i17 + i8 | 0; 66611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i15 - (i17 + i6) - i12 | 0; 66621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i6 + 4) >> 2] = i12 | 3; 66631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L348 : do { 66641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) != (HEAP32[80 >> 2] | 0)) { 66651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) == (HEAP32[76 >> 2] | 0)) { 66661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = (HEAP32[64 >> 2] | 0) + i10 | 0; 66671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = i32; 66681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[76 >> 2] = i7; 66691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1; 66701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i32 + i8) >> 2] = i32; 66711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 66721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i14 + 4 | 0; 66741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[i17 + (i12 + i13) >> 2] | 0; 66751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i18 & 3 | 0) == 1) { 66761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i18 & -8; 66771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i18 >>> 3; 66781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 66791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i18 >>> 0 < 256)) { 66801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i17 + ((i13 | 24) + i14) >> 2] | 0; 66811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0; 66821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 66831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i19 | 0) == (i15 | 0)) { 66841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = i13 | 16; 66851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i17 + (i12 + i19) | 0; 66861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = HEAP32[i18 >> 2] | 0; 66871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i16 | 0) == 0) { 66881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i17 + (i19 + i14) | 0; 66891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = HEAP32[i18 >> 2] | 0; 66901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i16 | 0) == 0) { 66911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 0; 66921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 66931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 66951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 66961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i16 + 20 | 0; 66971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = HEAP32[i20 >> 2] | 0; 66981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i19 | 0) != 0) { 66991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i19; 67001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i20; 67011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 67021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = i16 + 16 | 0; 67041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = HEAP32[i19 >> 2] | 0; 67051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i20 | 0) == 0) { 67061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 67071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i20; 67091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i19; 67101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i18 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 67131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i18 >> 2] = 0; 67161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i16; 67171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 67181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0; 67211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i18 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 67221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i18 + 12 | 0; 67251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i16 >> 2] | 0) != (i15 | 0)) { 67261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i19 + 8 | 0; 67291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i20 >> 2] | 0) == (i15 | 0)) { 67301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i16 >> 2] = i19; 67311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i20 >> 2] = i18; 67321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i19; 67331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 67341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 67391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) != 0) { 67401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = HEAP32[i17 + (i14 + 28 + i13) >> 2] | 0; 67411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = 360 + (i16 << 2) | 0; 67421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) == (HEAP32[i18 >> 2] | 0)) { 67431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i18 >> 2] = i5; 67441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 67451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i16); 67461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 67471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 67501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i9 + 16 | 0; 67531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) { 67541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i16 >> 2] = i5; 67551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 + 20 >> 2] = i5; 67571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 67591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 67601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 67631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 24 >> 2] = i9; 67661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = i13 | 16; 67671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i17 + (i15 + i14) >> 2] | 0; 67681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 67691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) != 0) { 67701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 67711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 16 >> 2] = i9; 67741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 + 24 >> 2] = i5; 67751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 67761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 67791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i17 + (i12 + i15) >> 2] | 0; 67801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) != 0) { 67811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 67821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 20 >> 2] = i9; 67851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 + 24 >> 2] = i5; 67861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 67871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 67911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0; 67921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0; 67931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = 96 + (i16 << 1 << 2) | 0; 67941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) != (i18 | 0)) { 67951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 67961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 67971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 67981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i5 + 12 >> 2] | 0) != (i15 | 0)) { 67991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 68001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) == (i5 | 0)) { 68031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = HEAP32[14] & ~(1 << i16); 68041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 68051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) != (i18 | 0)) { 68071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i12 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 68081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 68091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i12 + 8 | 0; 68111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) { 68121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i16; 68131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 68141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 68151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 68171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i12 + 8 | 0; 68181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 12 >> 2] = i12; 68201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 >> 2] = i5; 68211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 68231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = i17 + ((i11 | i13) + i14) | 0; 68241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i11 + i10 | 0; 68251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i15 + 4 | 0; 68271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 >> 2] = HEAP32[i5 >> 2] & -2; 68281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 4) >> 2] = i10 | 1; 68291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i10 + i8) >> 2] = i10; 68301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i10 >>> 3; 68311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i10 >>> 0 < 256) { 68321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i5 << 1; 68331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = 96 + (i10 << 2) | 0; 68341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[14] | 0; 68351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 1 << i5; 68361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 & i5 | 0) != 0) { 68371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = 96 + (i10 + 2 << 2) | 0; 68381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i9 >> 2] | 0; 68391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 68401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 68411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 68421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i9; 68431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i5; 68441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 68461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = i9 | i5; 68471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 96 + (i10 + 2 << 2) | 0; 68481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i2; 68491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 >> 2] = i7; 68511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 + 12 >> 2] = i7; 68521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 8) >> 2] = i4; 68531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 12) >> 2] = i2; 68541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 68551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i10 >>> 8; 68571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) != 0) { 68581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i10 >>> 0 > 16777215) { 68591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 31; 68601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 68611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = (i3 + 1048320 | 0) >>> 16 & 8; 68621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i3 << i31; 68631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i30 = (i32 + 520192 | 0) >>> 16 & 4; 68641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 << i30; 68651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = (i32 + 245760 | 0) >>> 16 & 2; 68661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0; 68671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i10 >>> (i3 + 7 | 0) & 1 | i3 << 1; 68681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 68701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0; 68711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 360 + (i3 << 2) | 0; 68731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 28) >> 2] = i3; 68741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 20) >> 2] = 0; 68751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 16) >> 2] = 0; 68761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[60 >> 2] | 0; 68771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 1 << i3; 68781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 & i5 | 0) == 0) { 68791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = i9 | i5; 68801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = i7; 68811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 24) >> 2] = i4; 68821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 12) >> 2] = i7; 68831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 8) >> 2] = i7; 68841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 68851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[i4 >> 2] | 0; 68871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) == 31) { 68881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0; 68891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 68901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 25 - (i3 >>> 1) | 0; 68911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 68921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L444 : do { 68931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i10 | 0)) { 68941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i10 << i3; 68951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 68961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i4 + (i3 >>> 31 << 2) + 16 | 0; 68971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i5 >> 2] | 0; 68981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) == 0) { 68991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 69001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i9 + 4 >> 2] & -8 | 0) == (i10 | 0)) { 69021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i9; 69031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L444; 69041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 69051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 << 1; 69061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i9; 69071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i5 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 69101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 69111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 69121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 >> 2] = i7; 69131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 24) >> 2] = i4; 69141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 12) >> 2] = i7; 69151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 8) >> 2] = i7; 69161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L348; 69171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 69191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i4; 69201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 69221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i2 + 8 | 0; 69231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[i4 >> 2] | 0; 69241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[72 >> 2] | 0; 69251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i2 >>> 0 < i5 >>> 0) { 69261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 69271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < i5 >>> 0) { 69291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 69301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 69311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 12 >> 2] = i7; 69321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = i7; 69331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 8) >> 2] = i3; 69341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 12) >> 2] = i2; 69351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 24) >> 2] = 0; 69361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 69371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 69391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = (HEAP32[68 >> 2] | 0) + i10 | 0; 69401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[68 >> 2] = i32; 69411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[80 >> 2] = i7; 69421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1; 69431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 69451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i17 + (i6 | 8) | 0; 69461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 69471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 69481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 504 | 0; 69501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 69511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = HEAP32[i3 >> 2] | 0; 69521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i2 >>> 0 > i15 >>> 0) ? (i11 = HEAP32[i3 + 4 >> 2] | 0, i10 = i2 + i11 | 0, i10 >>> 0 > i15 >>> 0) : 0) { 69531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 69541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[i3 + 8 >> 2] | 0; 69561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i2 + (i11 + -39) | 0; 69581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 & 7 | 0) == 0) { 69591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0; 69601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 69611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0 - i3 & 7; 69621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 + (i11 + -47 + i3) | 0; 69641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 >>> 0 < (i15 + 16 | 0) >>> 0 ? i15 : i2; 69651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i2 + 8 | 0; 69661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i17 + 8 | 0; 69671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 & 7 | 0) == 0) { 69681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 0; 69691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 69701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 0 - i4 & 7; 69711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i14 + -40 - i4 | 0; 69731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[80 >> 2] = i17 + i4; 69741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[68 >> 2] = i32; 69751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i4 + 4) >> 2] = i32 | 1; 69761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i14 + -36) >> 2] = 40; 69771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[84 >> 2] = HEAP32[544 >> 2]; 69781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 4 >> 2] = 27; 69791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 0 >> 2] = HEAP32[504 >> 2]; 69801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 4 >> 2] = HEAP32[508 >> 2]; 69811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 8 >> 2] = HEAP32[512 >> 2]; 69821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 12 >> 2] = HEAP32[516 >> 2]; 69831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[504 >> 2] = i17; 69841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[508 >> 2] = i14; 69851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[516 >> 2] = 0; 69861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[512 >> 2] = i3; 69871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i2 + 28 | 0; 69881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = 7; 69891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i2 + 32 | 0) >>> 0 < i10 >>> 0) { 69901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 69911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i4 + 4 | 0; 69921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 >> 2] = 7; 69931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 + 8 | 0) >>> 0 < i10 >>> 0) { 69941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i3; 69951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 69961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 69971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 69991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i2 | 0) != (i15 | 0)) { 70011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 - i15 | 0; 70021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i15 + (i2 + 4) | 0; 70031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 >> 2] = HEAP32[i3 >> 2] & -2; 70041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 4 >> 2] = i2 | 1; 70051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + i2 >> 2] = i2; 70061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i2 >>> 3; 70071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i2 >>> 0 < 256) { 70081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i3 << 1; 70091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = 96 + (i4 << 2) | 0; 70101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[14] | 0; 70111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 1 << i3; 70121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 & i3 | 0) != 0) { 70131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 96 + (i4 + 2 << 2) | 0; 70141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[i4 >> 2] | 0; 70151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 70161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 70171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 70181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i4; 70191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i3; 70201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 70221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = i5 | i3; 70231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 96 + (i4 + 2 << 2) | 0; 70241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i2; 70251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i7 >> 2] = i15; 70271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i8 + 12 >> 2] = i15; 70281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 8 >> 2] = i8; 70291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 12 >> 2] = i2; 70301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 70311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i2 >>> 8; 70331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) != 0) { 70341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i2 >>> 0 > 16777215) { 70351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 31; 70361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 70371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = (i3 + 1048320 | 0) >>> 16 & 8; 70381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i3 << i31; 70391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i30 = (i32 + 520192 | 0) >>> 16 & 4; 70401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 << i30; 70411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = (i32 + 245760 | 0) >>> 16 & 2; 70421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0; 70431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i2 >>> (i3 + 7 | 0) & 1 | i3 << 1; 70441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 70461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0; 70471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 360 + (i3 << 2) | 0; 70491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 28 >> 2] = i3; 70501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 20 >> 2] = 0; 70511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 16 >> 2] = 0; 70521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[60 >> 2] | 0; 70531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 1 << i3; 70541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 & i5 | 0) == 0) { 70551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = i4 | i5; 70561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i7 >> 2] = i15; 70571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 24 >> 2] = i7; 70581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 12 >> 2] = i15; 70591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 8 >> 2] = i15; 70601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 70611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[i7 >> 2] | 0; 70631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) == 31) { 70641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 0; 70651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 70661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 25 - (i3 >>> 1) | 0; 70671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L499 : do { 70691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i2 | 0)) { 70701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i2 << i3; 70711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 70721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i4 + (i3 >>> 31 << 2) + 16 | 0; 70731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i7 >> 2] | 0; 70741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 70751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 70761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i2 | 0)) { 70781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i5; 70791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L499; 70801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 70811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 << 1; 70821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i5; 70831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i7 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 70861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 70871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 70881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i7 >> 2] = i15; 70891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 24 >> 2] = i4; 70901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 12 >> 2] = i15; 70911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 8 >> 2] = i15; 70921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L311; 70931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 70951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i4; 70961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 70971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 70981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i6 + 8 | 0; 70991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP32[i4 >> 2] | 0; 71001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = HEAP32[72 >> 2] | 0; 71011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i6 >>> 0 < i2 >>> 0) { 71021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 71031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < i2 >>> 0) { 71051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 71061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 71071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 + 12 >> 2] = i15; 71081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = i15; 71091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 8 >> 2] = i3; 71101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 12 >> 2] = i6; 71111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 24 >> 2] = 0; 71121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 71131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 71161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = HEAP32[72 >> 2] | 0; 71171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i32 | 0) == 0 | i17 >>> 0 < i32 >>> 0) { 71181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[72 >> 2] = i17; 71191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[504 >> 2] = i17; 71211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[508 >> 2] = i14; 71221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[516 >> 2] = 0; 71231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[92 >> 2] = HEAP32[132]; 71241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[88 >> 2] = -1; 71251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = 0; 71261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 71271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i2 << 1; 71281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = 96 + (i32 << 2) | 0; 71291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[96 + (i32 + 3 << 2) >> 2] = i31; 71301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[96 + (i32 + 2 << 2) >> 2] = i31; 71311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 + 1 | 0; 71321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i2 | 0) != 32); 71331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i17 + 8 | 0; 71341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i2 & 7 | 0) == 0) { 71351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = 0; 71361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 71371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = 0 - i2 & 7; 71381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i14 + -40 - i2 | 0; 71401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[80 >> 2] = i17 + i2; 71411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[68 >> 2] = i32; 71421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i2 + 4) >> 2] = i32 | 1; 71431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + (i14 + -36) >> 2] = 40; 71441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[84 >> 2] = HEAP32[544 >> 2]; 71451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 71471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = HEAP32[68 >> 2] | 0; 71481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i2 >>> 0 > i12 >>> 0) { 71491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i31 = i2 - i12 | 0; 71501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[68 >> 2] = i31; 71511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = HEAP32[80 >> 2] | 0; 71521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[80 >> 2] = i32 + i12; 71531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1; 71541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i32 + 4 >> 2] = i12 | 3; 71551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = i32 + 8 | 0; 71561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 71571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 71581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[(___errno_location() | 0) >> 2] = 12; 71611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i32 = 0; 71621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 71631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i32 | 0; 71641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 71651b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _free(i7) { 71661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 | 0; 71671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0; 71681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = STACKTOP; 71691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) == 0) { 71701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 71711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 71721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = i7 + -8 | 0; 71741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = HEAP32[72 >> 2] | 0; 71751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i15 >>> 0 < i16 >>> 0) { 71761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 71771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = HEAP32[i7 + -4 >> 2] | 0; 71791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i13 & 3; 71801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) == 1) { 71811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 71821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i13 & -8; 71841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i7 + (i8 + -8) | 0; 71851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 71861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 & 1 | 0) == 0) { 71871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = HEAP32[i15 >> 2] | 0; 71881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) == 0) { 71891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 71901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 71911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = -8 - i19 | 0; 71931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = i7 + i15 | 0; 71941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i19 + i8 | 0; 71951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i13 >>> 0 < i16 >>> 0) { 71961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 71971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 71981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) == (HEAP32[76 >> 2] | 0)) { 71991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i7 + (i8 + -4) | 0; 72001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i2 >> 2] & 3 | 0) != 3) { 72011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i13; 72021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i12; 72031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 72041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = i12; 72061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 >> 2] = HEAP32[i2 >> 2] & -2; 72071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i7 + (i15 + 4) >> 2] = i12 | 1; 72081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = i12; 72091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 72101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 72111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i19 >>> 3; 72131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i19 >>> 0 < 256) { 72141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = HEAP32[i7 + (i15 + 8) >> 2] | 0; 72151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = HEAP32[i7 + (i15 + 12) >> 2] | 0; 72161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = 96 + (i18 << 1 << 2) | 0; 72171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i2 | 0) != (i14 | 0)) { 72181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i2 >>> 0 < i16 >>> 0) { 72191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 72201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i2 + 12 >> 2] | 0) != (i13 | 0)) { 72221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 72231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i11 | 0) == (i2 | 0)) { 72261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = HEAP32[14] & ~(1 << i18); 72271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i13; 72281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i12; 72291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 72301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i11 | 0) != (i14 | 0)) { 72321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i11 >>> 0 < i16 >>> 0) { 72331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 72341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i11 + 8 | 0; 72361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i14 >> 2] | 0) == (i13 | 0)) { 72371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i17 = i14; 72381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 72391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 72401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 72421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i17 = i11 + 8 | 0; 72431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 12 >> 2] = i11; 72451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 >> 2] = i2; 72461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i13; 72471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i12; 72481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 72491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i17 = HEAP32[i7 + (i15 + 24) >> 2] | 0; 72511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[i7 + (i15 + 12) >> 2] | 0; 72521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 72531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i18 | 0) == (i13 | 0)) { 72541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = i7 + (i15 + 20) | 0; 72551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[i19 >> 2] | 0; 72561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i18 | 0) == 0) { 72571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = i7 + (i15 + 16) | 0; 72581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[i19 >> 2] | 0; 72591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i18 | 0) == 0) { 72601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = 0; 72611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 72621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 72651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = i18 + 20 | 0; 72661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = HEAP32[i21 >> 2] | 0; 72671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i20 | 0) != 0) { 72681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i20; 72691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = i21; 72701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 72711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i18 + 16 | 0; 72731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = HEAP32[i20 >> 2] | 0; 72741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i21 | 0) == 0) { 72751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 72761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 72771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i21; 72781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = i20; 72791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i19 >>> 0 < i16 >>> 0) { 72821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 72831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 72841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i19 >> 2] = 0; 72851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i18; 72861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 72871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 72891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = HEAP32[i7 + (i15 + 8) >> 2] | 0; 72901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i19 >>> 0 < i16 >>> 0) { 72911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 72921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i19 + 12 | 0; 72941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i16 >> 2] | 0) != (i13 | 0)) { 72951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 72961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 72971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i18 + 8 | 0; 72981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i20 >> 2] | 0) == (i13 | 0)) { 72991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i16 >> 2] = i18; 73001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i20 >> 2] = i19; 73011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i18; 73021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 73031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 73041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 73051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 73081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i17 | 0) != 0) { 73091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = HEAP32[i7 + (i15 + 28) >> 2] | 0; 73101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = 360 + (i18 << 2) | 0; 73111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) == (HEAP32[i16 >> 2] | 0)) { 73121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i16 >> 2] = i14; 73131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i14 | 0) == 0) { 73141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i18); 73151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i13; 73161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i12; 73171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 73181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 73201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i17 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 73211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 73221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i17 + 16 | 0; 73241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i16 >> 2] | 0) == (i13 | 0)) { 73251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i16 >> 2] = i14; 73261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 73271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i17 + 20 >> 2] = i14; 73281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i14 | 0) == 0) { 73301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i13; 73311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i12; 73321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 73331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i14 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 73361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 73371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i14 + 24 >> 2] = i17; 73391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = HEAP32[i7 + (i15 + 16) >> 2] | 0; 73401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 73411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i16 | 0) != 0) { 73421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i16 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 73431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 73441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 73451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i14 + 16 >> 2] = i16; 73461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i16 + 24 >> 2] = i14; 73471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 73481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 73511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = HEAP32[i7 + (i15 + 20) >> 2] | 0; 73521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) != 0) { 73531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i15 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 73541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 73551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 73561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i14 + 20 >> 2] = i15; 73571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i15 + 24 >> 2] = i14; 73581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i13; 73591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i12; 73601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 73611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 73631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i13; 73641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i12; 73651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 73671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i13; 73681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i12; 73691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 73711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i15; 73721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i8; 73731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 73751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i2 >>> 0 < i6 >>> 0)) { 73761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 73771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i7 + (i8 + -4) | 0; 73791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = HEAP32[i12 >> 2] | 0; 73801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 & 1 | 0) == 0) { 73811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 73821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 & 2 | 0) == 0) { 73841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) == (HEAP32[80 >> 2] | 0)) { 73851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = (HEAP32[68 >> 2] | 0) + i11 | 0; 73861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[68 >> 2] = i21; 73871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[80 >> 2] = i2; 73881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 4 >> 2] = i21 | 1; 73891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i2 | 0) != (HEAP32[76 >> 2] | 0)) { 73901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 73911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 73921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[76 >> 2] = 0; 73941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = 0; 73951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 73961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 73971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 73981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) == (HEAP32[76 >> 2] | 0)) { 73991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = (HEAP32[64 >> 2] | 0) + i11 | 0; 74001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = i21; 74011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[76 >> 2] = i2; 74021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 4 >> 2] = i21 | 1; 74031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + i21 >> 2] = i21; 74041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 74051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 74061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = (i13 & -8) + i11 | 0; 74081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i13 >>> 3; 74091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 74101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!(i13 >>> 0 < 256)) { 74111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = HEAP32[i7 + (i8 + 16) >> 2] | 0; 74121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = HEAP32[i7 + (i8 | 4) >> 2] | 0; 74131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 74141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) == (i6 | 0)) { 74151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = i7 + (i8 + 12) | 0; 74161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = HEAP32[i13 >> 2] | 0; 74171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) == 0) { 74181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = i7 + (i8 + 8) | 0; 74191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = HEAP32[i13 >> 2] | 0; 74201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) == 0) { 74211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = 0; 74221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 74231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 74261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i12 + 20 | 0; 74271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = HEAP32[i14 >> 2] | 0; 74281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) != 0) { 74291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i15; 74301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = i14; 74311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue; 74321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i12 + 16 | 0; 74341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = HEAP32[i14 >> 2] | 0; 74351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) == 0) { 74361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 74371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 74381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i15; 74391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = i14; 74401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i13 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 74431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 74441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 74451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i13 >> 2] = 0; 74461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i12; 74471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 74481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 74501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = HEAP32[i7 + i8 >> 2] | 0; 74511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i13 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 74521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 74531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i13 + 12 | 0; 74551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i14 >> 2] | 0) != (i6 | 0)) { 74561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 74571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i15 + 8 | 0; 74591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) { 74601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i14 >> 2] = i15; 74611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i12 >> 2] = i13; 74621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i15; 74631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 74641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 74651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 74661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 74691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i10 | 0) != 0) { 74701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = HEAP32[i7 + (i8 + 20) >> 2] | 0; 74711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = 360 + (i12 << 2) | 0; 74721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) == (HEAP32[i13 >> 2] | 0)) { 74731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i13 >> 2] = i9; 74741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) == 0) { 74751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = HEAP32[60 >> 2] & ~(1 << i12); 74761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 74771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 74791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i10 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 74801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 74811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i10 + 16 | 0; 74831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) { 74841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i12 >> 2] = i9; 74851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 74861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i10 + 20 >> 2] = i9; 74871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) == 0) { 74891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 74901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 74931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 74941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 74951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 + 24 >> 2] = i10; 74961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[i7 + (i8 + 8) >> 2] | 0; 74971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 74981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) != 0) { 74991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 75001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 75011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 + 16 >> 2] = i6; 75031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 + 24 >> 2] = i9; 75041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 75051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 75081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[i7 + (i8 + 12) >> 2] | 0; 75091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) != 0) { 75101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 75111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 75121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 + 20 >> 2] = i6; 75141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 + 24 >> 2] = i9; 75151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 75161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i7 + i8 >> 2] | 0; 75211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i7 + (i8 | 4) >> 2] | 0; 75221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 96 + (i12 << 1 << 2) | 0; 75231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) != (i8 | 0)) { 75241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i9 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 75251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 75261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i9 + 12 >> 2] | 0) != (i6 | 0)) { 75281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 75291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) == (i9 | 0)) { 75321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = HEAP32[14] & ~(1 << i12); 75331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 75341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) != (i8 | 0)) { 75361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i7 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 75371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 75381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i7 + 8 | 0; 75401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i8 >> 2] | 0) == (i6 | 0)) { 75411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i8; 75421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 75441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i7 + 8 | 0; 75471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 + 12 >> 2] = i7; 75491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i10 >> 2] = i9; 75501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 75521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 4 >> 2] = i11 | 1; 75531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + i11 >> 2] = i11; 75541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i2 | 0) == (HEAP32[76 >> 2] | 0)) { 75551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[64 >> 2] = i11; 75561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 75571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 75581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i12 >> 2] = i13 & -2; 75611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 4 >> 2] = i11 | 1; 75621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + i11 >> 2] = i11; 75631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i11 >>> 3; 75651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i11 >>> 0 < 256) { 75661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i6 << 1; 75671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 96 + (i7 << 2) | 0; 75681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = HEAP32[14] | 0; 75691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 1 << i6; 75701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 & i6 | 0) != 0) { 75711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 96 + (i7 + 2 << 2) | 0; 75721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i6 >> 2] | 0; 75731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i7 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 75741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 75751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i6; 75771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i7; 75781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[14] = i8 | i6; 75811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 96 + (i7 + 2 << 2) | 0; 75821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i3; 75831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = i2; 75851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + 12 >> 2] = i2; 75861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 8 >> 2] = i5; 75871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 12 >> 2] = i3; 75881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 75891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 75901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 75911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i11 >>> 8; 75921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 | 0) != 0) { 75931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i11 >>> 0 > 16777215) { 75941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 31; 75951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 75961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = (i4 + 1048320 | 0) >>> 16 & 8; 75971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = i4 << i20; 75981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = (i21 + 520192 | 0) >>> 16 & 4; 75991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = i21 << i19; 76001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = (i21 + 245760 | 0) >>> 16 & 2; 76011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 14 - (i19 | i20 | i4) + (i21 << i4 >>> 15) | 0; 76021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i11 >>> (i4 + 7 | 0) & 1 | i4 << 1; 76031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 0; 76061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 360 + (i4 << 2) | 0; 76081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 28 >> 2] = i4; 76091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 20 >> 2] = 0; 76101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 16 >> 2] = 0; 76111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[60 >> 2] | 0; 76121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 1 << i4; 76131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L199 : do { 76141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 & i6 | 0) != 0) { 76151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i5 >> 2] | 0; 76161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 | 0) == 31) { 76171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 0; 76181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 25 - (i4 >>> 1) | 0; 76201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L205 : do { 76221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i5 + 4 >> 2] & -8 | 0) != (i11 | 0)) { 76231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i11 << i4; 76241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i5; 76251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 76261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i7 + (i4 >>> 31 << 2) + 16 | 0; 76271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = HEAP32[i6 >> 2] | 0; 76281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i5 | 0) == 0) { 76291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 76301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i11 | 0)) { 76321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i5; 76331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L205; 76341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i4 << 1; 76361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i5; 76371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i6 >>> 0 < (HEAP32[72 >> 2] | 0) >>> 0) { 76401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 76411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 >> 2] = i2; 76431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 24 >> 2] = i7; 76441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 12 >> 2] = i2; 76451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 8 >> 2] = i2; 76461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L199; 76471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i5; 76501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 76521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i3 + 8 | 0; 76531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = HEAP32[i5 >> 2] | 0; 76541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[72 >> 2] | 0; 76551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i3 >>> 0 < i6 >>> 0) { 76561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 76571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i4 >>> 0 < i6 >>> 0) { 76591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _abort(); 76601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 + 12 >> 2] = i2; 76621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 >> 2] = i2; 76631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 8 >> 2] = i4; 76641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 12 >> 2] = i3; 76651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 24 >> 2] = 0; 76661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 76671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[60 >> 2] = i7 | i6; 76701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 >> 2] = i2; 76711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 24 >> 2] = i5; 76721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 12 >> 2] = i2; 76731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i2 + 8 >> 2] = i2; 76741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 76761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i21 = (HEAP32[88 >> 2] | 0) + -1 | 0; 76771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[88 >> 2] = i21; 76781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i21 | 0) == 0) { 76791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = 512 | 0; 76801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 76821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 76831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 76851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = HEAP32[i2 >> 2] | 0; 76861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i2 | 0) == 0) { 76871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 76881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 76891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 + 8 | 0; 76901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 76921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[88 >> 2] = -1; 76931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 76941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 76951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 76961b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction __Z15fannkuch_workerPv(i9) { 76971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i9 | 0; 76981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i10 = 0, i11 = 0, i12 = 0, i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0; 76991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = STACKTOP; 77001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = HEAP32[i9 + 4 >> 2] | 0; 77011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i7 << 2; 77021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = _malloc(i6) | 0; 77031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = _malloc(i6) | 0; 77041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = _malloc(i6) | 0; 77051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = (i7 | 0) > 0; 77061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i10) { 77071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 0; 77081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 77091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i8 << 2) >> 2] = i8; 77101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i8 + 1 | 0; 77111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i8 | 0) != (i7 | 0)); 77121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i7 + -1 | 0; 77131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i17 = HEAP32[i9 >> 2] | 0; 77141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i17 << 2) >> 2] = i8; 77151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i5 + (i8 << 2) | 0; 77161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 >> 2] = i17; 77171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i10) { 77181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i7 << 2; 77191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = 0; 77201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i7; 77211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L7 : while (1) { 77221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) > 1) { 77231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 77241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = i12 + -1 | 0; 77251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 + (i13 << 2) >> 2] = i12; 77261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) > 1) { 77271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i13; 77281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 77291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = 1; 77301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 77311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = HEAP32[i5 >> 2] | 0; 77351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) != 0 ? (HEAP32[i9 >> 2] | 0) != (i8 | 0) : 0) { 77361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _memcpy(i2 | 0, i5 | 0, i10 | 0) | 0; 77371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = 0; 77381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = HEAP32[i2 >> 2] | 0; 77391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 77401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i17 = i14 + -1 | 0; 77411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i17 | 0) > 1) { 77421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = 1; 77431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 77441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i2 + (i16 << 2) | 0; 77451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = HEAP32[i20 >> 2] | 0; 77461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i2 + (i17 << 2) | 0; 77471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i20 >> 2] = HEAP32[i18 >> 2]; 77481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i18 >> 2] = i19; 77491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = i16 + 1 | 0; 77501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i17 = i17 + -1 | 0; 77511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i16 | 0) < (i17 | 0)); 77521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = i15 + 1 | 0; 77541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i2 + (i14 << 2) | 0; 77551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i16 = HEAP32[i20 >> 2] | 0; 77561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i20 >> 2] = i14; 77571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i16 | 0) == 0) { 77581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 77591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 77601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i16; 77611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = (i11 | 0) < (i15 | 0) ? i15 : i11; 77641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) >= (i8 | 0)) { 77661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 34; 77671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 77681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 77701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) > 0) { 77711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = 0; 77721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 77731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i15 = i14 + 1 | 0; 77741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i14 << 2) >> 2] = HEAP32[i5 + (i15 << 2) >> 2]; 77751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i15 | 0) == (i12 | 0)) { 77761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i12; 77771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 77781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 77791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i15; 77801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 77831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = 0; 77841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i14 << 2) >> 2] = i13; 77861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i6 + (i12 << 2) | 0; 77871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = (HEAP32[i14 >> 2] | 0) + -1 | 0; 77881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i14 >> 2] = i20; 77891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i14 = i12 + 1 | 0; 77901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i20 | 0) > 0) { 77911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue L7; 77921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i14 | 0) >= (i8 | 0)) { 77941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 34; 77951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L7; 77961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 77971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = HEAP32[i5 >> 2] | 0; 77981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i14; 77991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) == 34) { 78021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i5); 78031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i2); 78041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i6); 78051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i3; 78061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i11 | 0; 78071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 78091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i9; 78101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i8; 78111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 78131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i7 + -1 | 0; 78141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = HEAP32[i9 >> 2] | 0; 78151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i20 << 2) >> 2] = i4; 78161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i5 + (i4 << 2) | 0; 78171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i1 >> 2] = i20; 78181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = 0; 78201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L36 : while (1) { 78211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) > 1) { 78221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 78231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i7 + -1 | 0; 78241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 + (i8 << 2) >> 2] = i7; 78251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) > 1) { 78261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i8; 78271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 78281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 1; 78291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 78301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = HEAP32[i5 >> 2] | 0; 78341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) != 0 ? (HEAP32[i1 >> 2] | 0) != (i4 | 0) : 0) { 78351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = 0; 78361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i2 >> 2] | 0; 78371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 78381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = i9 + -1 | 0; 78391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i13 | 0) > 1) { 78401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = 1; 78411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 78421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i18 = i2 + (i12 << 2) | 0; 78431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i19 = HEAP32[i18 >> 2] | 0; 78441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i2 + (i13 << 2) | 0; 78451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i18 >> 2] = HEAP32[i20 >> 2]; 78461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i20 >> 2] = i19; 78471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = i12 + 1 | 0; 78481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i13 = i13 + -1 | 0; 78491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i12 | 0) < (i13 | 0)); 78501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i10 + 1 | 0; 78521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = i2 + (i9 << 2) | 0; 78531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i12 = HEAP32[i20 >> 2] | 0; 78541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i20 >> 2] = i9; 78551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i12 | 0) == 0) { 78561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 78571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 78581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i12; 78591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = (i11 | 0) < (i10 | 0) ? i10 : i11; 78621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) >= (i4 | 0)) { 78641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 34; 78651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 78661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 78681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) > 0) { 78691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = 0; 78701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 78711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i9 + 1 | 0; 78721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i9 << 2) >> 2] = HEAP32[i5 + (i10 << 2) >> 2]; 78731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i10 | 0) == (i7 | 0)) { 78741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i7; 78751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 78761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 78771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i10; 78781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 78811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = 0; 78821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i9 << 2) >> 2] = i8; 78841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i6 + (i7 << 2) | 0; 78851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i20 = (HEAP32[i9 >> 2] | 0) + -1 | 0; 78861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 >> 2] = i20; 78871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i7 + 1 | 0; 78881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i20 | 0) > 0) { 78891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch continue L36; 78901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) >= (i4 | 0)) { 78921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 34; 78931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L36; 78941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = HEAP32[i5 >> 2] | 0; 78961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i9; 78971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 78991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) == 34) { 79001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i5); 79011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i2); 79021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i6); 79031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i3; 79041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i11 | 0; 79051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return 0; 79071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 79081b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _main(i3, i5) { 79091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 | 0; 79101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i5 | 0; 79111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i1 = 0, i2 = 0, i4 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0; 79121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = STACKTOP; 79131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = STACKTOP + 16 | 0; 79141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i2; 79151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L1 : do { 79161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) > 1) { 79171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = HEAP8[HEAP32[i5 + 4 >> 2] | 0] | 0; 79181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch switch (i3 | 0) { 79191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 50: 79201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch { 79211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 10; 79221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L1; 79231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 51: 79251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch { 79261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 4; 79271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L1; 79281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 52: 79301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch { 79311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 11; 79321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L1; 79331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 53: 79351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch { 79361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 12; 79371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L1; 79381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 49: 79401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch { 79411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 9; 79421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L1; 79431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case 48: 79451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch { 79461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = 0; 79471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i2; 79481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i11 | 0; 79491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch default: 79511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch { 79521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i1 >> 2] = i3 + -48; 79531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _printf(8, i1 | 0) | 0; 79541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = -1; 79551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i2; 79561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i11 | 0; 79571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 79601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = 4; 79611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while (0); 79631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 | 0) == 4) { 79641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = 11; 79651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i3 + -1 | 0; 79671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = 0; 79681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 0; 79691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 79701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = _malloc(12) | 0; 79711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 >> 2] = i7; 79721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 + 4 >> 2] = i3; 79731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i4 + 8 >> 2] = i6; 79741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 + 1 | 0; 79751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i7 | 0) == (i5 | 0)) { 79761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 79771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 79781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i4; 79791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 79811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i3 << 2; 79821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = _malloc(i5) | 0; 79831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = _malloc(i5) | 0; 79841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 0; 79851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 79861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 + (i7 << 2) >> 2] = i7; 79871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 + 1 | 0; 79881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i7 | 0) != (i3 | 0)); 79891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i3; 79901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = 30; 79911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch L19 : do { 79921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = 0; 79931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch do { 79941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i1 >> 2] = (HEAP32[i6 + (i9 << 2) >> 2] | 0) + 1; 79951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _printf(48, i1 | 0) | 0; 79961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i9 + 1 | 0; 79971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i9 | 0) != (i3 | 0)); 79981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _putchar(10) | 0; 79991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i7 + -1 | 0; 80001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) <= 1) { 80011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) == (i3 | 0)) { 80021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 80031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 80051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 80061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i8 + -1 | 0; 80071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i5 + (i9 << 2) >> 2] = i8; 80081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) > 1) { 80091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i9; 80101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 80111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = 1; 80121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 80131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 80171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = HEAP32[i6 >> 2] | 0; 80181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i8 | 0) > 0) { 80191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = 0; 80201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 80211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i11 + 1 | 0; 80221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 + (i11 << 2) >> 2] = HEAP32[i6 + (i10 << 2) >> 2]; 80231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i10 | 0) == (i8 | 0)) { 80241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = i8; 80251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 80261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 80271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = i10; 80281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 80311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i10 = 0; 80321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i6 + (i10 << 2) >> 2] = i9; 80341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i5 + (i8 << 2) | 0; 80351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = (HEAP32[i9 >> 2] | 0) + -1 | 0; 80361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i9 >> 2] = i11; 80371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i9 = i8 + 1 | 0; 80381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i11 | 0) > 0) { 80391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 80401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i9 | 0) == (i3 | 0)) { 80421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break L19; 80431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 80441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i8 = i9; 80451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } while ((i7 | 0) != 0); 80481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i6); 80491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i5); 80501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i4 | 0) == 0) { 80511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 0; 80521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 80531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = 0; 80541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (1) { 80551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = __Z15fannkuch_workerPv(i4) | 0; 80561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = (i5 | 0) < (i6 | 0) ? i6 : i5; 80571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = HEAP32[i4 + 8 >> 2] | 0; 80581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _free(i4); 80591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i6 | 0) == 0) { 80601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch break; 80611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 80621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i6; 80631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i1 >> 2] = i3; 80671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i1 + 4 >> 2] = i5; 80681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch _printf(24, i1 | 0) | 0; 80691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i11 = 0; 80701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i2; 80711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i11 | 0; 80721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 80731b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _memcpy(i3, i2, i1) { 80741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 | 0; 80751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 | 0; 80761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 80771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i4 = 0; 80781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i1 | 0) >= 4096) return _emscripten_memcpy_big(i3 | 0, i2 | 0, i1 | 0) | 0; 80791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i3 | 0; 80801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 & 3) == (i2 & 3)) { 80811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (i3 & 3) { 80821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i1 | 0) == 0) return i4 | 0; 80831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[i3] = HEAP8[i2] | 0; 80841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 + 1 | 0; 80851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 + 1 | 0; 80861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 - 1 | 0; 80871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while ((i1 | 0) >= 4) { 80891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i3 >> 2] = HEAP32[i2 >> 2]; 80901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 + 4 | 0; 80911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 + 4 | 0; 80921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 - 4 | 0; 80931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 80951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while ((i1 | 0) > 0) { 80961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[i3] = HEAP8[i2] | 0; 80971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 + 1 | 0; 80981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 + 1 | 0; 80991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 - 1 | 0; 81001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 81011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i4 | 0; 81021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81031b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _memset(i1, i4, i3) { 81041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i4 | 0; 81061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i3 = i3 | 0; 81071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i2 = 0, i5 = 0, i6 = 0, i7 = 0; 81081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i1 + i3 | 0; 81091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((i3 | 0) >= 20) { 81101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i4 = i4 & 255; 81111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i1 & 3; 81121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i6 = i4 | i4 << 8 | i4 << 16 | i4 << 24; 81131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i5 = i2 & ~3; 81141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (i7) { 81151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i7 = i1 + 4 - i7 | 0; 81161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while ((i1 | 0) < (i7 | 0)) { 81171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[i1] = i4; 81181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 + 1 | 0; 81191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 81201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 81211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while ((i1 | 0) < (i5 | 0)) { 81221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP32[i1 >> 2] = i6; 81231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 + 4 | 0; 81241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 81251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 81261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while ((i1 | 0) < (i2 | 0)) { 81271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[i1] = i4; 81281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 + 1 | 0; 81291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 81301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i1 - i3 | 0; 81311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81321b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction copyTempDouble(i1) { 81331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr] = HEAP8[i1]; 81351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0]; 81361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0]; 81371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0]; 81381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 4 | 0] = HEAP8[i1 + 4 | 0]; 81391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 5 | 0] = HEAP8[i1 + 5 | 0]; 81401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 6 | 0] = HEAP8[i1 + 6 | 0]; 81411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 7 | 0] = HEAP8[i1 + 7 | 0]; 81421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81431b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction copyTempFloat(i1) { 81441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr] = HEAP8[i1]; 81461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0]; 81471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0]; 81481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0]; 81491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81501b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction runPostSets() {} 81511b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction _strlen(i1) { 81521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i2 = 0; 81541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i1; 81551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (HEAP8[i2] | 0) { 81561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 + 1 | 0; 81571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 81581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i2 - i1 | 0; 81591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81601b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stackAlloc(i1) { 81611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var i2 = 0; 81631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = STACKTOP; 81641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = STACKTOP + i1 | 0; 81651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = STACKTOP + 7 & -8; 81661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return i2 | 0; 81671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81681b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setThrew(i1, i2) { 81691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i2 = i2 | 0; 81711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if ((__THREW__ | 0) == 0) { 81721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch __THREW__ = i1; 81731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch threwValue = i2; 81741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 81751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81761b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stackRestore(i1) { 81771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = i1; 81791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81801b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet9(i1) { 81811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet9 = i1; 81831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81841b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet8(i1) { 81851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet8 = i1; 81871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81881b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet7(i1) { 81891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet7 = i1; 81911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81921b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet6(i1) { 81931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet6 = i1; 81951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 81961b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet5(i1) { 81971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 81981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet5 = i1; 81991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82001b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet4(i1) { 82011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 82021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet4 = i1; 82031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82041b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet3(i1) { 82051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 82061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet3 = i1; 82071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82081b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet2(i1) { 82091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 82101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet2 = i1; 82111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82121b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet1(i1) { 82131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 82141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet1 = i1; 82151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82161b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction setTempRet0(i1) { 82171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch i1 = i1 | 0; 82181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch tempRet0 = i1; 82191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82201b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction stackSave() { 82211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return STACKTOP | 0; 82221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// EMSCRIPTEN_END_FUNCS 82251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return { _strlen: _strlen, _free: _free, _main: _main, _memset: _memset, _malloc: _malloc, _memcpy: _memcpy, runPostSets: runPostSets, stackAlloc: stackAlloc, stackSave: stackSave, stackRestore: stackRestore, setThrew: setThrew, setTempRet0: setTempRet0, setTempRet1: setTempRet1, setTempRet2: setTempRet2, setTempRet3: setTempRet3, setTempRet4: setTempRet4, setTempRet5: setTempRet5, setTempRet6: setTempRet6, setTempRet7: setTempRet7, setTempRet8: setTempRet8, setTempRet9: setTempRet9 }; 82281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}).toString(), 82291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// EMSCRIPTEN_END_ASM 82301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch{ "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array, "abort": abort, "assert": assert, "asmPrintInt": asmPrintInt, "asmPrintFloat": asmPrintFloat, "min": Math_min, "_fflush": _fflush, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_putchar": _putchar, "_fputc": _fputc, "_send": _send, "_pwrite": _pwrite, "_abort": _abort, "__reallyNegative": __reallyNegative, "_fwrite": _fwrite, "_sbrk": _sbrk, "_mkport": _mkport, "_fprintf": _fprintf, "___setErrNo": ___setErrNo, "__formatString": __formatString, "_fileno": _fileno, "_printf": _printf, "_time": _time, "_sysconf": _sysconf, "_write": _write, "___errno_location": ___errno_location, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity }, buffer); 82311b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _strlen = Module["_strlen"] = asm["_strlen"]; 82321b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _free = Module["_free"] = asm["_free"]; 82331b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _main = Module["_main"] = asm["_main"]; 82341b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _memset = Module["_memset"] = asm["_memset"]; 82351b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _malloc = Module["_malloc"] = asm["_malloc"]; 82361b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar _memcpy = Module["_memcpy"] = asm["_memcpy"]; 82371b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar runPostSets = Module["runPostSets"] = asm["runPostSets"]; 82381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82391b268ca467c924004286c97bac133db489cf43d0Ben MurdochRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) }; 82401b268ca467c924004286c97bac133db489cf43d0Ben MurdochRuntime.stackSave = function() { return asm['stackSave']() }; 82411b268ca467c924004286c97bac133db489cf43d0Ben MurdochRuntime.stackRestore = function(top) { asm['stackRestore'](top) }; 82421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included 82451b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar i64Math = null; 82461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// === Auto-generated postamble setup entry stuff === 82481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82491b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (memoryInitializer) { 82501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) { 82511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var data = Module['readBinary'](memoryInitializer); 82521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAPU8.set(data, STATIC_BASE); 82531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 82541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch addRunDependency('memory initializer'); 82551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Browser.asyncLoad(memoryInitializer, function(data) { 82561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch HEAPU8.set(data, STATIC_BASE); 82571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch removeRunDependency('memory initializer'); 82581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, function(data) { 82591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw 'could not load memory initializer ' + memoryInitializer; 82601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 82611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 82621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82641b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction ExitStatus(status) { 82651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.name = "ExitStatus"; 82661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.message = "Program terminated with exit(" + status + ")"; 82671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch this.status = status; 82681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch}; 82691b268ca467c924004286c97bac133db489cf43d0Ben MurdochExitStatus.prototype = new Error(); 82701b268ca467c924004286c97bac133db489cf43d0Ben MurdochExitStatus.prototype.constructor = ExitStatus; 82711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82721b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar initialStackTop; 82731b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar preloadStartTime = null; 82741b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar calledMain = false; 82751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82761b268ca467c924004286c97bac133db489cf43d0Ben MurdochdependenciesFulfilled = function runCaller() { 82771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) 82781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['calledRun'] && shouldRunNow) run([].concat(Module["arguments"])); 82791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled 82801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 82811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82821b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['callMain'] = Module.callMain = function callMain(args) { 82831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)'); 82841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); 82851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch args = args || []; 82871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ensureInitRuntime(); 82891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 82901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var argc = args.length+1; 82911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function pad() { 82921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < 4-1; i++) { 82931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argv.push(0); 82941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 82951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 82961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL) ]; 82971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch pad(); 82981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var i = 0; i < argc-1; i = i + 1) { 82991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL)); 83001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch pad(); 83011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argv.push(0); 83031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch argv = allocate(argv, 'i32', ALLOC_NORMAL); 83041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83051b268ca467c924004286c97bac133db489cf43d0Ben Murdoch initialStackTop = STACKTOP; 83061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83071b268ca467c924004286c97bac133db489cf43d0Ben Murdoch try { 83081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var ret = Module['_main'](argc, argv, 0); 83101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // if we're not running an evented main loop, it's time to exit 83131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!Module['noExitRuntime']) { 83141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch exit(ret); 83151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch catch(e) { 83181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (e instanceof ExitStatus) { 83191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // exit() throws this once it's done to make sure execution 83201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // has been stopped completely 83211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 83221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (e == 'SimulateInfiniteLoop') { 83231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // running an evented main loop, don't immediately exit 83241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['noExitRuntime'] = true; 83251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 83261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 83271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]); 83281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw e; 83291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } finally { 83311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch calledMain = true; 83321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 83341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83381b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction run(args) { 83391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch args = args || Module['arguments']; 83401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (preloadStartTime === null) preloadStartTime = Date.now(); 83421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (runDependencies > 0) { 83441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.printErr('run() called, but dependencies remain, so not running'); 83451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return; 83461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch preRun(); 83491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (runDependencies > 0) return; // a preRun added a dependency, run will be called later 83511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame 83521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function doRun() { 83541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening 83551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['calledRun'] = true; 83561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ensureInitRuntime(); 83581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch preMain(); 83601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) { 83621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.printErr('pre-main prep time: ' + (Date.now() - preloadStartTime) + ' ms'); 83631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['_main'] && shouldRunNow) { 83661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['callMain'](args); 83671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch postRun(); 83701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (Module['setStatus']) { 83731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['setStatus']('Running...'); 83741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch setTimeout(function() { 83751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch setTimeout(function() { 83761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['setStatus'](''); 83771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 1); 83781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (!ABORT) doRun(); 83791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }, 1); 83801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else { 83811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch doRun(); 83821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 83831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 83841b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['run'] = Module.run = run; 83851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83861b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction exit(status) { 83871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ABORT = true; 83881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch EXITSTATUS = status; 83891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch STACKTOP = initialStackTop; 83901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // exit the runtime 83921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch exitRuntime(); 83931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 83941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // TODO We should handle this differently based on environment. 83951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // In the browser, the best we can do is throw an exception 83961b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // to halt execution, but in node we could process.exit and 83971b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // I'd imagine SM shell would have something equivalent. 83981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // This would let us set a proper exit status (which 83991b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // would be great for checking test exit statuses). 84001b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // https://github.com/kripken/emscripten/issues/1371 84011b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // throw an exception to halt the current execution 84031b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw new ExitStatus(status); 84041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 84051b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['exit'] = Module.exit = exit; 84061b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84071b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction abort(text) { 84081b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (text) { 84091b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.print(text); 84101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module.printErr(text); 84111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 84121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ABORT = true; 84141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch EXITSTATUS = 1; 84151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var extra = '\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.'; 84171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch throw 'abort() at ' + stackTrace() + extra; 84191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 84201b268ca467c924004286c97bac133db489cf43d0Ben MurdochModule['abort'] = Module.abort = abort; 84211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// {{PRE_RUN_ADDITIONS}} 84231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84241b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (Module['preInit']) { 84251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; 84261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch while (Module['preInit'].length > 0) { 84271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Module['preInit'].pop()(); 84281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 84291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 84301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// shouldRunNow refers to calling main(), not run(). 84321b268ca467c924004286c97bac133db489cf43d0Ben Murdochvar shouldRunNow = true; 84331b268ca467c924004286c97bac133db489cf43d0Ben Murdochif (Module['noInitialRun']) { 84341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch shouldRunNow = false; 84351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 84361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 84381b268ca467c924004286c97bac133db489cf43d0Ben Murdochrun([].concat(Module["arguments"])); 8439