1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar EXPECTED_OUTPUT = 2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA\n' + 3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT\n' + 4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG\n' + 5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG\n' + 6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT\n' + 7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA\n' + 8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA\n' + 9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG\n' + 10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA\n' + 11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'GCCTGGGCGA\n'; 12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Module = { 13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier arguments: [1], 14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier print: function(x) {Module.printBuffer += x + '\n';}, 15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier preRun: [function() {Module.printBuffer = ''}], 16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier postRun: [function() { 17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assertEquals(EXPECTED_OUTPUT, Module.printBuffer); 18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }], 19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The Module object: Our interface to the outside world. We import 21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// and export values on it, and do the work to get that through 22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// closure compiler if necessary. There are various ways Module can be used: 23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 1. Not defined. We create it here 24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 2. A function parameter, function(Module) { ..generated code.. } 25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 3. pre-run appended it, var Module = {}; ..generated code.. 26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 4. External script tag defines var Module. 27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// We need to do an eval in order to handle the closure compiler 28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// case, where this code here is minified but Module was defined 29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// elsewhere (e.g. case 4 above). We also need to check if Module 30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// already exists (e.g. case 3 above). 31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Note that if you want to run closure, and also to use Module 32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// after the generated code, you will need to define var Module = {}; 33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// before the code. Then that object will be used in the code, and you 34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// can continue to use Module afterwards as well. 35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Module; 36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {}; 37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Sometimes an existing Module object exists with properties 39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// meant to overwrite the default module functionality. Here 40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// we collect those properties and reapply _after_ we configure 41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// the current environment's defaults to avoid having to be so 42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// defensive during initialization. 43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar moduleOverrides = {}; 44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfor (var key in Module) { 45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module.hasOwnProperty(key)) { 46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier moduleOverrides[key] = Module[key]; 47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The environment setup code below is customized to use Module. 51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// *** Environment setup code *** 52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function'; 53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ENVIRONMENT_IS_WEB = typeof window === 'object'; 54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; 55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; 56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (ENVIRONMENT_IS_NODE) { 58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Expose functionality in the same simple way that the shells work 59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Note that we pollute the global namespace here, otherwise we break in node 60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['print']) Module['print'] = function print(x) { 61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier process['stdout'].write(x + '\n'); 62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['printErr']) Module['printErr'] = function printErr(x) { 64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier process['stderr'].write(x + '\n'); 65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var nodeFS = require('fs'); 68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var nodePath = require('path'); 69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['read'] = function read(filename, binary) { 71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier filename = nodePath['normalize'](filename); 72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = nodeFS['readFileSync'](filename); 73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // The path is absolute if the normalized version is the same as the resolved. 74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ret && filename != nodePath['resolve'](filename)) { 75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier filename = path.join(__dirname, '..', 'src', filename); 76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = nodeFS['readFileSync'](filename); 77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ret && !binary) ret = ret.toString(); 79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) }; 83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['load'] = function load(f) { 85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier globalEval(read(f)); 86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['arguments'] = process['argv'].slice(2); 89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier module['exports'] = Module; 91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierelse if (ENVIRONMENT_IS_SHELL) { 93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['print']) Module['print'] = print; 94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm 95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof read != 'undefined') { 97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['read'] = read; 98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['read'] = function read() { throw 'no read() available (jsc?)' }; 100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['readBinary'] = function readBinary(f) { 103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return read(f, 'binary'); 104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof scriptArgs != 'undefined') { 107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['arguments'] = scriptArgs; 108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (typeof arguments != 'undefined') { 109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['arguments'] = arguments; 110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this['Module'] = Module; 113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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) 115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { 117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['read'] = function read(url) { 118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var xhr = new XMLHttpRequest(); 119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.open('GET', url, false); 120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.send(null); 121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return xhr.responseText; 122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof arguments != 'undefined') { 125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['arguments'] = arguments; 126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof console !== 'undefined') { 129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['print']) Module['print'] = function print(x) { 130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier console.log(x); 131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['printErr']) Module['printErr'] = function printErr(x) { 133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier console.log(x); 134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Probably a worker, and without console.log. We can do very little here... 137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var TRY_USE_DUMP = false; 138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) { 139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dump(x); 140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }) : (function(x) { 141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // self.postMessage(x); // enable this if you want stdout to be sent as messages 142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier })); 143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ENVIRONMENT_IS_WEB) { 146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window['Module'] = Module; 147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['load'] = importScripts; 149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierelse { 152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Unreachable because SHELL is dependant on the others 153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw 'Unknown runtime environment. Where are we?'; 154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction globalEval(x) { 157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier eval.call(null, x); 158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (!Module['load'] == 'undefined' && Module['read']) { 160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['load'] = function load(f) { 161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier globalEval(Module['read'](f)); 162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (!Module['print']) { 165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['print'] = function(){}; 166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (!Module['printErr']) { 168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['printErr'] = Module['print']; 169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (!Module['arguments']) { 171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['arguments'] = []; 172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// *** Environment setup code *** 174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Closure helpers 176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule.print = Module['print']; 177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule.printErr = Module['printErr']; 178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Callbacks 180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['preRun'] = []; 181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['postRun'] = []; 182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Merge back in the overrides 184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfor (var key in moduleOverrides) { 185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (moduleOverrides.hasOwnProperty(key)) { 186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module[key] = moduleOverrides[key]; 187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// === Auto-generated preamble library stuff === 193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//======================================== 195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Runtime code shared with compiler 196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//======================================== 197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Runtime = { 199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stackSave: function () { 200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return STACKTOP; 201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stackRestore: function (stackTop) { 203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = stackTop; 204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier forceAlign: function (target, quantum) { 206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier quantum = quantum || 4; 207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (quantum == 1) return target; 208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (isNumber(target) && isNumber(quantum)) { 209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Math.ceil(target/quantum)*quantum; 210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (isNumber(quantum) && isPowerOfTwo(quantum)) { 211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')'; 212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum; 214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isNumberType: function (type) { 216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES; 217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isPointerType: function isPointerType(type) { 219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return type[type.length-1] == '*'; 220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}, 221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isStructType: function isStructType(type) { 222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (isPointerType(type)) return false; 223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (isArrayType(type)) return true; 224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (/<?\{ ?[^}]* ?\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types 225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // See comment in isStructPointerType() 226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return type[0] == '%'; 227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}, 228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0}, 229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FLOAT_TYPES: {"float":0,"double":0}, 230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier or64: function (x, y) { 231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var l = (x | 0) | (y | 0); 232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296; 233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return l + h; 234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier and64: function (x, y) { 236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var l = (x | 0) & (y | 0); 237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296; 238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return l + h; 239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xor64: function (x, y) { 241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var l = (x | 0) ^ (y | 0); 242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296; 243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return l + h; 244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getNativeTypeSize: function (type) { 246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (type) { 247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i1': case 'i8': return 1; 248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i16': return 2; 249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i32': return 4; 250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i64': return 8; 251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'float': return 4; 252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'double': return 8; 253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: { 254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type[type.length-1] === '*') { 255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Runtime.QUANTUM_SIZE; // A pointer 256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (type[0] === 'i') { 257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bits = parseInt(type.substr(1)); 258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(bits % 8 === 0); 259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return bits/8; 260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getNativeFieldSize: function (type) { 267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE); 268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dedup: function dedup(items, ident) { 270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var seen = {}; 271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ident) { 272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return items.filter(function(item) { 273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (seen[item[ident]]) return false; 274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier seen[item[ident]] = true; 275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return true; 276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return items.filter(function(item) { 279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (seen[item]) return false; 280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier seen[item] = true; 281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return true; 282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}, 285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier set: function set() { 286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var args = typeof arguments[0] === 'object' ? arguments[0] : arguments; 287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = {}; 288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < args.length; i++) { 289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret[args[i]] = 0; 290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}, 293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACK_ALIGN: 8, 294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getAlignSize: function (type, size, vararg) { 295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we align i64s and doubles on 64-bit boundaries, unlike x86 296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!vararg && (type == 'i64' || type == 'double')) return 8; 297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!type) return Math.min(size, 8); // align structures internally to 64 bits 298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE); 299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier calculateStructAlignment: function calculateStructAlignment(type) { 301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.flatSize = 0; 302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.alignSize = 0; 303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var diffs = []; 304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var prev = -1; 305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var index = 0; 306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.flatIndexes = type.fields.map(function(field) { 307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier index++; 308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var size, alignSize; 309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) { 310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s. 311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alignSize = Runtime.getAlignSize(field, size); 312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (Runtime.isStructType(field)) { 313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (field[1] === '0') { 314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // this is [0 x something]. When inside another structure like here, it must be at the end, 315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // and it adds no size 316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!'); 317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size = 0; 318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Types.types[field]) { 319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize); 320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alignSize = type.alignSize || QUANTUM_SIZE; 322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size = Types.types[field].flatSize; 325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize); 326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (field[0] == 'b') { 328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // bN, large number field, like a [N x i8] 329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size = field.substr(1)|0; 330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alignSize = 1; 331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (field[0] === '<') { 332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // vector type 333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size = alignSize = Types.types[field].flatSize; // fully aligned 334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (field[0] === 'i') { 335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // illegal integer field, that could not be legalized because it is an internal structure field 336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // it is ok to have such fields, if we just use them as markers of field size and nothing more complex 337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size = alignSize = parseInt(field.substr(1))/8; 338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field); 339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(false, 'invalid type for calculateStructAlignment'); 341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type.packed) alignSize = 1; 343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.alignSize = Math.max(type.alignSize, alignSize); 344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory 345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.flatSize = curr + size; 346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (prev >= 0) { 347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier diffs.push(curr-prev); 348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prev = curr; 350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return curr; 351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type.name_ && type.name_[0] === '[') { 353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid 354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // allocating a potentially huge array for [999999 x i8] etc. 355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2; 356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize); 358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (diffs.length == 0) { 359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.flatFactor = type.flatSize; 360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (Runtime.dedup(diffs).length == 1) { 361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.flatFactor = diffs[0]; 362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type.needsFlattening = (type.flatFactor != 1); 364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return type.flatIndexes; 365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier generateStructInfo: function (struct, typeName, offset) { 367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var type, alignment; 368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeName) { 369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier offset = offset || 0; 370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName]; 371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!type) return null; 372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type.fields.length != struct.length) { 373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo'); 374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return null; 375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alignment = type.flatIndexes; 377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var type = { fields: struct.map(function(item) { return item[0] }) }; 379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alignment = Runtime.calculateStructAlignment(type); 380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = { 382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __size__: type.flatSize 383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeName) { 385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier struct.forEach(function(item, i) { 386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof item === 'string') { 387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret[item] = alignment[i] + offset; 388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // embedded struct 390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var key; 391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var k in item) key = k; 392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]); 393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier struct.forEach(function(item, i) { 397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret[item[1]] = alignment[i]; 398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dynCall: function (sig, ptr, args) { 403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (args && args.length) { 404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!args.splice) args = Array.prototype.slice.call(args); 405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier args.splice(0, 0, ptr); 406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Module['dynCall_' + sig].apply(null, args); 407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Module['dynCall_' + sig].call(null, ptr); 409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier functionPointers: [], 412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addFunction: function (func) { 413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < Runtime.functionPointers.length; i++) { 414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Runtime.functionPointers[i]) { 415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.functionPointers[i] = func; 416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 2*(1 + i); 417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; 420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier removeFunction: function (index) { 422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.functionPointers[(index-2)/2] = null; 423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getAsmConst: function (code, numArgs) { 425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // code is a constant string on the heap, so we can cache these 426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Runtime.asmConstCache) Runtime.asmConstCache = {}; 427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var func = Runtime.asmConstCache[code]; 428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func) return func; 429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var args = []; 430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < numArgs; i++) { 431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier args.push(String.fromCharCode(36) + i); // $0, $1 etc 432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var source = Pointer_stringify(code); 434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (source[0] === '"') { 435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // tolerate EM_ASM("..code..") even though EM_ASM(..code..) is correct 436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (source.indexOf('"', 1) === source.length-1) { 437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier source = source.substr(1, source.length-2); 438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // something invalid happened, e.g. EM_ASM("..code($0)..", input) 440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier abort('invalid EM_ASM input |' + source + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)'); 441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var evalled = eval('(function(' + args.join(',') + '){ ' + source + ' })'); // new Function does not allow upvars in node 445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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.)'); 447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw e; 448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Runtime.asmConstCache[code] = evalled; 450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier warnOnce: function (text) { 452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {}; 453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Runtime.warnOnce.shown[text]) { 454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.warnOnce.shown[text] = 1; 455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.printErr(text); 456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier funcWrappers: {}, 459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getFuncWrapper: function (func, sig) { 460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(sig); 461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Runtime.funcWrappers[func]) { 462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.funcWrappers[func] = function dynCall_wrapper() { 463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Runtime.dynCall(sig, func, arguments); 464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Runtime.funcWrappers[func]; 467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier UTF8Processor: function () { 469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var buffer = []; 470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var needed = 0; 471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.processCChar = function (code) { 472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier code = code & 0xFF; 473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (buffer.length == 0) { 475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((code & 0x80) == 0x00) { // 0xxxxxxx 476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return String.fromCharCode(code); 477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer.push(code); 479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((code & 0xE0) == 0xC0) { // 110xxxxx 480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier needed = 1; 481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if ((code & 0xF0) == 0xE0) { // 1110xxxx 482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier needed = 2; 483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { // 11110xxx 484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier needed = 3; 485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ''; 487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (needed) { 490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer.push(code); 491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier needed--; 492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (needed > 0) return ''; 493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var c1 = buffer[0]; 496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var c2 = buffer[1]; 497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var c3 = buffer[2]; 498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var c4 = buffer[3]; 499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret; 500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (buffer.length == 2) { 501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = String.fromCharCode(((c1 & 0x1F) << 6) | (c2 & 0x3F)); 502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (buffer.length == 3) { 503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F)); 504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae 506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) | 507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ((c3 & 0x3F) << 6) | (c4 & 0x3F); 508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = String.fromCharCode( 509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Math.floor((codePoint - 0x10000) / 0x400) + 0xD800, 510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (codePoint - 0x10000) % 0x400 + 0xDC00); 511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer.length = 0; 513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.processJSString = function processJSString(string) { 516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /* TODO: use TextEncoder when present, 517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var encoder = new TextEncoder(); 518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier encoder['encoding'] = "utf-8"; 519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var utf8Array = encoder['encode'](aMsg.data); 520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier string = unescape(encodeURIComponent(string)); 522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = []; 523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < string.length; i++) { 524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(string.charCodeAt(i)); 525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getCompilerSetting: function (name) { 530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work'; 531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; }, 533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; }, 534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; }, 535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; }, 536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; }, 537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GLOBAL_BASE: 8, 538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier QUANTUM_SIZE: 4, 539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __dummy__: 0 540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['Runtime'] = Runtime; 544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//======================================== 554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Runtime essentials 555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//======================================== 556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar __THREW__ = 0; // Used in checking for thrown exceptions. 558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort() 560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar EXITSTATUS = 0; 561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar undef = 0; 563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// tempInt is used for 32-bit signed values or smaller. tempBigInt is used 564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt 565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat; 566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar tempI64, tempI64b; 567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9; 568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction assert(condition, text) { 570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!condition) { 571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier abort('Assertion failed: ' + text); 572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar globalScope = this; 576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// C calling interface. A convenient way to call C functions (in C files, or 578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// defined with extern "C"). 579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Note: LLVM optimizations can inline and remove functions, after which you will not be 581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// able to call them. Closure can also do so. To avoid that, add your function to 582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// the exports using something like 583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]' 585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C") 587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and 588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit). 589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// @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, 590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// except that 'array' is not possible (there is no way for us to know the length of the array) 591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// @param args An array of the arguments to the function, as native JS values (as in returnType) 592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Note that string arguments will be stored on the stack (the JS string will become a C string on the stack). 593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// @return The return value, as a native JS value (as in returnType) 594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction ccall(ident, returnType, argTypes, args) { 595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ccallFunc(getCFunc(ident), returnType, argTypes, args); 596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule["ccall"] = ccall; 598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) 600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction getCFunc(ident) { 601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var func = Module['_' + ident]; // closure exported function 603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!func) func = eval('_' + ident); // explicit lookup 604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)'); 607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return func; 608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Internal function that does a C call using a function, not an identifier 611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction ccallFunc(func, returnType, argTypes, args) { 612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stack = 0; 613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function toC(value, type) { 614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type == 'string') { 615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (value === null || value === undefined || value === 0) return 0; // null string 616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier value = intArrayFromString(value); 617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type = 'array'; 618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type == 'array') { 620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stack) stack = Runtime.stackSave(); 621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = Runtime.stackAlloc(value.length); 622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier writeArrayToMemory(value, ret); 623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return value; 626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function fromC(value, type) { 628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type == 'string') { 629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Pointer_stringify(value); 630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(type != 'array'); 632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return value; 633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i = 0; 635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var cArgs = args ? args.map(function(arg) { 636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return toC(arg, argTypes[i++]); 637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }) : []; 638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = fromC(func.apply(null, cArgs), returnType); 639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (stack) Runtime.stackRestore(stack); 640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Returns a native JS wrapper for a C function. This is similar to ccall, but 644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// returns a function you can call repeatedly in a normal way. For example: 645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// var my_function = cwrap('my_c_function', 'number', ['number', 'number']); 647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// alert(my_function(5, 22)); 648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// alert(my_function(99, 12)); 649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction cwrap(ident, returnType, argTypes) { 651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var func = getCFunc(ident); 652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return function() { 653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments)); 654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule["cwrap"] = cwrap; 657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Sets a value in memory in a dynamic way at run-time. Uses the 659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// type data. This is the same as makeSetValue, except that 660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// makeSetValue is done at compile-time and generates the needed 661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// code then, whereas this function picks the right code at 662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// run-time. 663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Note that setValue and getValue only do *aligned* writes and reads! 664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Note that ccall uses JS types as for defining types, while setValue and 665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation 666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setValue(ptr, value, type, noSafe) { 667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type = type || 'i8'; 668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit 669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch(type) { 670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i1': HEAP8[(ptr)]=value; break; 671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i8': HEAP8[(ptr)]=value; break; 672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i16': HEAP16[((ptr)>>1)]=value; break; 673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i32': HEAP32[((ptr)>>2)]=value; break; 674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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; 675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'float': HEAPF32[((ptr)>>2)]=value; break; 676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'double': HEAPF64[((ptr)>>3)]=value; break; 677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: abort('invalid type for setValue: ' + type); 678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['setValue'] = setValue; 681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Parallel to setValue. 683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction getValue(ptr, type, noSafe) { 684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type = type || 'i8'; 685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit 686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch(type) { 687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i1': return HEAP8[(ptr)]; 688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i8': return HEAP8[(ptr)]; 689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i16': return HEAP16[((ptr)>>1)]; 690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i32': return HEAP32[((ptr)>>2)]; 691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'i64': return HEAP32[((ptr)>>2)]; 692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'float': return HEAPF32[((ptr)>>2)]; 693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'double': return HEAPF64[((ptr)>>3)]; 694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: abort('invalid type for setValue: ' + type); 695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return null; 697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['getValue'] = getValue; 699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ALLOC_NORMAL = 0; // Tries to use _malloc() 701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ALLOC_STACK = 1; // Lives for the duration of the current function call 702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ALLOC_STATIC = 2; // Cannot be freed 703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk 704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar ALLOC_NONE = 4; // Do not allocate 705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['ALLOC_NORMAL'] = ALLOC_NORMAL; 706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['ALLOC_STACK'] = ALLOC_STACK; 707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['ALLOC_STATIC'] = ALLOC_STATIC; 708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC; 709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['ALLOC_NONE'] = ALLOC_NONE; 710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// allocate(): This is for internal use. You can use it yourself as well, but the interface 712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// is a little tricky (see docs right below). The reason is that it is optimized 713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// for multiple syntaxes to save space in generated code. So you should 714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// normally not use allocate(), and instead allocate memory using _malloc(), 715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// initialize it with setValue(), and so forth. 716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// @slab: An array of data, or a number. If a number, then the size of the block to allocate, 717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// in *bytes* (note that this is sometimes confusing: the next parameter does not 718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// affect this!) 719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// @types: Either an array of types, one for each byte (or 0 if no type at that position), 720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// or a single type which is used for the entire block. This only matters if there 721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// is initial data - if @slab is a number, then this does not matter at all and is 722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// ignored. 723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// @allocator: How to allocate memory, see ALLOC_* 724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction allocate(slab, types, allocator, ptr) { 725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var zeroinit, size; 726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof slab === 'number') { 727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier zeroinit = true; 728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size = slab; 729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier zeroinit = false; 731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size = slab.length; 732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var singleType = typeof types === 'string' ? types : null; 735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret; 737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (allocator == ALLOC_NONE) { 738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = ptr; 739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); 741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (zeroinit) { 744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ptr = ret, stop; 745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert((ret & 3) == 0); 746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stop = ret + (size & ~3); 747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (; ptr < stop; ptr += 4) { 748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((ptr)>>2)]=0; 749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stop = ret + size; 751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (ptr < stop) { 752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[((ptr++)|0)]=0; 753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (singleType === 'i8') { 758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (slab.subarray || slab.slice) { 759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAPU8.set(slab, ret); 760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAPU8.set(new Uint8Array(slab), ret); 762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i = 0, type, typeSize, previousType; 767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (i < size) { 768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var curr = slab[i]; 769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof curr === 'function') { 771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier curr = Runtime.getFunctionIndex(curr); 772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type = singleType || types[i]; 775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type === 0) { 776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i++; 777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later 781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setValue(ret+i, curr, type); 783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // no need to look up size unless type changes, so cache it 785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (previousType !== type) { 786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier typeSize = Runtime.getNativeTypeSize(type); 787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier previousType = type; 788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i += typeSize; 790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['allocate'] = allocate; 795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction Pointer_stringify(ptr, /* optional */ length) { 797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO: use TextDecoder 798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Find the length, and check for UTF while doing so 799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var hasUtf = false; 800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var t; 801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i = 0; 802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier t = HEAPU8[(((ptr)+(i))|0)]; 804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (t >= 128) hasUtf = true; 805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier else if (t == 0 && !length) break; 806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i++; 807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (length && i == length) break; 808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!length) length = i; 810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = ''; 812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!hasUtf) { 814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack 815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var curr; 816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (length > 0) { 817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK))); 818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = ret ? ret + curr : curr; 819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ptr += MAX_CHUNK; 820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier length -= MAX_CHUNK; 821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var utf8 = new Runtime.UTF8Processor(); 826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (i = 0; i < length; i++) { 827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier t = HEAPU8[(((ptr)+(i))|0)]; 828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret += utf8.processCChar(t); 829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['Pointer_stringify'] = Pointer_stringify; 833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns 835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// a copy of that string as a Javascript String object. 836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction UTF16ToString(ptr) { 837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i = 0; 838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var str = ''; 840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; 842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (codeUnit == 0) 843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return str; 844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ++i; 845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. 846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier str += String.fromCharCode(codeUnit); 847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['UTF16ToString'] = UTF16ToString; 850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', 852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP. 853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction stringToUTF16(str, outPtr) { 854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for(var i = 0; i < str.length; ++i) { 855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. 856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var codeUnit = str.charCodeAt(i); // possibly a lead surrogate 857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit; 858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Null-terminate the pointer to the HEAP. 860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP16[(((outPtr)+(str.length*2))>>1)]=0; 861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['stringToUTF16'] = stringToUTF16; 863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns 865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// a copy of that string as a Javascript String object. 866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction UTF32ToString(ptr) { 867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i = 0; 868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var str = ''; 870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; 872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (utf32 == 0) 873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return str; 874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ++i; 875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // 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. 876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (utf32 >= 0x10000) { 877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ch = utf32 - 0x10000; 878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); 879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier str += String.fromCharCode(utf32); 881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['UTF32ToString'] = UTF32ToString; 885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', 887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP, 888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// 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. 889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction stringToUTF32(str, outPtr) { 890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var iChar = 0; 891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) { 892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // 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. 893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate 894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { 895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var trailSurrogate = str.charCodeAt(++iCodeUnit); 896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); 897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit; 899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ++iChar; 900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Null-terminate the pointer to the HEAP. 902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[(((outPtr)+(iChar*4))>>2)]=0; 903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['stringToUTF32'] = stringToUTF32; 905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction demangle(func) { 907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i = 3; 908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // params, etc. 909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var basicTypes = { 910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'v': 'void', 911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'b': 'bool', 912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'c': 'char', 913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 's': 'short', 914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'i': 'int', 915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'l': 'long', 916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'f': 'float', 917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'd': 'double', 918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'w': 'wchar_t', 919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'a': 'signed char', 920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'h': 'unsigned char', 921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 't': 'unsigned short', 922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'j': 'unsigned int', 923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'm': 'unsigned long', 924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'x': 'long long', 925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'y': 'unsigned long long', 926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'z': '...' 927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var subs = []; 929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var first = true; 930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function dump(x) { 931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier //return; 932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (x) Module.print(x); 933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.print(func); 934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var pre = ''; 935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var a = 0; a < i; a++) pre += ' '; 936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.print (pre + '^'); 937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function parseNested() { 939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i++; 940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[i] === 'K') i++; // ignore const 941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parts = []; 942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (func[i] !== 'E') { 943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[i] === 'S') { // substitution 944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i++; 945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var next = func.indexOf('_', i); 946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var num = func.substring(i, next) || 0; 947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.push(subs[num] || '?'); 948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i = next+1; 949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[i] === 'C') { // constructor 952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.push(parts[parts.length-1]); 953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i += 2; 954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var size = parseInt(func.substr(i)); 957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var pre = size.toString().length; 958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!size || !pre) { i--; break; } // counter i++ below us 959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var curr = func.substr(i + pre, size); 960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.push(curr); 961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier subs.push(curr); 962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i += pre + size; 963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i++; // skip E 965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parts; 966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function parse(rawList, limit, allowVoid) { // main parser 968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier limit = limit || Infinity; 969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = '', list = []; 970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function flushList() { 971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return '(' + list.join(', ') + ')'; 972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var name; 974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[i] === 'N') { 975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // namespaced N-E 976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier name = parseNested().join('::'); 977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier limit--; 978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (limit === 0) return rawList ? [name] : name; 979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // not namespaced 981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L' 982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var size = parseInt(func.substr(i)); 983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (size) { 984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var pre = size.toString().length; 985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier name = func.substr(i + pre, size); 986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i += pre + size; 987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier first = false; 990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[i] === 'I') { 991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i++; 992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var iList = parse(true); 993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var iRet = parse(true, 1, true); 994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>'; 995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = name; 997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier paramLoop: while (i < func.length && limit-- > 0) { 999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier //dump('paramLoop'); 1000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var c = func[i++]; 1001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (c in basicTypes) { 1002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier list.push(basicTypes[c]); 1003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (c) { 1005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer 1006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference 1007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'L': { // literal 1008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i++; // skip basic type 1009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var end = func.indexOf('E', i); 1010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var size = end - i; 1011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier list.push(func.substr(i, size)); 1012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i += size + 2; // size + 'EE' 1013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 1014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'A': { // array 1016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var size = parseInt(func.substr(i)); 1017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i += size.toString().length; 1018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[i] !== '_') throw '?'; 1019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i++; // skip _ 1020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier list.push(parse(true, 1, true)[0] + ' [' + size + ']'); 1021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 1022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'E': break paramLoop; 1024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: ret += '?' + c; break paramLoop; 1025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void) 1029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (rawList) { 1030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ret) { 1031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier list.push(ret + '?'); 1032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return list; 1034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret + flushList(); 1036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 1039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Special-case the entry point, since its name differs from other name mangling. 1040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func == 'Object._main' || func == '_main') { 1041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 'main()'; 1042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof func === 'number') func = Pointer_stringify(func); 1044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[0] !== '_') return func; 1045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[1] !== '_') return func; // C function 1046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (func[2] !== 'Z') return func; 1047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (func[3]) { 1048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'n': return 'operator new()'; 1049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'd': return 'operator delete()'; 1050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parse(); 1052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 1053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return func; 1054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction demangleAll(text) { 1058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return text.replace(/__Z[\w\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') }); 1059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction stackTrace() { 1062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stack = new Error().stack; 1063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6. 1064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Memory management 1067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar PAGE_SIZE = 4096; 1069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction alignMemoryPage(x) { 1070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (x+4095)&-4096; 1071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar HEAP; 1074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; 1075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area 1077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area 1078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk 1079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction enlargeMemory() { 1081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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.'); 1082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880; 1085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 134217728; 1086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152; 1087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar totalMemory = 4096; 1089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) { 1090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (totalMemory < 16*1024*1024) { 1091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier totalMemory *= 2; 1092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier totalMemory += 16*1024*1024 1094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (totalMemory !== TOTAL_MEMORY) { 1097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable'); 1098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier TOTAL_MEMORY = totalMemory; 1099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Initialize the runtime's memory 1102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// check for full engine support (use string 'subarray' to avoid closure compiler confusion) 1103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']), 1104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'JS engine does not provide full typed array support'); 1105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar buffer = new ArrayBuffer(TOTAL_MEMORY); 1107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAP8 = new Int8Array(buffer); 1108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAP16 = new Int16Array(buffer); 1109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAP32 = new Int32Array(buffer); 1110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAPU8 = new Uint8Array(buffer); 1111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAPU16 = new Uint16Array(buffer); 1112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAPU32 = new Uint32Array(buffer); 1113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAPF32 = new Float32Array(buffer); 1114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAPF64 = new Float64Array(buffer); 1115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Endianness check (note: assumes compiler arch was little-endian) 1117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHEAP32[0] = 255; 1118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system'); 1119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAP'] = HEAP; 1121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAP8'] = HEAP8; 1122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAP16'] = HEAP16; 1123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAP32'] = HEAP32; 1124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAPU8'] = HEAPU8; 1125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAPU16'] = HEAPU16; 1126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAPU32'] = HEAPU32; 1127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAPF32'] = HEAPF32; 1128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['HEAPF64'] = HEAPF64; 1129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction callRuntimeCallbacks(callbacks) { 1131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while(callbacks.length > 0) { 1132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var callback = callbacks.shift(); 1133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof callback == 'function') { 1134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callback(); 1135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 1136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var func = callback.func; 1138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof func === 'number') { 1139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (callback.arg === undefined) { 1140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.dynCall('v', func); 1141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.dynCall('vi', func, [callback.arg]); 1143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier func(callback.arg === undefined ? null : callback.arg); 1146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar __ATPRERUN__ = []; // functions called before the runtime is initialized 1151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar __ATINIT__ = []; // functions called during startup 1152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar __ATMAIN__ = []; // functions called when main() is to be run 1153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar __ATEXIT__ = []; // functions called during shutdown 1154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar __ATPOSTRUN__ = []; // functions called after the runtime has exited 1155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar runtimeInitialized = false; 1157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction preRun() { 1159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // compatibility - merge in anything from Module['preRun'] at this time 1160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['preRun']) { 1161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; 1162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (Module['preRun'].length) { 1163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addOnPreRun(Module['preRun'].shift()); 1164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callRuntimeCallbacks(__ATPRERUN__); 1167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction ensureInitRuntime() { 1170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (runtimeInitialized) return; 1171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier runtimeInitialized = true; 1172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callRuntimeCallbacks(__ATINIT__); 1173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction preMain() { 1176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callRuntimeCallbacks(__ATMAIN__); 1177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction exitRuntime() { 1180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callRuntimeCallbacks(__ATEXIT__); 1181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction postRun() { 1184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // compatibility - merge in anything from Module['postRun'] at this time 1185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['postRun']) { 1186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; 1187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (Module['postRun'].length) { 1188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addOnPostRun(Module['postRun'].shift()); 1189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callRuntimeCallbacks(__ATPOSTRUN__); 1192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction addOnPreRun(cb) { 1195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ATPRERUN__.unshift(cb); 1196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun; 1198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction addOnInit(cb) { 1200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ATINIT__.unshift(cb); 1201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['addOnInit'] = Module.addOnInit = addOnInit; 1203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction addOnPreMain(cb) { 1205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ATMAIN__.unshift(cb); 1206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain; 1208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction addOnExit(cb) { 1210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ATEXIT__.unshift(cb); 1211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['addOnExit'] = Module.addOnExit = addOnExit; 1213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction addOnPostRun(cb) { 1215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ATPOSTRUN__.unshift(cb); 1216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun; 1218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Tools 1220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// This processes a JS string into a C-line array of numbers, 0-terminated. 1222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// For LLVM-originating strings, see parser.js:parseLLVMString function 1223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction intArrayFromString(stringy, dontAddNull, length /* optional */) { 1224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = (new Runtime.UTF8Processor()).processJSString(stringy); 1225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (length) { 1226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.length = length; 1227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!dontAddNull) { 1229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(0); 1230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['intArrayFromString'] = intArrayFromString; 1234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction intArrayToString(array) { 1236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = []; 1237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < array.length; i++) { 1238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var chr = array[i]; 1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (chr > 0xFF) { 1240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier chr &= 0xFF; 1241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(String.fromCharCode(chr)); 1243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret.join(''); 1245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['intArrayToString'] = intArrayToString; 1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Write a Javascript array to somewhere in the heap 1249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction writeStringToMemory(string, buffer, dontAddNull) { 1250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var array = intArrayFromString(string, dontAddNull); 1251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i = 0; 1252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (i < array.length) { 1253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var chr = array[i]; 1254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[(((buffer)+(i))|0)]=chr; 1255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i = i + 1; 1256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['writeStringToMemory'] = writeStringToMemory; 1259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction writeArrayToMemory(array, buffer) { 1261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < array.length; i++) { 1262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[(((buffer)+(i))|0)]=array[i]; 1263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['writeArrayToMemory'] = writeArrayToMemory; 1266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction writeAsciiToMemory(str, buffer, dontAddNull) { 1268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < str.length; i++) { 1269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i); 1270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0; 1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['writeAsciiToMemory'] = writeAsciiToMemory; 1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction unSign(value, bits, ignore) { 1276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (value >= 0) { 1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return value; 1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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 1280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : Math.pow(2, bits) + value; 1281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction reSign(value, bits, ignore) { 1283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (value <= 0) { 1284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return value; 1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 1287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : Math.pow(2, bits-1); 1288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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 1289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors 1290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO: In i64 mode 1, resign the two parts separately and safely 1291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts 1292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return value; 1294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 ) 1297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) { 1298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ah = a >>> 16; 1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var al = a & 0xffff; 1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bh = b >>> 16; 1301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bl = b & 0xffff; 1302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (al*bl + ((ah*bl + al*bh) << 16))|0; 1303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMath.imul = Math['imul']; 1305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_abs = Math.abs; 1308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_cos = Math.cos; 1309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_sin = Math.sin; 1310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_tan = Math.tan; 1311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_acos = Math.acos; 1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_asin = Math.asin; 1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_atan = Math.atan; 1314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_atan2 = Math.atan2; 1315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_exp = Math.exp; 1316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_log = Math.log; 1317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_sqrt = Math.sqrt; 1318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_ceil = Math.ceil; 1319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_floor = Math.floor; 1320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_pow = Math.pow; 1321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_imul = Math.imul; 1322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_fround = Math.fround; 1323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_min = Math.min; 1324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// A counter of dependencies for calling run(). If we need to 1326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// do asynchronous work before running, increment this and 1327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// decrement it. Incrementing must happen in a place like 1328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// PRE_RUN_ADDITIONS (used by emcc to add file preloading). 1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Note that you can add dependencies in preRun, even though 1330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// it happens right before run - run will be postponed until 1331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// the dependencies are met. 1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar runDependencies = 0; 1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar runDependencyWatcher = null; 1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled 1335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction addRunDependency(id) { 1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier runDependencies++; 1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['monitorRunDependencies']) { 1339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['monitorRunDependencies'](runDependencies); 1340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['addRunDependency'] = addRunDependency; 1343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction removeRunDependency(id) { 1344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier runDependencies--; 1345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['monitorRunDependencies']) { 1346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['monitorRunDependencies'](runDependencies); 1347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (runDependencies == 0) { 1349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (runDependencyWatcher !== null) { 1350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier clearInterval(runDependencyWatcher); 1351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier runDependencyWatcher = null; 1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (dependenciesFulfilled) { 1354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var callback = dependenciesFulfilled; 1355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dependenciesFulfilled = null; 1356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callback(); // can add another dependenciesFulfilled 1357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['removeRunDependency'] = removeRunDependency; 1361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule["preloadedImages"] = {}; // maps url to image data 1363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule["preloadedAudios"] = {}; // maps url to audio data 1364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar memoryInitializer = null; 1367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// === Body === 1369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierSTATIC_BASE = 8; 1375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierSTATICTOP = STATIC_BASE + Runtime.alignMemory(1155); 1377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/* global initializers */ __ATINIT__.push(); 1378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier/* memory initializer */ allocate([38,2,0,0,0,0,0,0,42,0,0,0,0,0,0,0,97,0,0,0,113,61,138,62,0,0,0,0,99,0,0,0,143,194,245,61,0,0,0,0,103,0,0,0,143,194,245,61,0,0,0,0,116,0,0,0,113,61,138,62,0,0,0,0,66,0,0,0,10,215,163,60,0,0,0,0,68,0,0,0,10,215,163,60,0,0,0,0,72,0,0,0,10,215,163,60,0,0,0,0,75,0,0,0,10,215,163,60,0,0,0,0,77,0,0,0,10,215,163,60,0,0,0,0,78,0,0,0,10,215,163,60,0,0,0,0,82,0,0,0,10,215,163,60,0,0,0,0,83,0,0,0,10,215,163,60,0,0,0,0,86,0,0,0,10,215,163,60,0,0,0,0,87,0,0,0,10,215,163,60,0,0,0,0,89,0,0,0,10,215,163,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,0,0,233,28,155,62,0,0,0,0,99,0,0,0,114,189,74,62,0,0,0,0,103,0,0,0,215,73,74,62,0,0,0,0,116,0,0,0,114,95,154,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,114,114,111,114,58,32,37,100,10,0,0,0,0,0,0,71,71,67,67,71,71,71,67,71,67,71,71,84,71,71,67,84,67,65,67,71,67,67,84,71,84,65,65,84,67,67,67,65,71,67,65,67,84,84,84,71,71,71,65,71,71,67,67,71,65,71,71,67,71,71,71,67,71,71,65,84,67,65,67,67,84,71,65,71,71,84,67,65,71,71,65,71,84,84,67,71,65,71,65,67,67,65,71,67,67,84,71,71,67,67,65,65,67,65,84,71,71,84,71,65,65,65,67,67,67,67,71,84,67,84,67,84,65,67,84,65,65,65,65,65,84,65,67,65,65,65,65,65,84,84,65,71,67,67,71,71,71,67,71,84,71,71,84,71,71,67,71,67,71,67,71,67,67,84,71,84,65,65,84,67,67,67,65,71,67,84,65,67,84,67,71,71,71,65,71,71,67,84,71,65,71,71,67,65,71,71,65,71,65,65,84,67,71,67,84,84,71,65,65,67,67,67,71,71,71,65,71,71,67,71,71,65,71,71,84,84,71,67,65,71,84,71,65,71,67,67,71,65,71,65,84,67,71,67,71,67,67,65,67,84,71,67,65,67,84,67,67,65,71,67,67,84,71,71,71,67,71,65,67,65,71,65,71,67,71,65,71,65,67,84,67,67,71,84,67,84,67,65,65,65,65,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,4,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,8,0,0,0,104,4,0,0,0,0,0,0,0,0,0,0], "i8", ALLOC_NONE, Runtime.GLOBAL_BASE); 1381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8); 1386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierassert(tempDoublePtr % 8 == 0); 1388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much 1390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr] = HEAP8[ptr]; 1392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; 1394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; 1396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; 1398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction copyTempDouble(ptr) { 1402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr] = HEAP8[ptr]; 1404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; 1406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; 1408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; 1410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; 1412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; 1414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; 1416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; 1418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___errno_state=0;function ___setErrNo(value) { 1425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // For convenient setting and returning of errno. 1426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((___errno_state)>>2)]=value; 1427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return value; 1428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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};function _sysconf(name) { 1431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // long sysconf(int name); 1432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html 1433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch(name) { 1434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 30: return PAGE_SIZE; 1435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 132: 1436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 133: 1437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 12: 1438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 137: 1439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 138: 1440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 15: 1441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 235: 1442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 16: 1443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 17: 1444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 18: 1445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 19: 1446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 20: 1447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 149: 1448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 13: 1449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 10: 1450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 236: 1451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 153: 1452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 9: 1453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 21: 1454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 22: 1455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 159: 1456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 154: 1457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 14: 1458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 77: 1459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 78: 1460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 139: 1461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 80: 1462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 81: 1463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 79: 1464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 82: 1465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 68: 1466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 67: 1467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 164: 1468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 11: 1469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 29: 1470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 47: 1471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 48: 1472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 95: 1473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 52: 1474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 51: 1475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 46: 1476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 200809; 1477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 27: 1478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 246: 1479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 127: 1480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 128: 1481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 23: 1482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 24: 1483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 160: 1484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 161: 1485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 181: 1486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 182: 1487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 242: 1488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 183: 1489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 184: 1490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 243: 1491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 244: 1492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 245: 1493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 165: 1494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 178: 1495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 179: 1496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 49: 1497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 50: 1498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 168: 1499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 169: 1500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 175: 1501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 170: 1502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 171: 1503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 172: 1504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 97: 1505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 76: 1506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 32: 1507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 173: 1508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 35: 1509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return -1; 1510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 176: 1511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 177: 1512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 7: 1513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 155: 1514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 8: 1515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 157: 1516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 125: 1517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 126: 1518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 92: 1519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 93: 1520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 129: 1521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 130: 1522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 131: 1523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 94: 1524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 91: 1525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 1; 1526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 74: 1527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 60: 1528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 69: 1529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 70: 1530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 4: 1531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 1024; 1532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 31: 1533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 42: 1534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 72: 1535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 32; 1536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 87: 1537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 26: 1538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 33: 1539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 2147483647; 1540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 34: 1541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 1: 1542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 47839; 1543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 38: 1544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 36: 1545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 99; 1546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 43: 1547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 37: 1548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 2048; 1549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 0: return 2097152; 1550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 3: return 65536; 1551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 28: return 32768; 1552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 44: return 32767; 1553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 75: return 16384; 1554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 39: return 1000; 1555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 89: return 700; 1556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 71: return 256; 1557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 40: return 255; 1558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 2: return 100; 1559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 180: return 64; 1560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 25: return 20; 1561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 5: return 16; 1562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 6: return 6; 1563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 73: return 4; 1564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 84: return 1; 1565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ___setErrNo(ERRNO_CODES.EINVAL); 1567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return -1; 1568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function __ZSt18uncaught_exceptionv() { // std::uncaught_exception() 1572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !!__ZSt18uncaught_exceptionv.uncaught_exception; 1573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function ___cxa_is_number_type(type) { 1578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var isNumber = false; 1579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIi) isNumber = true } catch(e){} 1580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIj) isNumber = true } catch(e){} 1581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIl) isNumber = true } catch(e){} 1582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIm) isNumber = true } catch(e){} 1583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIx) isNumber = true } catch(e){} 1584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIy) isNumber = true } catch(e){} 1585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIf) isNumber = true } catch(e){} 1586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTId) isNumber = true } catch(e){} 1587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIe) isNumber = true } catch(e){} 1588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIc) isNumber = true } catch(e){} 1589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIa) isNumber = true } catch(e){} 1590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIh) isNumber = true } catch(e){} 1591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIs) isNumber = true } catch(e){} 1592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { if (type == __ZTIt) isNumber = true } catch(e){} 1593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return isNumber; 1594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }function ___cxa_does_inherit(definiteType, possibilityType, possibility) { 1595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (possibility == 0) return false; 1596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (possibilityType == 0 || possibilityType == definiteType) 1597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return true; 1598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var possibility_type_info; 1599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (___cxa_is_number_type(possibilityType)) { 1600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier possibility_type_info = possibilityType; 1601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var possibility_type_infoAddr = HEAP32[((possibilityType)>>2)] - 8; 1603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier possibility_type_info = HEAP32[((possibility_type_infoAddr)>>2)]; 1604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (possibility_type_info) { 1606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 0: // possibility is a pointer 1607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // See if definite type is a pointer 1608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var definite_type_infoAddr = HEAP32[((definiteType)>>2)] - 8; 1609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var definite_type_info = HEAP32[((definite_type_infoAddr)>>2)]; 1610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (definite_type_info == 0) { 1611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Also a pointer; compare base types of pointers 1612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var defPointerBaseAddr = definiteType+8; 1613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var defPointerBaseType = HEAP32[((defPointerBaseAddr)>>2)]; 1614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var possPointerBaseAddr = possibilityType+8; 1615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var possPointerBaseType = HEAP32[((possPointerBaseAddr)>>2)]; 1616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ___cxa_does_inherit(defPointerBaseType, possPointerBaseType, possibility); 1617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else 1618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return false; // one pointer and one non-pointer 1619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 1: // class with no base class 1620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return false; 1621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 2: // class with base class 1622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parentTypeAddr = possibilityType + 8; 1623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parentType = HEAP32[((parentTypeAddr)>>2)]; 1624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ___cxa_does_inherit(definiteType, parentType, possibility); 1625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: 1626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return false; // some unencountered type 1627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___cxa_last_thrown_exception=0;function ___resumeException(ptr) { 1633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!___cxa_last_thrown_exception) { ___cxa_last_thrown_exception = ptr; } 1634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."; 1635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___cxa_exception_header_size=8;function ___cxa_find_matching_catch(thrown, throwntype) { 1638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (thrown == -1) thrown = ___cxa_last_thrown_exception; 1639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier header = thrown - ___cxa_exception_header_size; 1640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (throwntype == -1) throwntype = HEAP32[((header)>>2)]; 1641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var typeArray = Array.prototype.slice.call(arguments, 2); 1642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // If throwntype is a pointer, this means a pointer has been 1644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // thrown. When a pointer is thrown, actually what's thrown 1645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // is a pointer to the pointer. We'll dereference it. 1646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (throwntype != 0 && !___cxa_is_number_type(throwntype)) { 1647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var throwntypeInfoAddr= HEAP32[((throwntype)>>2)] - 8; 1648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var throwntypeInfo= HEAP32[((throwntypeInfoAddr)>>2)]; 1649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (throwntypeInfo == 0) 1650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier thrown = HEAP32[((thrown)>>2)]; 1651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // The different catch blocks are denoted by different types. 1653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Due to inheritance, those types may not precisely match the 1654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // type of the thrown object. Find one which matches, and 1655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // return the type of the catch block which should be called. 1656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < typeArray.length; i++) { 1657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (___cxa_does_inherit(typeArray[i], throwntype, thrown)) 1658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ((asm["setTempRet0"](typeArray[i]),thrown)|0); 1659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Shouldn't happen unless we have bogus data in typeArray 1661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // or encounter a type for which emscripten doesn't have suitable 1662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // typeinfo defined. Best-efforts match just in case. 1663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ((asm["setTempRet0"](throwntype),thrown)|0); 1664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }function ___cxa_throw(ptr, type, destructor) { 1665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!___cxa_throw.initialized) { 1666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 1667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((__ZTVN10__cxxabiv119__pointer_type_infoE)>>2)]=0; // Workaround for libcxxabi integration bug 1668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e){} 1669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 1670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((__ZTVN10__cxxabiv117__class_type_infoE)>>2)]=1; // Workaround for libcxxabi integration bug 1671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e){} 1672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 1673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((__ZTVN10__cxxabiv120__si_class_type_infoE)>>2)]=2; // Workaround for libcxxabi integration bug 1674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e){} 1675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ___cxa_throw.initialized = true; 1676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var header = ptr - ___cxa_exception_header_size; 1678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((header)>>2)]=type; 1679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[(((header)+(4))>>2)]=destructor; 1680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ___cxa_last_thrown_exception = ptr; 1681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) { 1682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZSt18uncaught_exceptionv.uncaught_exception = 1; 1683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZSt18uncaught_exceptionv.uncaught_exception++; 1685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."; 1687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["_memset"] = _memset; 1691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _abort() { 1693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['abort'](); 1694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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"}; 1701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var PATH={splitPath:function (filename) { 1703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; 1704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return splitPathRe.exec(filename).slice(1); 1705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },normalizeArray:function (parts, allowAboveRoot) { 1706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if the path tries to go above the root, `up` ends up > 0 1707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var up = 0; 1708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = parts.length - 1; i >= 0; i--) { 1709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var last = parts[i]; 1710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (last === '.') { 1711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.splice(i, 1); 1712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (last === '..') { 1713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.splice(i, 1); 1714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier up++; 1715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (up) { 1716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.splice(i, 1); 1717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier up--; 1718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if the path is allowed to go above the root, restore leading ..s 1721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (allowAboveRoot) { 1722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (; up--; up) { 1723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.unshift('..'); 1724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parts; 1727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },normalize:function (path) { 1728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var isAbsolute = path.charAt(0) === '/', 1729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier trailingSlash = path.substr(-1) === '/'; 1730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Normalize the path 1731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path = PATH.normalizeArray(path.split('/').filter(function(p) { 1732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !!p; 1733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }), !isAbsolute).join('/'); 1734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!path && !isAbsolute) { 1735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path = '.'; 1736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (path && trailingSlash) { 1738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path += '/'; 1739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (isAbsolute ? '/' : '') + path; 1741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },dirname:function (path) { 1742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var result = PATH.splitPath(path), 1743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier root = result[0], 1744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dir = result[1]; 1745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!root && !dir) { 1746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // No dirname whatsoever 1747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return '.'; 1748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (dir) { 1750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // It has a dirname, strip trailing slash 1751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dir = dir.substr(0, dir.length - 1); 1752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return root + dir; 1754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },basename:function (path) { 1755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // EMSCRIPTEN return '/'' for '/', not an empty string 1756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (path === '/') return '/'; 1757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lastSlash = path.lastIndexOf('/'); 1758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (lastSlash === -1) return path; 1759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return path.substr(lastSlash+1); 1760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },extname:function (path) { 1761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return PATH.splitPath(path)[3]; 1762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },join:function () { 1763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var paths = Array.prototype.slice.call(arguments, 0); 1764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return PATH.normalize(paths.join('/')); 1765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },join2:function (l, r) { 1766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return PATH.normalize(l + '/' + r); 1767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },resolve:function () { 1768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var resolvedPath = '', 1769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier resolvedAbsolute = false; 1770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { 1771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = (i >= 0) ? arguments[i] : FS.cwd(); 1772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Skip empty and invalid entries 1773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof path !== 'string') { 1774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new TypeError('Arguments to path.resolve must be strings'); 1775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (!path) { 1776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 1777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier resolvedPath = path + '/' + resolvedPath; 1779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier resolvedAbsolute = path.charAt(0) === '/'; 1780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // At this point the path should be resolved to a full absolute path, but 1782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // handle relative paths to be safe (might happen when process.cwd() fails) 1783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { 1784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !!p; 1785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }), !resolvedAbsolute).join('/'); 1786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; 1787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },relative:function (from, to) { 1788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier from = PATH.resolve(from).substr(1); 1789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier to = PATH.resolve(to).substr(1); 1790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function trim(arr) { 1791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var start = 0; 1792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (; start < arr.length; start++) { 1793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (arr[start] !== '') break; 1794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var end = arr.length - 1; 1796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (; end >= 0; end--) { 1797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (arr[end] !== '') break; 1798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (start > end) return []; 1800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return arr.slice(start, end - start + 1); 1801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var fromParts = trim(from.split('/')); 1803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var toParts = trim(to.split('/')); 1804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var length = Math.min(fromParts.length, toParts.length); 1805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var samePartsLength = length; 1806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < length; i++) { 1807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (fromParts[i] !== toParts[i]) { 1808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier samePartsLength = i; 1809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 1810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var outputParts = []; 1813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = samePartsLength; i < fromParts.length; i++) { 1814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier outputParts.push('..'); 1815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier outputParts = outputParts.concat(toParts.slice(samePartsLength)); 1817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return outputParts.join('/'); 1818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }}; 1819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var TTY={ttys:[],init:function () { 1821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // https://github.com/kripken/emscripten/pull/1555 1822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if (ENVIRONMENT_IS_NODE) { 1823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // currently, FS.init does not distinguish if process.stdin is a file or TTY 1824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // device, it always assumes it's a TTY device. because of this, we're forcing 1825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // process.stdin to UTF8 encoding to at least make stdin reading compatible 1826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // with text files until FS.init can be refactored. 1827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // process['stdin']['setEncoding']('utf8'); 1828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // } 1829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },shutdown:function () { 1830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // https://github.com/kripken/emscripten/pull/1555 1831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if (ENVIRONMENT_IS_NODE) { 1832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? 1833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // 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 1834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? 1835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle 1836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call 1837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // process['stdin']['pause'](); 1838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // } 1839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },register:function (dev, ops) { 1840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier TTY.ttys[dev] = { input: [], output: [], ops: ops }; 1841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.registerDevice(dev, TTY.stream_ops); 1842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },stream_ops:{open:function (stream) { 1843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tty = TTY.ttys[stream.node.rdev]; 1844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!tty) { 1845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENODEV); 1846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.tty = tty; 1848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.seekable = false; 1849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },close:function (stream) { 1850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // flush any pending line data 1851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (stream.tty.output.length) { 1852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.tty.ops.put_char(stream.tty, 10); 1853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },read:function (stream, buffer, offset, length, pos /* ignored */) { 1855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream.tty || !stream.tty.ops.get_char) { 1856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENXIO); 1857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytesRead = 0; 1859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < length; i++) { 1860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var result; 1861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 1862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier result = stream.tty.ops.get_char(stream.tty); 1863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 1864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EIO); 1865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (result === undefined && bytesRead === 0) { 1867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 1868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (result === null || result === undefined) break; 1870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bytesRead++; 1871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer[offset+i] = result; 1872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (bytesRead) { 1874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.node.timestamp = Date.now(); 1875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return bytesRead; 1877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },write:function (stream, buffer, offset, length, pos) { 1878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream.tty || !stream.tty.ops.put_char) { 1879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENXIO); 1880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < length; i++) { 1882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 1883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.tty.ops.put_char(stream.tty, buffer[offset+i]); 1884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 1885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EIO); 1886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (length) { 1889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.node.timestamp = Date.now(); 1890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i; 1892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }},default_tty_ops:{get_char:function (tty) { 1893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!tty.input.length) { 1894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var result = null; 1895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ENVIRONMENT_IS_NODE) { 1896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier result = process['stdin']['read'](); 1897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!result) { 1898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) { 1899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return null; // EOF 1900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return undefined; // no data available 1902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (typeof window != 'undefined' && 1904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier typeof window.prompt == 'function') { 1905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Browser. 1906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier result = window.prompt('Input: '); // returns null on cancel 1907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (result !== null) { 1908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier result += '\n'; 1909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (typeof readline == 'function') { 1911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Command line. 1912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier result = readline(); 1913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (result !== null) { 1914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier result += '\n'; 1915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!result) { 1918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return null; 1919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tty.input = intArrayFromString(result, true); 1921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return tty.input.shift(); 1923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },put_char:function (tty, val) { 1924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (val === null || val === 10) { 1925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['print'](tty.output.join('')); 1926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tty.output = []; 1927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tty.output.push(TTY.utf8.processCChar(val)); 1929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }},default_tty1_ops:{put_char:function (tty, val) { 1931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (val === null || val === 10) { 1932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['printErr'](tty.output.join('')); 1933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tty.output = []; 1934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 1935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tty.output.push(TTY.utf8.processCChar(val)); 1936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }}}; 1938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) { 1940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); 1941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createNode:function (parent, name, mode, dev) { 1942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { 1943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // no supported 1944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 1945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!MEMFS.ops_table) { 1947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MEMFS.ops_table = { 1948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dir: { 1949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node: { 1950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getattr: MEMFS.node_ops.getattr, 1951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setattr: MEMFS.node_ops.setattr, 1952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier lookup: MEMFS.node_ops.lookup, 1953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mknod: MEMFS.node_ops.mknod, 1954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier rename: MEMFS.node_ops.rename, 1955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier unlink: MEMFS.node_ops.unlink, 1956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier rmdir: MEMFS.node_ops.rmdir, 1957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier readdir: MEMFS.node_ops.readdir, 1958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier symlink: MEMFS.node_ops.symlink 1959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream: { 1961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier llseek: MEMFS.stream_ops.llseek 1962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier file: { 1965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node: { 1966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getattr: MEMFS.node_ops.getattr, 1967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setattr: MEMFS.node_ops.setattr 1968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream: { 1970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier llseek: MEMFS.stream_ops.llseek, 1971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier read: MEMFS.stream_ops.read, 1972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier write: MEMFS.stream_ops.write, 1973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier allocate: MEMFS.stream_ops.allocate, 1974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mmap: MEMFS.stream_ops.mmap 1975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier link: { 1978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node: { 1979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getattr: MEMFS.node_ops.getattr, 1980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setattr: MEMFS.node_ops.setattr, 1981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier readlink: MEMFS.node_ops.readlink 1982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream: {} 1984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier chrdev: { 1986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node: { 1987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getattr: MEMFS.node_ops.getattr, 1988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setattr: MEMFS.node_ops.setattr 1989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream: FS.chrdev_stream_ops 1991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 1993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.createNode(parent, name, mode, dev); 1995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(node.mode)) { 1996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops = MEMFS.ops_table.dir.node; 1997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.stream_ops = MEMFS.ops_table.dir.stream; 1998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contents = {}; 1999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isFile(node.mode)) { 2000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops = MEMFS.ops_table.file.node; 2001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.stream_ops = MEMFS.ops_table.file.stream; 2002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contents = []; 2003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contentMode = MEMFS.CONTENT_FLEXIBLE; 2004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isLink(node.mode)) { 2005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops = MEMFS.ops_table.link.node; 2006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.stream_ops = MEMFS.ops_table.link.stream; 2007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isChrdev(node.mode)) { 2008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops = MEMFS.ops_table.chrdev.node; 2009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.stream_ops = MEMFS.ops_table.chrdev.stream; 2010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.timestamp = Date.now(); 2012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // add the new node to the parent 2013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (parent) { 2014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parent.contents[name] = node; 2015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node; 2017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },ensureFlexible:function (node) { 2018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) { 2019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contents = node.contents; 2020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contents = Array.prototype.slice.call(contents); 2021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contentMode = MEMFS.CONTENT_FLEXIBLE; 2022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },node_ops:{getattr:function (node) { 2024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var attr = {}; 2025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // device numbers reuse inode numbers. 2026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.dev = FS.isChrdev(node.mode) ? node.id : 1; 2027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.ino = node.id; 2028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.mode = node.mode; 2029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.nlink = 1; 2030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.uid = 0; 2031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.gid = 0; 2032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.rdev = node.rdev; 2033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(node.mode)) { 2034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.size = 4096; 2035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isFile(node.mode)) { 2036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.size = node.contents.length; 2037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isLink(node.mode)) { 2038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.size = node.link.length; 2039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.size = 0; 2041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.atime = new Date(node.timestamp); 2043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.mtime = new Date(node.timestamp); 2044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.ctime = new Date(node.timestamp); 2045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), 2046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // but this is not required by the standard. 2047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.blksize = 4096; 2048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier attr.blocks = Math.ceil(attr.size / attr.blksize); 2049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return attr; 2050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },setattr:function (node, attr) { 2051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (attr.mode !== undefined) { 2052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.mode = attr.mode; 2053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (attr.timestamp !== undefined) { 2055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.timestamp = attr.timestamp; 2056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (attr.size !== undefined) { 2058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MEMFS.ensureFlexible(node); 2059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contents = node.contents; 2060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (attr.size < contents.length) contents.length = attr.size; 2061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier else while (attr.size > contents.length) contents.push(0); 2062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },lookup:function (parent, name) { 2064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw FS.genericErrors[ERRNO_CODES.ENOENT]; 2065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mknod:function (parent, name, mode, dev) { 2066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return MEMFS.createNode(parent, name, mode, dev); 2067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },rename:function (old_node, new_dir, new_name) { 2068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we're overwriting a directory at new_name, make sure it's empty. 2069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(old_node.mode)) { 2070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var new_node; 2071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier new_node = FS.lookupNode(new_dir, new_name); 2073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (new_node) { 2076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i in new_node.contents) { 2077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); 2078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // do the internal rewiring 2082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete old_node.parent.contents[old_node.name]; 2083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier old_node.name = new_name; 2084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier new_dir.contents[new_name] = old_node; 2085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier old_node.parent = new_dir; 2086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },unlink:function (parent, name) { 2087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete parent.contents[name]; 2088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },rmdir:function (parent, name) { 2089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.lookupNode(parent, name); 2090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i in node.contents) { 2091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); 2092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete parent.contents[name]; 2094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },readdir:function (node) { 2095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var entries = ['.', '..'] 2096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var key in node.contents) { 2097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!node.contents.hasOwnProperty(key)) { 2098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 2099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier entries.push(key); 2101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return entries; 2103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },symlink:function (parent, newname, oldpath) { 2104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); 2105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.link = oldpath; 2106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node; 2107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },readlink:function (node) { 2108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isLink(node.mode)) { 2109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 2110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node.link; 2112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }},stream_ops:{read:function (stream, buffer, offset, length, position) { 2113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contents = stream.node.contents; 2114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (position >= contents.length) 2115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 2116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var size = Math.min(contents.length - position, length); 2117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(size >= 0); 2118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (size > 8 && contents.subarray) { // non-trivial, and typed array 2119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer.set(contents.subarray(position, position + size), offset); 2120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else 2121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 2122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < size; i++) { 2123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer[offset + i] = contents[position + i]; 2124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return size; 2127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },write:function (stream, buffer, offset, length, position, canOwn) { 2128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = stream.node; 2129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.timestamp = Date.now(); 2130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contents = node.contents; 2131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (length && contents.length === 0 && position === 0 && buffer.subarray) { 2132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // just replace it with the new data 2133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (canOwn && offset === 0) { 2134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source. 2135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED; 2136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contents = new Uint8Array(buffer.subarray(offset, offset+length)); 2138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contentMode = MEMFS.CONTENT_FIXED; 2139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return length; 2141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MEMFS.ensureFlexible(node); 2143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contents = node.contents; 2144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (contents.length < position) contents.push(0); 2145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < length; i++) { 2146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier contents[position + i] = buffer[offset + i]; 2147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return length; 2149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },llseek:function (stream, offset, whence) { 2150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var position = offset; 2151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (whence === 1) { // SEEK_CUR. 2152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier position += stream.position; 2153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (whence === 2) { // SEEK_END. 2154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isFile(stream.node.mode)) { 2155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier position += stream.node.contents.length; 2156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (position < 0) { 2159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 2160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.ungotten = []; 2162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.position = position; 2163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return position; 2164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },allocate:function (stream, offset, length) { 2165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MEMFS.ensureFlexible(stream.node); 2166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contents = stream.node.contents; 2167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var limit = offset + length; 2168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (limit > contents.length) contents.push(0); 2169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mmap:function (stream, buffer, offset, length, position, prot, flags) { 2170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isFile(stream.node.mode)) { 2171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENODEV); 2172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ptr; 2174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var allocated; 2175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contents = stream.node.contents; 2176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Only make a new copy when MAP_PRIVATE is specified. 2177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ( !(flags & 2) && 2178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (contents.buffer === buffer || contents.buffer === buffer.buffer) ) { 2179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // We can't emulate MAP_SHARED when the file is not backed by the buffer 2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we're mapping to (e.g. the HEAP buffer). 2181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier allocated = false; 2182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ptr = contents.byteOffset; 2183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Try to avoid unnecessary slices. 2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (position > 0 || position + length < contents.length) { 2186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (contents.subarray) { 2187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier contents = contents.subarray(position, position + length); 2188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier contents = Array.prototype.slice.call(contents, position, position + length); 2190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier allocated = true; 2193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ptr = _malloc(length); 2194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ptr) { 2195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOMEM); 2196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer.set(contents, ptr); 2198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return { ptr: ptr, allocated: allocated }; 2200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }}}; 2201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var IDBFS={dbs:{},indexedDB:function () { 2203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; 2204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) { 2205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // reuse all of the core MEMFS functionality 2206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return MEMFS.mount.apply(null, arguments); 2207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },syncfs:function (mount, populate, callback) { 2208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.getLocalSet(mount, function(err, local) { 2209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) return callback(err); 2210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.getRemoteSet(mount, function(err, remote) { 2212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) return callback(err); 2213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var src = populate ? remote : local; 2215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var dst = populate ? local : remote; 2216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.reconcile(src, dst, callback); 2218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getDB:function (name, callback) { 2221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // check the cache first 2222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var db = IDBFS.dbs[name]; 2223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (db) { 2224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(null, db); 2225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var req; 2228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION); 2230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(e); 2232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onupgradeneeded = function(e) { 2234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var db = e.target.result; 2235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var transaction = e.target.transaction; 2236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var fileStore; 2238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) { 2240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME); 2241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME); 2243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fileStore.createIndex('timestamp', 'timestamp', { unique: false }); 2246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onsuccess = function() { 2248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier db = req.result; 2249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // add to the cache 2251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.dbs[name] = db; 2252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callback(null, db); 2253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onerror = function() { 2255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callback(this.error); 2256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getLocalSet:function (mount, callback) { 2258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var entries = {}; 2259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function isRealDir(p) { 2261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return p !== '.' && p !== '..'; 2262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function toAbsolute(root) { 2264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return function(p) { 2265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return PATH.join2(root, p); 2266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint)); 2270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (check.length) { 2272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = check.pop(); 2273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stat; 2274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stat = FS.stat(path); 2277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(e); 2279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(stat.mode)) { 2282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path))); 2283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier entries[path] = { timestamp: stat.mtime }; 2286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(null, { type: 'local', entries: entries }); 2289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getRemoteSet:function (mount, callback) { 2290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var entries = {}; 2291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.getDB(mount.mountpoint, function(err, db) { 2293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) return callback(err); 2294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly'); 2296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier transaction.onerror = function() { callback(this.error); }; 2297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var store = transaction.objectStore(IDBFS.DB_STORE_NAME); 2299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var index = store.index('timestamp'); 2300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier index.openKeyCursor().onsuccess = function(event) { 2302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var cursor = event.target.result; 2303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!cursor) { 2305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(null, { type: 'remote', db: db, entries: entries }); 2306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier entries[cursor.primaryKey] = { timestamp: cursor.key }; 2309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier cursor.continue(); 2311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },loadLocalEntry:function (path, callback) { 2314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stat, node; 2315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path); 2318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = lookup.node; 2319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stat = FS.stat(path); 2320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(e); 2322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(stat.mode)) { 2325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(null, { timestamp: stat.mtime, mode: stat.mode }); 2326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isFile(stat.mode)) { 2327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents }); 2328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(new Error('node type not supported')); 2330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },storeLocalEntry:function (path, entry, callback) { 2332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(entry.mode)) { 2334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdir(path, entry.mode); 2335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isFile(entry.mode)) { 2336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true }); 2337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(new Error('node type not supported')); 2339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.utime(path, entry.timestamp, entry.timestamp); 2342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(e); 2344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callback(null); 2347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },removeLocalEntry:function (path, callback) { 2348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path); 2350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stat = FS.stat(path); 2351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(stat.mode)) { 2353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.rmdir(path); 2354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isFile(stat.mode)) { 2355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.unlink(path); 2356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(e); 2359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callback(null); 2362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },loadRemoteEntry:function (store, path, callback) { 2363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var req = store.get(path); 2364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onsuccess = function(event) { callback(null, event.target.result); }; 2365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onerror = function() { callback(this.error); }; 2366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },storeRemoteEntry:function (store, path, entry, callback) { 2367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var req = store.put(entry, path); 2368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onsuccess = function() { callback(null); }; 2369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onerror = function() { callback(this.error); }; 2370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },removeRemoteEntry:function (store, path, callback) { 2371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var req = store.delete(path); 2372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onsuccess = function() { callback(null); }; 2373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier req.onerror = function() { callback(this.error); }; 2374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },reconcile:function (src, dst, callback) { 2375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var total = 0; 2376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var create = []; 2378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object.keys(src.entries).forEach(function (key) { 2379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var e = src.entries[key]; 2380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var e2 = dst.entries[key]; 2381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e2 || e.timestamp > e2.timestamp) { 2382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier create.push(key); 2383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier total++; 2384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var remove = []; 2388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object.keys(dst.entries).forEach(function (key) { 2389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var e = dst.entries[key]; 2390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var e2 = src.entries[key]; 2391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e2) { 2392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier remove.push(key); 2393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier total++; 2394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!total) { 2398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(null); 2399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var errored = false; 2402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var completed = 0; 2403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var db = src.type === 'remote' ? src.db : dst.db; 2404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite'); 2405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var store = transaction.objectStore(IDBFS.DB_STORE_NAME); 2406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function done(err) { 2408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 2409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!done.errored) { 2410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier done.errored = true; 2411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(err); 2412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 2414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (++completed >= total) { 2416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(null); 2417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier transaction.onerror = function() { done(this.error); }; 2421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // sort paths in ascending order so directory entries are created 2423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // before the files inside them 2424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier create.sort().forEach(function (path) { 2425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (dst.type === 'local') { 2426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.loadRemoteEntry(store, path, function (err, entry) { 2427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) return done(err); 2428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.storeLocalEntry(path, entry, done); 2429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.loadLocalEntry(path, function (err, entry) { 2432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) return done(err); 2433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.storeRemoteEntry(store, path, entry, done); 2434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // sort paths in descending order so files are deleted before their 2439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // parent directories 2440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier remove.sort().reverse().forEach(function(path) { 2441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (dst.type === 'local') { 2442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.removeLocalEntry(path, done); 2443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier IDBFS.removeRemoteEntry(store, path, done); 2445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }}; 2448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var NODEFS={isWindows:false,staticInit:function () { 2450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier NODEFS.isWindows = !!process.platform.match(/^win/); 2451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mount:function (mount) { 2452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(ENVIRONMENT_IS_NODE); 2453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0); 2454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createNode:function (parent, name, mode, dev) { 2455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { 2456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 2457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.createNode(parent, name, mode); 2459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops = NODEFS.node_ops; 2460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.stream_ops = NODEFS.stream_ops; 2461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node; 2462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getMode:function (path) { 2463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stat; 2464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stat = fs.lstatSync(path); 2466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (NODEFS.isWindows) { 2467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so 2468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // propagate write bits to execute bits. 2469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stat.mode = stat.mode | ((stat.mode & 146) >> 1); 2470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stat.mode; 2476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },realPath:function (node) { 2477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parts = []; 2478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (node.parent !== node) { 2479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.push(node.name); 2480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = node.parent; 2481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.push(node.mount.opts.root); 2483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts.reverse(); 2484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return PATH.join.apply(null, parts); 2485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },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) { 2486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flags in NODEFS.flagsToPermissionStringMap) { 2487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return NODEFS.flagsToPermissionStringMap[flags]; 2488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return flags; 2490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },node_ops:{getattr:function (node) { 2492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = NODEFS.realPath(node); 2493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stat; 2494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stat = fs.lstatSync(path); 2496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096. 2501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // See http://support.microsoft.com/kb/140365 2502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (NODEFS.isWindows && !stat.blksize) { 2503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stat.blksize = 4096; 2504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (NODEFS.isWindows && !stat.blocks) { 2506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0; 2507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return { 2509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dev: stat.dev, 2510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ino: stat.ino, 2511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode: stat.mode, 2512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier nlink: stat.nlink, 2513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier uid: stat.uid, 2514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier gid: stat.gid, 2515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier rdev: stat.rdev, 2516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size: stat.size, 2517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier atime: stat.atime, 2518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mtime: stat.mtime, 2519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ctime: stat.ctime, 2520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier blksize: stat.blksize, 2521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier blocks: stat.blocks 2522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },setattr:function (node, attr) { 2524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = NODEFS.realPath(node); 2525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (attr.mode !== undefined) { 2527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.chmodSync(path, attr.mode); 2528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // update the common node structure mode as well 2529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.mode = attr.mode; 2530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (attr.timestamp !== undefined) { 2532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var date = new Date(attr.timestamp); 2533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.utimesSync(path, date, date); 2534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (attr.size !== undefined) { 2536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.truncateSync(path, attr.size); 2537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },lookup:function (parent, name) { 2543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = PATH.join2(NODEFS.realPath(parent), name); 2544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mode = NODEFS.getMode(path); 2545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return NODEFS.createNode(parent, name, mode); 2546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mknod:function (parent, name, mode, dev) { 2547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = NODEFS.createNode(parent, name, mode, dev); 2548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create the backing node for this in the fs root as well 2549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = NODEFS.realPath(node); 2550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(node.mode)) { 2552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.mkdirSync(path, node.mode); 2553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.writeFileSync(path, '', { mode: node.mode }); 2555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node; 2561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },rename:function (oldNode, newDir, newName) { 2562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var oldPath = NODEFS.realPath(oldNode); 2563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var newPath = PATH.join2(NODEFS.realPath(newDir), newName); 2564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.renameSync(oldPath, newPath); 2566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },unlink:function (parent, name) { 2571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = PATH.join2(NODEFS.realPath(parent), name); 2572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.unlinkSync(path); 2574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },rmdir:function (parent, name) { 2579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = PATH.join2(NODEFS.realPath(parent), name); 2580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.rmdirSync(path); 2582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },readdir:function (node) { 2587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = NODEFS.realPath(node); 2588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return fs.readdirSync(path); 2590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },symlink:function (parent, newName, oldPath) { 2595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var newPath = PATH.join2(NODEFS.realPath(parent), newName); 2596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.symlinkSync(oldPath, newPath); 2598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },readlink:function (node) { 2603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = NODEFS.realPath(node); 2604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return fs.readlinkSync(path); 2606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }},stream_ops:{open:function (stream) { 2611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = NODEFS.realPath(stream.node); 2612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isFile(stream.node.mode)) { 2614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags)); 2615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },close:function (stream) { 2621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isFile(stream.node.mode) && stream.nfd) { 2623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fs.closeSync(stream.nfd); 2624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!e.code) throw e; 2627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },read:function (stream, buffer, offset, length, position) { 2630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // FIXME this is terrible. 2631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var nbuffer = new Buffer(length); 2632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var res; 2633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier res = fs.readSync(stream.nfd, nbuffer, 0, length, position); 2635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (res > 0) { 2639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < res; i++) { 2640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer[offset + i] = nbuffer[i]; 2641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return res; 2644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },write:function (stream, buffer, offset, length, position) { 2645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // FIXME this is terrible. 2646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var nbuffer = new Buffer(buffer.subarray(offset, offset + length)); 2647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var res; 2648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier res = fs.writeSync(stream.nfd, nbuffer, 0, length, position); 2650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return res; 2654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },llseek:function (stream, offset, whence) { 2655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var position = offset; 2656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (whence === 1) { // SEEK_CUR. 2657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier position += stream.position; 2658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (whence === 2) { // SEEK_END. 2659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isFile(stream.node.mode)) { 2660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stat = fs.fstatSync(stream.nfd); 2662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier position += stat.size; 2663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES[e.code]); 2665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (position < 0) { 2670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 2671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.position = position; 2674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return position; 2675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }}}; 2676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _stdin=allocate(1, "i32*", ALLOC_STATIC); 2678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _stdout=allocate(1, "i32*", ALLOC_STATIC); 2680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _stderr=allocate(1, "i32*", ALLOC_STATIC); 2682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _fflush(stream) { 2684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // int fflush(FILE *stream); 2685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html 2686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we don't currently perform any user-space buffering of data 2687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) { 2688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); 2689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ___setErrNo(e.errno); 2690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },lookupPath:function (path, opts) { 2691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path = PATH.resolve(FS.cwd(), path); 2692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts = opts || {}; 2693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var defaults = { 2695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier follow_mount: true, 2696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier recurse_count: 0 2697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var key in defaults) { 2699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (opts[key] === undefined) { 2700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts[key] = defaults[key]; 2701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (opts.recurse_count > 8) { // max recursive lookup of 8 2705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ELOOP); 2706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // split the path 2709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parts = PATH.normalizeArray(path.split('/').filter(function(p) { 2710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !!p; 2711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }), false); 2712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // start at the root 2714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var current = FS.root; 2715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var current_path = '/'; 2716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < parts.length; i++) { 2718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var islast = (i === parts.length-1); 2719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (islast && opts.parent) { 2720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // stop resolving 2721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 2722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current = FS.lookupNode(current, parts[i]); 2725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current_path = PATH.join2(current_path, parts[i]); 2726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // jump to the mount's root node if this is a mountpoint 2728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isMountpoint(current)) { 2729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!islast || (islast && opts.follow_mount)) { 2730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current = current.mounted.root; 2731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // by default, lookupPath will not follow a symlink if it is the final path component. 2735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // setting opts.follow = true will override this behavior. 2736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!islast || opts.follow) { 2737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var count = 0; 2738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (FS.isLink(current.mode)) { 2739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var link = FS.readlink(current_path); 2740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current_path = PATH.resolve(PATH.dirname(current_path), link); 2741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); 2743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current = lookup.node; 2744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). 2746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ELOOP); 2747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return { path: current_path, node: current }; 2753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getPath:function (node) { 2754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path; 2755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (true) { 2756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isRoot(node)) { 2757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mount = node.mount.mountpoint; 2758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!path) return mount; 2759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; 2760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path = path ? node.name + '/' + path : node.name; 2762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = node.parent; 2763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },hashName:function (parentid, name) { 2765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var hash = 0; 2766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < name.length; i++) { 2769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; 2770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ((parentid + hash) >>> 0) % FS.nameTable.length; 2772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },hashAddNode:function (node) { 2773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var hash = FS.hashName(node.parent.id, node.name); 2774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.name_next = FS.nameTable[hash]; 2775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.nameTable[hash] = node; 2776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },hashRemoveNode:function (node) { 2777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var hash = FS.hashName(node.parent.id, node.name); 2778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.nameTable[hash] === node) { 2779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.nameTable[hash] = node.name_next; 2780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var current = FS.nameTable[hash]; 2782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (current) { 2783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (current.name_next === node) { 2784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current.name_next = node.name_next; 2785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 2786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current = current.name_next; 2788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },lookupNode:function (parent, name) { 2791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.mayLookup(parent); 2792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 2793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 2794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var hash = FS.hashName(parent.id, name); 2796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var node = FS.nameTable[hash]; node; node = node.name_next) { 2797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var nodeName = node.name; 2798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (node.parent.id === parent.id && nodeName === name) { 2799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node; 2800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we failed to find it in the cache, call into the VFS 2803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.lookup(parent, name); 2804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createNode:function (parent, name, mode, rdev) { 2805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.FSNode) { 2806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.FSNode = function(parent, name, mode, rdev) { 2807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!parent) { 2808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parent = this; // root node sets parent to itself 2809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.parent = parent; 2811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.mount = parent.mount; 2812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.mounted = null; 2813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.id = FS.nextInode++; 2814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.name = name; 2815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.mode = mode; 2816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.node_ops = {}; 2817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.stream_ops = {}; 2818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.rdev = rdev; 2819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 2820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.FSNode.prototype = {}; 2822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // compatibility 2824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var readMode = 292 | 73; 2825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var writeMode = 146; 2826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // NOTE we must use Object.defineProperties instead of individual calls to 2828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Object.defineProperty in order to make closure compiler happy 2829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object.defineProperties(FS.FSNode.prototype, { 2830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier read: { 2831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { return (this.mode & readMode) === readMode; }, 2832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; } 2833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 2834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier write: { 2835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { return (this.mode & writeMode) === writeMode; }, 2836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; } 2837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 2838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isFolder: { 2839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { return FS.isDir(this.mode); }, 2840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 2841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isDevice: { 2842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { return FS.isChrdev(this.mode); }, 2843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 2844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = new FS.FSNode(parent, name, mode, rdev); 2848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.hashAddNode(node); 2850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node; 2852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },destroyNode:function (node) { 2853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.hashRemoveNode(node); 2854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isRoot:function (node) { 2855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node === node.parent; 2856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isMountpoint:function (node) { 2857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !!node.mounted; 2858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isFile:function (mode) { 2859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (mode & 61440) === 32768; 2860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isDir:function (mode) { 2861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (mode & 61440) === 16384; 2862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isLink:function (mode) { 2863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (mode & 61440) === 40960; 2864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isChrdev:function (mode) { 2865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (mode & 61440) === 8192; 2866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isBlkdev:function (mode) { 2867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (mode & 61440) === 24576; 2868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isFIFO:function (mode) { 2869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (mode & 61440) === 4096; 2870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },isSocket:function (mode) { 2871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (mode & 49152) === 49152; 2872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },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) { 2873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var flags = FS.flagModes[str]; 2874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof flags === 'undefined') { 2875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new Error('Unknown file open mode: ' + str); 2876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return flags; 2878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },flagsToPermissionString:function (flag) { 2879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var accmode = flag & 2097155; 2880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var perms = ['r', 'w', 'rw'][accmode]; 2881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((flag & 512)) { 2882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier perms += 'w'; 2883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return perms; 2885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },nodePermissions:function (node, perms) { 2886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.ignorePermissions) { 2887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 2888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // return 0 if any user, group or owner bits are set. 2890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { 2891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.EACCES; 2892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { 2893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.EACCES; 2894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { 2895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.EACCES; 2896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 2898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mayLookup:function (dir) { 2899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.nodePermissions(dir, 'x'); 2900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mayCreate:function (dir, name) { 2901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.lookupNode(dir, name); 2903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.EEXIST; 2904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.nodePermissions(dir, 'wx'); 2907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mayDelete:function (dir, name, isdir) { 2908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node; 2909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 2910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = FS.lookupNode(dir, name); 2911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 2912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return e.errno; 2913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.nodePermissions(dir, 'wx'); 2915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 2916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return err; 2917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (isdir) { 2919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isDir(node.mode)) { 2920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.ENOTDIR; 2921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { 2923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.EBUSY; 2924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(node.mode)) { 2927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.EISDIR; 2928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 2931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mayOpen:function (node, flags) { 2932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!node) { 2933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.ENOENT; 2934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isLink(node.mode)) { 2936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.ELOOP; 2937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (FS.isDir(node.mode)) { 2938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((flags & 2097155) !== 0 || // opening for write 2939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (flags & 512)) { 2940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.EISDIR; 2941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); 2944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) { 2945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fd_start = fd_start || 0; 2946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier fd_end = fd_end || FS.MAX_OPEN_FDS; 2947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var fd = fd_start; fd <= fd_end; fd++) { 2948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.streams[fd]) { 2949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return fd; 2950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EMFILE); 2953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getStream:function (fd) { 2954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.streams[fd]; 2955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createStream:function (stream, fd_start, fd_end) { 2956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.FSStream) { 2957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.FSStream = function(){}; 2958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.FSStream.prototype = {}; 2959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // compatibility 2960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object.defineProperties(FS.FSStream.prototype, { 2961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier object: { 2962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { return this.node; }, 2963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier set: function(val) { this.node = val; } 2964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 2965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isRead: { 2966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { return (this.flags & 2097155) !== 1; } 2967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 2968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isWrite: { 2969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { return (this.flags & 2097155) !== 0; } 2970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 2971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isAppend: { 2972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { return (this.flags & 1024); } 2973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 2975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (0) { 2977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // reuse the object 2978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.__proto__ = FS.FSStream.prototype; 2979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 2980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var newStream = new FS.FSStream(); 2981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var p in stream) { 2982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier newStream[p] = stream[p]; 2983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream = newStream; 2985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var fd = FS.nextfd(fd_start, fd_end); 2987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.fd = fd; 2988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.streams[fd] = stream; 2989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stream; 2990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },closeStream:function (fd) { 2991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.streams[fd] = null; 2992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getStreamFromPtr:function (ptr) { 2993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.streams[ptr - 1]; 2994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getPtrForStream:function (stream) { 2995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stream ? stream.fd + 1 : 0; 2996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },chrdev_stream_ops:{open:function (stream) { 2997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var device = FS.getDevice(stream.node.rdev); 2998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // override node's stream ops with the device's 2999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.stream_ops = device.stream_ops; 3000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // forward the open call 3001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (stream.stream_ops.open) { 3002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.stream_ops.open(stream); 3003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },llseek:function () { 3005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); 3006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }},major:function (dev) { 3007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ((dev) >> 8); 3008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },minor:function (dev) { 3009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ((dev) & 0xff); 3010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },makedev:function (ma, mi) { 3011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ((ma) << 8 | (mi)); 3012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },registerDevice:function (dev, ops) { 3013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.devices[dev] = { stream_ops: ops }; 3014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getDevice:function (dev) { 3015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.devices[dev]; 3016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getMounts:function (mount) { 3017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mounts = []; 3018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var check = [mount]; 3019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (check.length) { 3021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var m = check.pop(); 3022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mounts.push(m); 3024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier check.push.apply(check, m.mounts); 3026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return mounts; 3029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },syncfs:function (populate, callback) { 3030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof(populate) === 'function') { 3031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callback = populate; 3032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier populate = false; 3033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mounts = FS.getMounts(FS.root.mount); 3036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var completed = 0; 3037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function done(err) { 3039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!done.errored) { 3041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier done.errored = true; 3042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return callback(err); 3043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 3045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (++completed >= mounts.length) { 3047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier callback(null); 3048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 3050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // sync all mounts 3052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mounts.forEach(function (mount) { 3053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!mount.type.syncfs) { 3054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return done(null); 3055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mount.type.syncfs(mount, populate, done); 3057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mount:function (type, opts, mountpoint) { 3059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var root = mountpoint === '/'; 3060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var pseudo = !mountpoint; 3061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node; 3062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (root && FS.root) { 3064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 3065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (!root && !pseudo) { 3066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); 3067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mountpoint = lookup.path; // use the absolute path 3069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = lookup.node; 3070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isMountpoint(node)) { 3072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 3073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isDir(node.mode)) { 3076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); 3077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mount = { 3081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type: type, 3082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts: opts, 3083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mountpoint: mountpoint, 3084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mounts: [] 3085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 3086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create a root node for the fs 3088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mountRoot = type.mount(mount); 3089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mountRoot.mount = mount; 3090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mount.root = mountRoot; 3091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (root) { 3093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.root = mountRoot; 3094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (node) { 3095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // set as a mountpoint 3096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.mounted = mount; 3097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // add the new mount to the current mount's children 3099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (node.mount) { 3100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.mount.mounts.push(mount); 3101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return mountRoot; 3105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },unmount:function (mountpoint) { 3106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); 3107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isMountpoint(lookup.node)) { 3109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // destroy the nodes for this mount, and all its child mounts 3113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = lookup.node; 3114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mount = node.mounted; 3115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mounts = FS.getMounts(mount); 3116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object.keys(FS.nameTable).forEach(function (hash) { 3118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var current = FS.nameTable[hash]; 3119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (current) { 3121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var next = current.name_next; 3122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (mounts.indexOf(current.mount) !== -1) { 3124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.destroyNode(current); 3125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current = next; 3128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // no longer a mountpoint 3132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.mounted = null; 3133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // remove this mount from the child mounts 3135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var idx = node.mount.mounts.indexOf(mount); 3136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(idx !== -1); 3137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.mount.mounts.splice(idx, 1); 3138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },lookup:function (parent, name) { 3139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parent.node_ops.lookup(parent, name); 3140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mknod:function (path, mode, dev) { 3141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { parent: true }); 3142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parent = lookup.node; 3143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var name = PATH.basename(path); 3144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.mayCreate(parent, name); 3145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!parent.node_ops.mknod) { 3149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parent.node_ops.mknod(parent, name, mode, dev); 3152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },create:function (path, mode) { 3153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode = mode !== undefined ? mode : 438 /* 0666 */; 3154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode &= 4095; 3155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode |= 32768; 3156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.mknod(path, mode, 0); 3157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mkdir:function (path, mode) { 3158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode = mode !== undefined ? mode : 511 /* 0777 */; 3159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode &= 511 | 512; 3160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode |= 16384; 3161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.mknod(path, mode, 0); 3162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mkdev:function (path, mode, dev) { 3163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof(dev) === 'undefined') { 3164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dev = mode; 3165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode = 438 /* 0666 */; 3166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode |= 8192; 3168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.mknod(path, mode, dev); 3169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },symlink:function (oldpath, newpath) { 3170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(newpath, { parent: true }); 3171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parent = lookup.node; 3172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var newname = PATH.basename(newpath); 3173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.mayCreate(parent, newname); 3174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!parent.node_ops.symlink) { 3178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parent.node_ops.symlink(parent, newname, oldpath); 3181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },rename:function (old_path, new_path) { 3182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var old_dirname = PATH.dirname(old_path); 3183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var new_dirname = PATH.dirname(new_path); 3184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var old_name = PATH.basename(old_path); 3185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var new_name = PATH.basename(new_path); 3186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // parents must exist 3187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup, old_dir, new_dir; 3188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier lookup = FS.lookupPath(old_path, { parent: true }); 3190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier old_dir = lookup.node; 3191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier lookup = FS.lookupPath(new_path, { parent: true }); 3192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier new_dir = lookup.node; 3193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 3195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // need to be part of the same mount 3197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (old_dir.mount !== new_dir.mount) { 3198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EXDEV); 3199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // source must exist 3201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var old_node = FS.lookupNode(old_dir, old_name); 3202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // old path should not be an ancestor of the new path 3203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var relative = PATH.relative(old_path, new_dirname); 3204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (relative.charAt(0) !== '.') { 3205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // new path should not be an ancestor of the old path 3208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier relative = PATH.relative(new_path, old_dirname); 3209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (relative.charAt(0) !== '.') { 3210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); 3211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // see if the new path already exists 3213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var new_node; 3214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier new_node = FS.lookupNode(new_dir, new_name); 3216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // not fatal 3218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // early out if nothing needs to change 3220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (old_node === new_node) { 3221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 3222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we'll need to delete the old entry 3224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var isdir = FS.isDir(old_node.mode); 3225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.mayDelete(old_dir, old_name, isdir); 3226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // need delete permissions if we'll be overwriting. 3230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // need create permissions if new doesn't already exist. 3231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier err = new_node ? 3232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mayDelete(new_dir, new_name, isdir) : 3233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mayCreate(new_dir, new_name); 3234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!old_dir.node_ops.rename) { 3238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { 3241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 3242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we are going to change the parent, check write permissions 3244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (new_dir !== old_dir) { 3245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier err = FS.nodePermissions(old_dir, 'w'); 3246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // remove the node from the lookup hash 3251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.hashRemoveNode(old_node); 3252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // do the underlying fs rename 3253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier old_dir.node_ops.rename(old_node, new_dir, new_name); 3255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw e; 3257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } finally { 3258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // add the node back to the hash (in case node_ops.rename 3259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // changed its name) 3260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.hashAddNode(old_node); 3261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },rmdir:function (path) { 3263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { parent: true }); 3264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parent = lookup.node; 3265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var name = PATH.basename(path); 3266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.lookupNode(parent, name); 3267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.mayDelete(parent, name, true); 3268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!parent.node_ops.rmdir) { 3272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isMountpoint(node)) { 3275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 3276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parent.node_ops.rmdir(parent, name); 3278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.destroyNode(node); 3279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },readdir:function (path) { 3280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { follow: true }); 3281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = lookup.node; 3282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!node.node_ops.readdir) { 3283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); 3284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node.node_ops.readdir(node); 3286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },unlink:function (path) { 3287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { parent: true }); 3288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parent = lookup.node; 3289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var name = PATH.basename(path); 3290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.lookupNode(parent, name); 3291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.mayDelete(parent, name, false); 3292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // POSIX says unlink should set EPERM, not EISDIR 3294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM; 3295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!parent.node_ops.unlink) { 3298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isMountpoint(node)) { 3301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBUSY); 3302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parent.node_ops.unlink(parent, name); 3304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.destroyNode(node); 3305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },readlink:function (path) { 3306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path); 3307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var link = lookup.node; 3308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!link.node_ops.readlink) { 3309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return link.node_ops.readlink(link); 3312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },stat:function (path, dontFollow) { 3313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { follow: !dontFollow }); 3314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = lookup.node; 3315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!node.node_ops.getattr) { 3316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node.node_ops.getattr(node); 3319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },lstat:function (path) { 3320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.stat(path, true); 3321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },chmod:function (path, mode, dontFollow) { 3322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node; 3323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof path === 'string') { 3324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { follow: !dontFollow }); 3325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = lookup.node; 3326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = path; 3328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!node.node_ops.setattr) { 3330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops.setattr(node, { 3333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode: (mode & 4095) | (node.mode & ~4095), 3334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier timestamp: Date.now() 3335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },lchmod:function (path, mode) { 3337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.chmod(path, mode, true); 3338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },fchmod:function (fd, mode) { 3339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.getStream(fd); 3340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream) { 3341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBADF); 3342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.chmod(stream.node, mode); 3344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },chown:function (path, uid, gid, dontFollow) { 3345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node; 3346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof path === 'string') { 3347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { follow: !dontFollow }); 3348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = lookup.node; 3349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = path; 3351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!node.node_ops.setattr) { 3353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops.setattr(node, { 3356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier timestamp: Date.now() 3357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we ignore the uid / gid for now 3358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },lchown:function (path, uid, gid) { 3360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.chown(path, uid, gid, true); 3361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },fchown:function (fd, uid, gid) { 3362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.getStream(fd); 3363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream) { 3364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBADF); 3365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.chown(stream.node, uid, gid); 3367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },truncate:function (path, len) { 3368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (len < 0) { 3369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node; 3372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof path === 'string') { 3373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { follow: true }); 3374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = lookup.node; 3375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = path; 3377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!node.node_ops.setattr) { 3379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EPERM); 3380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(node.mode)) { 3382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EISDIR); 3383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isFile(node.mode)) { 3385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.nodePermissions(node, 'w'); 3388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops.setattr(node, { 3392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size: len, 3393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier timestamp: Date.now() 3394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },ftruncate:function (fd, len) { 3396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.getStream(fd); 3397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream) { 3398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBADF); 3399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((stream.flags & 2097155) === 0) { 3401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.truncate(stream.node, len); 3404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },utime:function (path, atime, mtime) { 3405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { follow: true }); 3406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = lookup.node; 3407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.node_ops.setattr(node, { 3408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier timestamp: Math.max(atime, mtime) 3409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },open:function (path, flags, mode, fd_start, fd_end) { 3411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; 3412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; 3413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((flags & 64)) { 3414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode = (mode & 4095) | 32768; 3415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mode = 0; 3417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node; 3419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof path === 'object') { 3420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = path; 3421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path = PATH.normalize(path); 3423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { 3425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier follow: !(flags & 131072) 3426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = lookup.node; 3428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // ignore 3430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // perhaps we need to create the node 3433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((flags & 64)) { 3434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (node) { 3435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if O_CREAT and O_EXCL are set, error out if the node already exists 3436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((flags & 128)) { 3437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EEXIST); 3438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // node doesn't exist, try to create it 3441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node = FS.mknod(path, mode, 0); 3442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!node) { 3445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOENT); 3446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // can't truncate a device 3448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isChrdev(node.mode)) { 3449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags &= ~512; 3450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // check permissions 3452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.mayOpen(node, flags); 3453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // do truncation if necessary 3457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((flags & 512)) { 3458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.truncate(node, 0); 3459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we've already handled these, don't pass down to the underlying vfs 3461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags &= ~(128 | 512); 3462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // register the stream with the filesystem 3464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.createStream({ 3465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node: node, 3466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path: FS.getPath(node), // we want the absolute path to the node 3467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags: flags, 3468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier seekable: true, 3469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier position: 0, 3470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream_ops: node.stream_ops, 3471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // used by the file family libc calls (fopen, fwrite, ferror, etc.) 3472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ungotten: [], 3473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier error: false 3474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, fd_start, fd_end); 3475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // call the new stream's open function 3476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (stream.stream_ops.open) { 3477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.stream_ops.open(stream); 3478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['logReadFiles'] && !(flags & 1)) { 3480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.readFiles) FS.readFiles = {}; 3481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(path in FS.readFiles)) { 3482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.readFiles[path] = 1; 3483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['printErr']('read file: ' + path); 3484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stream; 3487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },close:function (stream) { 3488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (stream.stream_ops.close) { 3490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.stream_ops.close(stream); 3491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw e; 3494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } finally { 3495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.closeStream(stream.fd); 3496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },llseek:function (stream, offset, whence) { 3498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream.seekable || !stream.stream_ops.llseek) { 3499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); 3500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stream.stream_ops.llseek(stream, offset, whence); 3502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },read:function (stream, buffer, offset, length, position) { 3503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (length < 0 || position < 0) { 3504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((stream.flags & 2097155) === 1) { 3507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBADF); 3508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(stream.node.mode)) { 3510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EISDIR); 3511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream.stream_ops.read) { 3513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var seeking = true; 3516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof position === 'undefined') { 3517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier position = stream.position; 3518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier seeking = false; 3519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (!stream.seekable) { 3520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); 3521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); 3523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!seeking) stream.position += bytesRead; 3524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return bytesRead; 3525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },write:function (stream, buffer, offset, length, position, canOwn) { 3526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (length < 0 || position < 0) { 3527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((stream.flags & 2097155) === 0) { 3530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBADF); 3531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.isDir(stream.node.mode)) { 3533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EISDIR); 3534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream.stream_ops.write) { 3536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var seeking = true; 3539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof position === 'undefined') { 3540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier position = stream.position; 3541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier seeking = false; 3542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (!stream.seekable) { 3543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); 3544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (stream.flags & 1024) { 3546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // seek to the end before writing in append mode 3547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.llseek(stream, 0, 2); 3548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); 3550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!seeking) stream.position += bytesWritten; 3551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return bytesWritten; 3552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },allocate:function (stream, offset, length) { 3553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (offset < 0 || length <= 0) { 3554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 3555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((stream.flags & 2097155) === 0) { 3557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EBADF); 3558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) { 3560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENODEV); 3561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream.stream_ops.allocate) { 3563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); 3564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.stream_ops.allocate(stream, offset, length); 3566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mmap:function (stream, buffer, offset, length, position, prot, flags) { 3567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO if PROT is PROT_WRITE, make sure we have write access 3568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((stream.flags & 2097155) === 1) { 3569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EACCES); 3570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream.stream_ops.mmap) { 3572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENODEV); 3573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags); 3575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },ioctl:function (stream, cmd, arg) { 3576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream.stream_ops.ioctl) { 3577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTTY); 3578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stream.stream_ops.ioctl(stream, cmd, arg); 3580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },readFile:function (path, opts) { 3581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts = opts || {}; 3582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts.flags = opts.flags || 'r'; 3583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts.encoding = opts.encoding || 'binary'; 3584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { 3585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new Error('Invalid encoding type "' + opts.encoding + '"'); 3586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret; 3588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.open(path, opts.flags); 3589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stat = FS.stat(path); 3590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var length = stat.size; 3591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var buf = new Uint8Array(length); 3592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.read(stream, buf, 0, length, 0); 3593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (opts.encoding === 'utf8') { 3594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = ''; 3595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var utf8 = new Runtime.UTF8Processor(); 3596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < length; i++) { 3597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret += utf8.processCChar(buf[i]); 3598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (opts.encoding === 'binary') { 3600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = buf; 3601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.close(stream); 3603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 3604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },writeFile:function (path, data, opts) { 3605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts = opts || {}; 3606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts.flags = opts.flags || 'w'; 3607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier opts.encoding = opts.encoding || 'utf8'; 3608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { 3609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new Error('Invalid encoding type "' + opts.encoding + '"'); 3610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.open(path, opts.flags, opts.mode); 3612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (opts.encoding === 'utf8') { 3613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var utf8 = new Runtime.UTF8Processor(); 3614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var buf = new Uint8Array(utf8.processJSString(data)); 3615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.write(stream, buf, 0, buf.length, 0, opts.canOwn); 3616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (opts.encoding === 'binary') { 3617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.write(stream, data, 0, data.length, 0, opts.canOwn); 3618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.close(stream); 3620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },cwd:function () { 3621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.currentPath; 3622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },chdir:function (path) { 3623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { follow: true }); 3624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.isDir(lookup.node.mode)) { 3625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); 3626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var err = FS.nodePermissions(lookup.node, 'x'); 3628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (err) { 3629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(err); 3630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.currentPath = lookup.path; 3632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createDefaultDirectories:function () { 3633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdir('/tmp'); 3634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createDefaultDevices:function () { 3635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create /dev 3636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdir('/dev'); 3637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // setup /dev/null 3638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.registerDevice(FS.makedev(1, 3), { 3639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier read: function() { return 0; }, 3640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier write: function() { return 0; } 3641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdev('/dev/null', FS.makedev(1, 3)); 3643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // setup /dev/tty and /dev/tty1 3644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // stderr needs to print output using Module['printErr'] 3645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // so we register a second tty just for it. 3646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); 3647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); 3648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdev('/dev/tty', FS.makedev(5, 0)); 3649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdev('/dev/tty1', FS.makedev(6, 0)); 3650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we're not going to emulate the actual shm device, 3651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // just create the tmp dirs that reside in it commonly 3652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdir('/dev/shm'); 3653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdir('/dev/shm/tmp'); 3654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createStandardStreams:function () { 3655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO deprecate the old functionality of a single 3656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // input / output callback and that utilizes FS.createDevice 3657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // and instead require a unique set of stream ops 3658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // by default, we symlink the standard streams to the 3660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // default tty devices. however, if the standard streams 3661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // have been overwritten we create a unique device for 3662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // them instead. 3663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['stdin']) { 3664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.createDevice('/dev', 'stdin', Module['stdin']); 3665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.symlink('/dev/tty', '/dev/stdin'); 3667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['stdout']) { 3669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.createDevice('/dev', 'stdout', null, Module['stdout']); 3670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.symlink('/dev/tty', '/dev/stdout'); 3672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['stderr']) { 3674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.createDevice('/dev', 'stderr', null, Module['stderr']); 3675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.symlink('/dev/tty1', '/dev/stderr'); 3677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // open default streams for the stdin, stdout and stderr devices 3680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stdin = FS.open('/dev/stdin', 'r'); 3681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin); 3682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); 3683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stdout = FS.open('/dev/stdout', 'w'); 3685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout); 3686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); 3687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stderr = FS.open('/dev/stderr', 'w'); 3689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr); 3690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); 3691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },ensureErrnoError:function () { 3692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.ErrnoError) return; 3693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.ErrnoError = function ErrnoError(errno) { 3694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.errno = errno; 3695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var key in ERRNO_CODES) { 3696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ERRNO_CODES[key] === errno) { 3697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.code = key; 3698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 3699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.message = ERRNO_MESSAGES[errno]; 3702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 3703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.ErrnoError.prototype = new Error(); 3704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.ErrnoError.prototype.constructor = FS.ErrnoError; 3705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) 3706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier [ERRNO_CODES.ENOENT].forEach(function(code) { 3707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.genericErrors[code] = new FS.ErrnoError(code); 3708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.genericErrors[code].stack = '<generic error, no stack>'; 3709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },staticInit:function () { 3711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.ensureErrnoError(); 3712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.nameTable = new Array(4096); 3714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mount(MEMFS, {}, '/'); 3716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.createDefaultDirectories(); 3718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.createDefaultDevices(); 3719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },init:function (input, output, error) { 3720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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)'); 3721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.init.initialized = true; 3722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.ensureErrnoError(); 3724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here 3726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['stdin'] = input || Module['stdin']; 3727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['stdout'] = output || Module['stdout']; 3728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['stderr'] = error || Module['stderr']; 3729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.createStandardStreams(); 3731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },quit:function () { 3732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.init.initialized = false; 3733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < FS.streams.length; i++) { 3734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.streams[i]; 3735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream) { 3736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 3737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.close(stream); 3739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getMode:function (canRead, canWrite) { 3741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mode = 0; 3742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (canRead) mode |= 292 | 73; 3743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (canWrite) mode |= 146; 3744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return mode; 3745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },joinPath:function (parts, forceRelative) { 3746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = PATH.join.apply(null, parts); 3747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (forceRelative && path[0] == '/') path = path.substr(1); 3748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return path; 3749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },absolutePath:function (relative, base) { 3750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return PATH.resolve(base, relative); 3751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },standardizePath:function (path) { 3752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return PATH.normalize(path); 3753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },findObject:function (path, dontResolveLastLink) { 3754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = FS.analyzePath(path, dontResolveLastLink); 3755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ret.exists) { 3756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret.object; 3757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ___setErrNo(ret.error); 3759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return null; 3760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },analyzePath:function (path, dontResolveLastLink) { 3762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // operate from within the context of the symlink's target 3763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); 3765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path = lookup.path; 3766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = { 3769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isRoot: false, exists: false, error: 0, name: null, path: null, object: null, 3770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parentExists: false, parentPath: null, parentObject: null 3771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 3772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lookup = FS.lookupPath(path, { parent: true }); 3774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.parentExists = true; 3775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.parentPath = lookup.path; 3776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.parentObject = lookup.node; 3777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.name = PATH.basename(path); 3778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); 3779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.exists = true; 3780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.path = lookup.path; 3781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.object = lookup.node; 3782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.name = lookup.node.name; 3783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.isRoot = lookup.path === '/'; 3784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.error = e.errno; 3786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 3787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 3788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createFolder:function (parent, name, canRead, canWrite) { 3789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); 3790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mode = FS.getMode(canRead, canWrite); 3791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.mkdir(path, mode); 3792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createPath:function (parent, path, canRead, canWrite) { 3793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parent = typeof parent === 'string' ? parent : FS.getPath(parent); 3794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parts = path.split('/').reverse(); 3795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (parts.length) { 3796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var part = parts.pop(); 3797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!part) continue; 3798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var current = PATH.join2(parent, part); 3799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.mkdir(current); 3801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // ignore EEXIST 3803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parent = current; 3805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return current; 3807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createFile:function (parent, name, properties, canRead, canWrite) { 3808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); 3809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mode = FS.getMode(canRead, canWrite); 3810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.create(path, mode); 3811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) { 3812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; 3813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mode = FS.getMode(canRead, canWrite); 3814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.create(path, mode); 3815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (data) { 3816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof data === 'string') { 3817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var arr = new Array(data.length); 3818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); 3819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data = arr; 3820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // make sure we can write to the file 3822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.chmod(node, mode | 146); 3823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.open(node, 'w'); 3824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.write(stream, data, 0, data.length, 0, canOwn); 3825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.close(stream); 3826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.chmod(node, mode); 3827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node; 3829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createDevice:function (parent, name, input, output) { 3830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); 3831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mode = FS.getMode(!!input, !!output); 3832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.createDevice.major) FS.createDevice.major = 64; 3833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var dev = FS.makedev(FS.createDevice.major++, 0); 3834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Create a fake device that a set of stream ops to emulate 3835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // the old behavior. 3836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.registerDevice(dev, { 3837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier open: function(stream) { 3838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.seekable = false; 3839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 3840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier close: function(stream) { 3841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // flush any pending line data 3842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (output && output.buffer && output.buffer.length) { 3843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier output(10); 3844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 3846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier read: function(stream, buffer, offset, length, pos /* ignored */) { 3847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytesRead = 0; 3848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < length; i++) { 3849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var result; 3850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier result = input(); 3852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EIO); 3854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (result === undefined && bytesRead === 0) { 3856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 3857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (result === null || result === undefined) break; 3859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bytesRead++; 3860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer[offset+i] = result; 3861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (bytesRead) { 3863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.node.timestamp = Date.now(); 3864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return bytesRead; 3866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 3867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier write: function(stream, buffer, offset, length, pos) { 3868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < length; i++) { 3869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier output(buffer[offset+i]); 3871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EIO); 3873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (length) { 3876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream.node.timestamp = Date.now(); 3877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i; 3879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.mkdev(path, mode, dev); 3882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createLink:function (parent, name, target, canRead, canWrite) { 3883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); 3884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.symlink(target, path); 3885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },forceLoadFile:function (obj) { 3886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; 3887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var success = true; 3888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof XMLHttpRequest !== 'undefined') { 3889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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."); 3890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (Module['read']) { 3891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Command-line. 3892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 3893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as 3894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // read() will try to parse UTF8. 3895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier obj.contents = intArrayFromString(Module['read'](obj.url), true); 3896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 3897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier success = false; 3898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new Error('Cannot load without read() or XMLHttpRequest.'); 3901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!success) ___setErrNo(ERRNO_CODES.EIO); 3903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return success; 3904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createLazyFile:function (parent, name, url, canRead, canWrite) { 3905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. 3906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function LazyUint8Array() { 3907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.lengthKnown = false; 3908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.chunks = []; // Loaded chunks. Index is the chunk number 3909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { 3911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (idx > this.length-1 || idx < 0) { 3912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return undefined; 3913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var chunkOffset = idx % this.chunkSize; 3915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var chunkNum = Math.floor(idx / this.chunkSize); 3916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return this.getter(chunkNum)[chunkOffset]; 3917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { 3919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.getter = getter; 3920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { 3922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Find length 3923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var xhr = new XMLHttpRequest(); 3924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.open('HEAD', url, false); 3925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.send(null); 3926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); 3927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var datalength = Number(xhr.getResponseHeader("Content-length")); 3928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var header; 3929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; 3930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var chunkSize = 1024*1024; // Chunk size in bytes 3931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!hasByteServing) chunkSize = datalength; 3933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Function to get a range from the remote URL. 3935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var doXHR = (function(from, to) { 3936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); 3937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); 3938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. 3940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var xhr = new XMLHttpRequest(); 3941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.open('GET', url, false); 3942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); 3943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Some hints to the browser that we want binary data. 3945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; 3946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (xhr.overrideMimeType) { 3947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.overrideMimeType('text/plain; charset=x-user-defined'); 3948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.send(null); 3951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); 3952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (xhr.response !== undefined) { 3953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return new Uint8Array(xhr.response || []); 3954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return intArrayFromString(xhr.responseText || '', true); 3956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lazyArray = this; 3959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier lazyArray.setDataGetter(function(chunkNum) { 3960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var start = chunkNum * chunkSize; 3961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var end = (chunkNum+1) * chunkSize - 1; // including this byte 3962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block 3963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { 3964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier lazyArray.chunks[chunkNum] = doXHR(start, end); 3965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); 3967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return lazyArray.chunks[chunkNum]; 3968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this._length = datalength; 3971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this._chunkSize = chunkSize; 3972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.lengthKnown = true; 3973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof XMLHttpRequest !== 'undefined') { 3975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; 3976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var lazyArray = new LazyUint8Array(); 3977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object.defineProperty(lazyArray, "length", { 3978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { 3979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if(!this.lengthKnown) { 3980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.cacheLength(); 3981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return this._length; 3983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object.defineProperty(lazyArray, "chunkSize", { 3986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier get: function() { 3987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if(!this.lengthKnown) { 3988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.cacheLength(); 3989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return this._chunkSize; 3991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 3993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var properties = { isDevice: false, contents: lazyArray }; 3995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var properties = { isDevice: false, url: url }; 3997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.createFile(parent, name, properties, canRead, canWrite); 4000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // This is a total hack, but I want to get this lazy file code out of the 4001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // core of MEMFS. If we want to keep this lazy file concept I feel it should 4002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // be its own thin LAZYFS proxying calls to MEMFS. 4003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (properties.contents) { 4004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contents = properties.contents; 4005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (properties.url) { 4006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.contents = null; 4007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.url = properties.url; 4008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // override each stream op with one that tries to force load the lazy file first 4010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream_ops = {}; 4011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var keys = Object.keys(node.stream_ops); 4012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier keys.forEach(function(key) { 4013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var fn = node.stream_ops[key]; 4014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream_ops[key] = function forceLoadLazyFile() { 4015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.forceLoadFile(node)) { 4016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EIO); 4017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return fn.apply(null, arguments); 4019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // use a custom read function 4022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { 4023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FS.forceLoadFile(node)) { 4024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EIO); 4025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contents = stream.node.contents; 4027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (position >= contents.length) 4028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 4029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var size = Math.min(contents.length - position, length); 4030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(size >= 0); 4031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (contents.slice) { // normal array 4032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < size; i++) { 4033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer[offset + i] = contents[position + i]; 4034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR 4037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer[offset + i] = contents.get(position + i); 4038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return size; 4041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.stream_ops = stream_ops; 4043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return node; 4044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) { 4045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.init(); 4046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO we should allow people to just pass in a complete filename instead 4047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // of parent and name being that we just join them anyways 4048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent; 4049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function processData(byteArray) { 4050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function finish(byteArray) { 4051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!dontCreateFile) { 4052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); 4053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (onload) onload(); 4055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier removeRunDependency('cp ' + fullname); 4056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var handled = false; 4058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['preloadPlugins'].forEach(function(plugin) { 4059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (handled) return; 4060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (plugin['canHandle'](fullname)) { 4061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier plugin['handle'](byteArray, fullname, finish, function() { 4062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (onerror) onerror(); 4063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier removeRunDependency('cp ' + fullname); 4064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier handled = true; 4066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!handled) finish(byteArray); 4069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addRunDependency('cp ' + fullname); 4071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof url == 'string') { 4072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.asyncLoad(url, function(byteArray) { 4073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier processData(byteArray); 4074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, onerror); 4075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier processData(url); 4077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },indexedDB:function () { 4079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; 4080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },DB_NAME:function () { 4081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 'EM_FS_' + window.location.pathname; 4082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) { 4083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onload = onload || function(){}; 4084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onerror = onerror || function(){}; 4085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var indexedDB = FS.indexedDB(); 4086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); 4088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return onerror(e); 4090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { 4092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier console.log('creating db'); 4093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var db = openRequest.result; 4094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier db.createObjectStore(FS.DB_STORE_NAME); 4095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier openRequest.onsuccess = function openRequest_onsuccess() { 4097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var db = openRequest.result; 4098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); 4099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var files = transaction.objectStore(FS.DB_STORE_NAME); 4100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ok = 0, fail = 0, total = paths.length; 4101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function finish() { 4102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (fail == 0) onload(); else onerror(); 4103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier paths.forEach(function(path) { 4105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var putRequest = files.put(FS.analyzePath(path).object.contents, path); 4106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; 4107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; 4108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier transaction.onerror = onerror; 4110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier openRequest.onerror = onerror; 4112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },loadFilesFromDB:function (paths, onload, onerror) { 4113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onload = onload || function(){}; 4114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onerror = onerror || function(){}; 4115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var indexedDB = FS.indexedDB(); 4116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); 4118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return onerror(e); 4120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier openRequest.onupgradeneeded = onerror; // no database to load from 4122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier openRequest.onsuccess = function openRequest_onsuccess() { 4123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var db = openRequest.result; 4124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); 4126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 4127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onerror(e); 4128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 4129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var files = transaction.objectStore(FS.DB_STORE_NAME); 4131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ok = 0, fail = 0, total = paths.length; 4132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function finish() { 4133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (fail == 0) onload(); else onerror(); 4134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier paths.forEach(function(path) { 4136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var getRequest = files.get(path); 4137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getRequest.onsuccess = function getRequest_onsuccess() { 4138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FS.analyzePath(path).exists) { 4139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.unlink(path); 4140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); 4142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ok++; 4143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ok + fail == total) finish(); 4144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; 4146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier transaction.onerror = onerror; 4148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier openRequest.onerror = onerror; 4150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }}; 4151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) { 4156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); 4157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createSocket:function (family, type, protocol) { 4158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var streaming = type == 1; 4159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (protocol) { 4160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp 4161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create our internal socket structure 4164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var sock = { 4165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier family: family, 4166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type: type, 4167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier protocol: protocol, 4168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier server: null, 4169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peers: {}, 4170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier pending: [], 4171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier recv_queue: [], 4172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock_ops: SOCKFS.websocket_sock_ops 4173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create the filesystem node to store the socket structure 4176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var name = SOCKFS.nextname(); 4177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var node = FS.createNode(SOCKFS.root, name, 49152, 0); 4178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node.sock = sock; 4179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // and the wrapping stream that enables library functions such 4181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // as read and write to indirectly interact with the socket 4182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.createStream({ 4183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier path: name, 4184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier node: node, 4185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags: FS.modeStringToFlags('r+'), 4186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier seekable: false, 4187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream_ops: SOCKFS.stream_ops 4188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // map the new stream to the socket structure (sockets have a 1:1 4191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // relationship with a stream) 4192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.stream = stream; 4193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return sock; 4195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getSocket:function (fd) { 4196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.getStream(fd); 4197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream || !FS.isSocket(stream.node.mode)) { 4198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return null; 4199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stream.node.sock; 4201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },stream_ops:{poll:function (stream) { 4202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var sock = stream.node.sock; 4203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return sock.sock_ops.poll(sock); 4204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },ioctl:function (stream, request, varargs) { 4205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var sock = stream.node.sock; 4206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return sock.sock_ops.ioctl(sock, request, varargs); 4207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },read:function (stream, buffer, offset, length, position /* ignored */) { 4208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var sock = stream.node.sock; 4209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var msg = sock.sock_ops.recvmsg(sock, length); 4210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!msg) { 4211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // socket is closed 4212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 4213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer.set(msg.buffer, offset); 4215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return msg.buffer.length; 4216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },write:function (stream, buffer, offset, length, position /* ignored */) { 4217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var sock = stream.node.sock; 4218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return sock.sock_ops.sendmsg(sock, buffer, offset, length); 4219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },close:function (stream) { 4220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var sock = stream.node.sock; 4221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.sock_ops.close(sock); 4222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }},nextname:function () { 4223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!SOCKFS.nextname.current) { 4224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SOCKFS.nextname.current = 0; 4225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 'socket[' + (SOCKFS.nextname.current++) + ']'; 4227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },websocket_sock_ops:{createPeer:function (sock, addr, port) { 4228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ws; 4229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof addr === 'object') { 4231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ws = addr; 4232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr = null; 4233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port = null; 4234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ws) { 4237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // for sockets that've already connected (e.g. we're the server) 4238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we can inspect the _socket property for the address 4239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ws._socket) { 4240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr = ws._socket.remoteAddress; 4241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port = ws._socket.remotePort; 4242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we're just now initializing a connection to the remote, 4244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // inspect the url property 4245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier else { 4246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url); 4247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!result) { 4248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new Error('WebSocket URL must be in the format ws(s)://address:port'); 4249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr = result[1]; 4251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port = parseInt(result[2], 10); 4252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create the actual websocket object and connect 4255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // runtimeConfig gets set to true if WebSocket runtime configuration is available. 4257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var runtimeConfig = (Module['websocket'] && ('object' === typeof Module['websocket'])); 4258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // The default value is 'ws://' the replace is needed because the compiler replaces "//" comments with '#' 4260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // comments without checking context, so we'd end up with ws:#, the replace swaps the "#" for "//" again. 4261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var url = 'ws:#'.replace('#', '//'); 4262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (runtimeConfig) { 4264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ('string' === typeof Module['websocket']['url']) { 4265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier url = Module['websocket']['url']; // Fetch runtime WebSocket URL config. 4266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (url === 'ws://' || url === 'wss://') { // Is the supplied URL config just a prefix, if so complete it. 4270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier url = url + addr + ':' + port; 4271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set. 4274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var subProtocols = 'binary'; // The default value is 'binary' 4275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (runtimeConfig) { 4277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ('string' === typeof Module['websocket']['subprotocol']) { 4278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier subProtocols = Module['websocket']['subprotocol']; // Fetch runtime WebSocket subprotocol config. 4279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // The regex trims the string (removes spaces at the beginning and end, then splits the string by 4283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // <any space>,<any space> into an Array. Whitespace removal is important for Websockify and ws. 4284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier subProtocols = subProtocols.replace(/^ +| +$/g,"").split(/ *, */); 4285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // The node ws library API for specifying optional subprotocol is slightly different than the browser's. 4287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var opts = ENVIRONMENT_IS_NODE ? {'protocol': subProtocols.toString()} : subProtocols; 4288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // If node we use the ws library. 4290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket']; 4291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ws = new WebSocket(url, opts); 4292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ws.binaryType = 'arraybuffer'; 4293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH); 4295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var peer = { 4300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr: addr, 4301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port: port, 4302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier socket: ws, 4303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dgram_send_queue: [] 4304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SOCKFS.websocket_sock_ops.addPeer(sock, peer); 4307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer); 4308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if this is a bound dgram socket, send the port number first to allow 4310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // us to override the ephemeral port reported to us by remotePort on the 4311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // remote end. 4312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 2 && typeof sock.sport !== 'undefined') { 4313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.dgram_send_queue.push(new Uint8Array([ 4314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 255, 255, 255, 255, 4315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0), 4316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff) 4317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ])); 4318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return peer; 4321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getPeer:function (sock, addr, port) { 4322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return sock.peers[addr + ':' + port]; 4323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },addPeer:function (sock, peer) { 4324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.peers[peer.addr + ':' + peer.port] = peer; 4325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },removePeer:function (sock, peer) { 4326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete sock.peers[peer.addr + ':' + peer.port]; 4327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },handlePeerEvents:function (sock, peer) { 4328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var first = true; 4329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var handleOpen = function () { 4331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var queued = peer.dgram_send_queue.shift(); 4333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (queued) { 4334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.socket.send(queued); 4335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier queued = peer.dgram_send_queue.shift(); 4336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // not much we can do here in the way of proper error handling as we've already 4339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // lied and said this data was sent. shut it down. 4340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.socket.close(); 4341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function handleMessage(data) { 4345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(typeof data !== 'string' && data.byteLength !== undefined); // must receive an ArrayBuffer 4346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data = new Uint8Array(data); // make a typed array view on the array buffer 4347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if this is the port message, override the peer's port with it 4350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var wasfirst = first; 4351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier first = false; 4352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (wasfirst && 4353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data.length === 10 && 4354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 && 4355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) { 4356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // update the peer's port and it's key in the peer map 4357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var newport = ((data[8] << 8) | data[9]); 4358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SOCKFS.websocket_sock_ops.removePeer(sock, peer); 4359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.port = newport; 4360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SOCKFS.websocket_sock_ops.addPeer(sock, peer); 4361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 4362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data }); 4365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ENVIRONMENT_IS_NODE) { 4368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.socket.on('open', handleOpen); 4369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.socket.on('message', function(data, flags) { 4370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!flags.binary) { 4371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 4372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier handleMessage((new Uint8Array(data)).buffer); // copy from node Buffer -> ArrayBuffer 4374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.socket.on('error', function() { 4376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // don't throw 4377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.socket.onopen = handleOpen; 4380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.socket.onmessage = function peer_socket_onmessage(event) { 4381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier handleMessage(event.data); 4382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },poll:function (sock) { 4385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 1 && sock.server) { 4386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // listen sockets should only say they're available for reading 4387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if there are pending clients. 4388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return sock.pending.length ? (64 | 1) : 0; 4389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var mask = 0; 4392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var dest = sock.type === 1 ? // we only care about the socket state for connection-based sockets 4393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) : 4394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier null; 4395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.recv_queue.length || 4397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier !dest || // connection-less sockets are always ready to read 4398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (dest && dest.socket.readyState === dest.socket.CLOSING) || 4399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (dest && dest.socket.readyState === dest.socket.CLOSED)) { // let recv return 0 once closed 4400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mask |= (64 | 1); 4401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!dest || // connection-less sockets are always ready to write 4404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (dest && dest.socket.readyState === dest.socket.OPEN)) { 4405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mask |= 4; 4406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((dest && dest.socket.readyState === dest.socket.CLOSING) || 4409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (dest && dest.socket.readyState === dest.socket.CLOSED)) { 4410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier mask |= 16; 4411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return mask; 4414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },ioctl:function (sock, request, arg) { 4415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (request) { 4416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 21531: 4417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytes = 0; 4418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.recv_queue.length) { 4419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bytes = sock.recv_queue[0].data.length; 4420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((arg)>>2)]=bytes; 4422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 4423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: 4424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ERRNO_CODES.EINVAL; 4425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },close:function (sock) { 4427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we've spawned a listen server, close it 4428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.server) { 4429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server.close(); 4431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server = null; 4434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // close any peer connections 4436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var peers = Object.keys(sock.peers); 4437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < peers.length; i++) { 4438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var peer = sock.peers[peers[i]]; 4439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier peer.socket.close(); 4441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SOCKFS.websocket_sock_ops.removePeer(sock, peer); 4444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 4446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },bind:function (sock, addr, port) { 4447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') { 4448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already bound 4449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.saddr = addr; 4451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.sport = port || _mkport(); 4452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // in order to emulate dgram sockets, we need to launch a listen server when 4453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // binding on a connection-less socket 4454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // note: this is only required on the server side 4455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 2) { 4456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // close the existing server if it exists 4457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.server) { 4458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server.close(); 4459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server = null; 4460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // swallow error operation not supported error that occurs when binding in the 4462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // browser where this isn't supported 4463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.sock_ops.listen(sock, 0); 4465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(e instanceof FS.ErrnoError)) throw e; 4467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e; 4468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },connect:function (sock, addr, port) { 4471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.server) { 4472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP); 4473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO autobind 4476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if (!sock.addr && sock.type == 2) { 4477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // } 4478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // early out if we're already connected / in the middle of connecting 4480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') { 4481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); 4482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (dest) { 4483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (dest.socket.readyState === dest.socket.CONNECTING) { 4484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EALREADY); 4485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EISCONN); 4487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // add the socket to our peer list and set our 4492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // destination address / port to match 4493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); 4494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.daddr = peer.addr; 4495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.dport = peer.port; 4496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // always "fail" in non-blocking mode 4498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS); 4499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },listen:function (sock, backlog) { 4500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ENVIRONMENT_IS_NODE) { 4501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); 4502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.server) { 4504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); // already listening 4505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var WebSocketServer = require('ws').Server; 4507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var host = sock.saddr; 4508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server = new WebSocketServer({ 4509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier host: host, 4510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port: sock.sport 4511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO support backlog 4512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server.on('connection', function(ws) { 4515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 1) { 4516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol); 4517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create a peer on the new socket 4519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws); 4520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier newsock.daddr = peer.addr; 4521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier newsock.dport = peer.port; 4522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // push to queue for accept to pick up 4524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.pending.push(newsock); 4525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create a peer on the listen socket so calling sendto 4527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // with the listen socket and an address will resolve 4528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // to the correct client 4529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SOCKFS.websocket_sock_ops.createPeer(sock, ws); 4530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server.on('closed', function() { 4533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server = null; 4534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.server.on('error', function() { 4536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // don't throw 4537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },accept:function (listensock) { 4539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!listensock.server) { 4540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 4541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var newsock = listensock.pending.shift(); 4543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier newsock.stream.flags = listensock.stream.flags; 4544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return newsock; 4545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getname:function (sock, peer) { 4546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var addr, port; 4547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (peer) { 4548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.daddr === undefined || sock.dport === undefined) { 4549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); 4550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr = sock.daddr; 4552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port = sock.dport; 4553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO saddr and sport will be set for bind()'d UDP sockets, but what 4555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // should we be returning for TCP sockets that've been connect()'d? 4556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr = sock.saddr || 0; 4557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port = sock.sport || 0; 4558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return { addr: addr, port: port }; 4560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },sendmsg:function (sock, buffer, offset, length, addr, port) { 4561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 2) { 4562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // connection-less sockets will honor the message address, 4563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // and otherwise fall back to the bound destination address 4564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (addr === undefined || port === undefined) { 4565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr = sock.daddr; 4566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port = sock.dport; 4567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if there was no address to fall back to, error out 4569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (addr === undefined || port === undefined) { 4570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ); 4571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // connection-based sockets will only use the bound 4574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr = sock.daddr; 4575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port = sock.dport; 4576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // find the peer for the destination address 4579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port); 4580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // early out if not connected with a connection-based socket 4582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 1) { 4583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { 4584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); 4585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (dest.socket.readyState === dest.socket.CONNECTING) { 4586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 4587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // create a copy of the incoming data to send, as the WebSocket API 4591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // doesn't work entirely with an ArrayBufferView, it'll just send 4592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // the entire underlying buffer 4593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var data; 4594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (buffer instanceof Array || buffer instanceof ArrayBuffer) { 4595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data = buffer.slice(offset, offset + length); 4596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { // ArrayBufferView 4597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length); 4598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we're emulating a connection-less dgram socket and don't have 4601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // a cached connection, queue the buffer to send upon connect and 4602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // lie, saying the data was sent now. 4603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 2) { 4604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!dest || dest.socket.readyState !== dest.socket.OPEN) { 4605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we're not connected, open a new connection 4606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { 4607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port); 4608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dest.dgram_send_queue.push(data); 4610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return length; 4611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // send the actual data 4616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier dest.socket.send(data); 4617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return length; 4618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EINVAL); 4620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },recvmsg:function (sock, length) { 4622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html 4623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 1 && sock.server) { 4624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // tcp servers should not be recv()'ing on the listen socket 4625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); 4626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var queued = sock.recv_queue.shift(); 4629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!queued) { 4630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 1) { 4631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport); 4632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!dest) { 4634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we have a destination address but are not connected, error out 4635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN); 4636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) { 4638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // return null if the socket has closed 4639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return null; 4640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier else { 4642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // else, our socket is in a valid state but truly has nothing available 4643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 4644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); 4647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // queued.data will be an ArrayBuffer if it's unadulterated, but if it's 4651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // requeued TCP data it'll be an ArrayBufferView 4652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var queuedLength = queued.data.byteLength || queued.data.length; 4653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var queuedOffset = queued.data.byteOffset || 0; 4654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var queuedBuffer = queued.data.buffer || queued.data; 4655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytesRead = Math.min(length, queuedLength); 4656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var res = { 4657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead), 4658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addr: queued.addr, 4659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier port: queued.port 4660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 4661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // push back any unread data for TCP connections 4664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sock.type === 1 && bytesRead < queuedLength) { 4665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytesRemaining = queuedLength - bytesRead; 4666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining); 4667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier sock.recv_queue.unshift(queued); 4668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return res; 4671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }}};function _send(fd, buf, len, flags) { 4672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var sock = SOCKFS.getSocket(fd); 4673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!sock) { 4674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ___setErrNo(ERRNO_CODES.EBADF); 4675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return -1; 4676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO honor flags 4678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return _write(fd, buf, len); 4679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _pwrite(fildes, buf, nbyte, offset) { 4682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset); 4683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html 4684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.getStream(fildes); 4685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream) { 4686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ___setErrNo(ERRNO_CODES.EBADF); 4687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return -1; 4688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var slab = HEAP8; 4691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.write(stream, slab, buf, nbyte, offset); 4692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.handleFSError(e); 4694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return -1; 4695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }function _write(fildes, buf, nbyte) { 4697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // ssize_t write(int fildes, const void *buf, size_t nbyte); 4698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html 4699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stream = FS.getStream(fildes); 4700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream) { 4701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ___setErrNo(ERRNO_CODES.EBADF); 4702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return -1; 4703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 4707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var slab = HEAP8; 4708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FS.write(stream, slab, buf, nbyte); 4709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 4710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FS.handleFSError(e); 4711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return -1; 4712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _fileno(stream) { 4716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // int fileno(FILE *stream); 4717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html 4718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream = FS.getStreamFromPtr(stream); 4719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!stream) return -1; 4720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stream.fd; 4721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }function _fwrite(ptr, size, nitems, stream) { 4722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream); 4723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html 4724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytesToWrite = nitems * size; 4725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (bytesToWrite == 0) return 0; 4726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var fd = _fileno(stream); 4727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bytesWritten = _write(fd, ptr, bytesToWrite); 4728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (bytesWritten == -1) { 4729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var streamObj = FS.getStreamFromPtr(stream); 4730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (streamObj) streamObj.error = true; 4731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 4732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Math.floor(bytesWritten / size); 4734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["_strlen"] = _strlen; 4740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function __reallyNegative(x) { 4742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return x < 0 || (x === 0 && (1/x) === -Infinity); 4743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }function __formatString(format, varargs) { 4744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var textIndex = format; 4745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var argIndex = 0; 4746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function getNextArg(type) { 4747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // NOTE: Explicitly ignoring type safety. Otherwise this fails: 4748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // int x = 4; printf("%c\n", (char)x); 4749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret; 4750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (type === 'double') { 4751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = HEAPF64[(((varargs)+(argIndex))>>3)]; 4752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (type == 'i64') { 4753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = [HEAP32[(((varargs)+(argIndex))>>2)], 4754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[(((varargs)+(argIndex+4))>>2)]]; 4755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type = 'i32'; // varargs are always i32, i64, or double 4758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = HEAP32[(((varargs)+(argIndex))>>2)]; 4759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argIndex += Runtime.getNativeFieldSize(type); 4761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 4762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = []; 4765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var curr, next, currArg; 4766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while(1) { 4767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var startTextIndex = textIndex; 4768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier curr = HEAP8[(textIndex)]; 4769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (curr === 0) break; 4770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = HEAP8[((textIndex+1)|0)]; 4771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (curr == 37) { 4772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Handle flags. 4773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var flagAlwaysSigned = false; 4774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var flagLeftAlign = false; 4775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var flagAlternative = false; 4776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var flagZeroPad = false; 4777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var flagPadSign = false; 4778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flagsLoop: while (1) { 4779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (next) { 4780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 43: 4781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flagAlwaysSigned = true; 4782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 45: 4784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flagLeftAlign = true; 4785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 35: 4787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flagAlternative = true; 4788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 48: 4790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagZeroPad) { 4791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break flagsLoop; 4792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flagZeroPad = true; 4794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 32: 4797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flagPadSign = true; 4798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: 4800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break flagsLoop; 4801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex++; 4803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = HEAP8[((textIndex+1)|0)]; 4804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Handle width. 4807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var width = 0; 4808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next == 42) { 4809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier width = getNextArg('i32'); 4810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex++; 4811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = HEAP8[((textIndex+1)|0)]; 4812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (next >= 48 && next <= 57) { 4814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier width = width * 10 + (next - 48); 4815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex++; 4816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = HEAP8[((textIndex+1)|0)]; 4817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Handle precision. 4821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var precisionSet = false, precision = -1; 4822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next == 46) { 4823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precision = 0; 4824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precisionSet = true; 4825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex++; 4826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = HEAP8[((textIndex+1)|0)]; 4827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next == 42) { 4828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precision = getNextArg('i32'); 4829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex++; 4830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while(1) { 4832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var precisionChr = HEAP8[((textIndex+1)|0)]; 4833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (precisionChr < 48 || 4834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precisionChr > 57) break; 4835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precision = precision * 10 + (precisionChr - 48); 4836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex++; 4837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = HEAP8[((textIndex+1)|0)]; 4840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (precision < 0) { 4842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precision = 6; // Standard default. 4843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precisionSet = false; 4844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Handle integer sizes. WARNING: These assume a 32-bit architecture! 4847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var argSize; 4848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (String.fromCharCode(next)) { 4849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'h': 4850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var nextNext = HEAP8[((textIndex+2)|0)]; 4851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (nextNext == 104) { 4852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex++; 4853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argSize = 1; // char (actually i32 in varargs) 4854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argSize = 2; // short (actually i32 in varargs) 4856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'l': 4859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var nextNext = HEAP8[((textIndex+2)|0)]; 4860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (nextNext == 108) { 4861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex++; 4862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argSize = 8; // long long 4863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argSize = 4; // long 4865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'L': // long long 4868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'q': // int64_t 4869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'j': // intmax_t 4870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argSize = 8; 4871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'z': // size_t 4873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 't': // ptrdiff_t 4874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'I': // signed ptrdiff_t or unsigned size_t 4875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argSize = 4; 4876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: 4878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argSize = null; 4879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (argSize) textIndex++; 4881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = HEAP8[((textIndex+1)|0)]; 4882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Handle type specifier. 4884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (String.fromCharCode(next)) { 4885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': { 4886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Integer. 4887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var signed = next == 100 || next == 105; 4888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argSize = argSize || 4; 4889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var currArg = getNextArg('i' + (argSize * 8)); 4890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var argText; 4891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Flatten i64-1 [low, high] into a (slightly rounded) double 4892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (argSize == 8) { 4893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117); 4894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Truncate to requested size. 4896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (argSize <= 4) { 4897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var limit = Math.pow(256, argSize) - 1; 4898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8); 4899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Format the number. 4901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var currAbsArg = Math.abs(currArg); 4902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var prefix = ''; 4903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next == 100 || next == 105) { 4904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = reSign(currArg, 8 * argSize, 1).toString(10); 4905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (next == 117) { 4906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = unSign(currArg, 8 * argSize, 1).toString(10); 4907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier currArg = Math.abs(currArg); 4908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (next == 111) { 4909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8); 4910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (next == 120 || next == 88) { 4911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prefix = (flagAlternative && currArg != 0) ? '0x' : ''; 4912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (currArg < 0) { 4913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Represent negative numbers in hex as 2's complement. 4914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier currArg = -currArg; 4915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = (currAbsArg - 1).toString(16); 4916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var buffer = []; 4917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < argText.length; i++) { 4918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier buffer.push((0xF - parseInt(argText[i], 16)).toString(16)); 4919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = buffer.join(''); 4921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (argText.length < argSize * 2) argText = 'f' + argText; 4922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = currAbsArg.toString(16); 4924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next == 88) { 4926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prefix = prefix.toUpperCase(); 4927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = argText.toUpperCase(); 4928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (next == 112) { 4930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (currAbsArg === 0) { 4931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = '(nil)'; 4932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prefix = '0x'; 4934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = currAbsArg.toString(16); 4935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (precisionSet) { 4938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (argText.length < precision) { 4939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = '0' + argText; 4940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Add sign if needed 4944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (currArg >= 0) { 4945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagAlwaysSigned) { 4946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prefix = '+' + prefix; 4947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (flagPadSign) { 4948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prefix = ' ' + prefix; 4949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Move sign to prefix so we zero-pad after the sign 4953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (argText.charAt(0) == '-') { 4954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prefix = '-' + prefix; 4955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = argText.substr(1); 4956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Add padding. 4959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (prefix.length + argText.length < width) { 4960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagLeftAlign) { 4961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText += ' '; 4962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagZeroPad) { 4964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = '0' + argText; 4965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prefix = ' ' + prefix; 4967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Insert the result into the buffer. 4972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = prefix + argText; 4973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText.split('').forEach(function(chr) { 4974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(chr.charCodeAt(0)); 4975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 4976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 4977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 4978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': { 4979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Float. 4980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var currArg = getNextArg('double'); 4981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var argText; 4982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (isNaN(currArg)) { 4983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = 'nan'; 4984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flagZeroPad = false; 4985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (!isFinite(currArg)) { 4986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = (currArg < 0 ? '-' : '') + 'inf'; 4987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flagZeroPad = false; 4988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 4989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var isGeneral = false; 4990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var effectivePrecision = Math.min(precision, 20); 4991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Convert g/G to f/F or e/E, as per: 4993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html 4994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next == 103 || next == 71) { 4995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isGeneral = true; 4996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precision = precision || 1; 4997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10); 4998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (precision > exponent && exponent >= -4) { 4999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = ((next == 103) ? 'f' : 'F').charCodeAt(0); 5000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precision -= exponent + 1; 5001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next = ((next == 103) ? 'e' : 'E').charCodeAt(0); 5003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier precision--; 5004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier effectivePrecision = Math.min(precision, 20); 5006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next == 101 || next == 69) { 5009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = currArg.toExponential(effectivePrecision); 5010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Make sure the exponent has at least 2 digits. 5011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (/[eE][-+]\d$/.test(argText)) { 5012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = argText.slice(0, -1) + '0' + argText.slice(-1); 5013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (next == 102 || next == 70) { 5015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = currArg.toFixed(effectivePrecision); 5016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (currArg === 0 && __reallyNegative(currArg)) { 5017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = '-' + argText; 5018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var parts = argText.split('e'); 5022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (isGeneral && !flagAlternative) { 5023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Discard trailing zeros and periods. 5024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (parts[0].length > 1 && parts[0].indexOf('.') != -1 && 5025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) { 5026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parts[0] = parts[0].slice(0, -1); 5027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Make sure we have a period in alternative mode. 5030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.'; 5031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Zero pad until required precision. 5032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (precision > effectivePrecision++) parts[0] += '0'; 5033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : ''); 5035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Capitalize 'E' if needed. 5037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next == 69) argText = argText.toUpperCase(); 5038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Add sign. 5040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (currArg >= 0) { 5041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagAlwaysSigned) { 5042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = '+' + argText; 5043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (flagPadSign) { 5044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = ' ' + argText; 5045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Add padding. 5050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (argText.length < width) { 5051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagLeftAlign) { 5052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText += ' '; 5053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) { 5055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = argText[0] + '0' + argText.slice(1); 5056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText = (flagZeroPad ? '0' : ' ') + argText; 5058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Adjust case. 5063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (next < 97) argText = argText.toUpperCase(); 5064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Insert the result into the buffer. 5066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argText.split('').forEach(function(chr) { 5067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(chr.charCodeAt(0)); 5068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 5069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 5070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 's': { 5072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // String. 5073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var arg = getNextArg('i8*'); 5074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var argLength = arg ? _strlen(arg) : '(null)'.length; 5075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (precisionSet) argLength = Math.min(argLength, precision); 5076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!flagLeftAlign) { 5077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (argLength < width--) { 5078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(32); 5079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (arg) { 5082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < argLength; i++) { 5083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(HEAPU8[((arg++)|0)]); 5084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true)); 5087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagLeftAlign) { 5089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (argLength < width--) { 5090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(32); 5091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 5094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'c': { 5096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Character. 5097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (flagLeftAlign) ret.push(getNextArg('i8')); 5098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (--width > 0) { 5099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(32); 5100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!flagLeftAlign) ret.push(getNextArg('i8')); 5102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 5103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 'n': { 5105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Write the length written so far to the next parameter. 5106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ptr = getNextArg('i32*'); 5107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((ptr)>>2)]=ret.length; 5108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 5109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case '%': { 5111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Literal percent sign. 5112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(curr); 5113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 5114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: { 5116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Unknown specifiers remain untouched. 5117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = startTextIndex; i < textIndex + 2; i++) { 5118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(HEAP8[(i)]); 5119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex += 2; 5123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO: Support a/A (hex float) and m (last error) specifiers. 5124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO: Support %1${specifier} for arg selection. 5125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret.push(curr); 5127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier textIndex += 1; 5128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 5131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }function _fprintf(stream, format, varargs) { 5132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // int fprintf(FILE *restrict stream, const char *restrict format, ...); 5133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html 5134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var result = __formatString(format, varargs); 5135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stack = Runtime.stackSave(); 5136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream); 5137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.stackRestore(stack); 5138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 5139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }function _printf(format, varargs) { 5140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // int printf(const char *restrict format, ...); 5141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html 5142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stdout = HEAP32[((_stdout)>>2)]; 5143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return _fprintf(stdout, format, varargs); 5144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _emscripten_memcpy_big(dest, src, num) { 5149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAPU8.set(HEAPU8.subarray(src, src+num), dest); 5150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return dest; 5151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["_memcpy"] = _memcpy; 5153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _fputs(s, stream) { 5156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // int fputs(const char *restrict s, FILE *restrict stream); 5157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html 5158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var fd = _fileno(stream); 5159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return _write(fd, s, _strlen(s)); 5160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _fputc(c, stream) { 5163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // int fputc(int c, FILE *stream); 5164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html 5165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var chr = unSign(c & 0xFF); 5166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[((_fputc.ret)|0)]=chr; 5167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var fd = _fileno(stream); 5168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = _write(fd, _fputc.ret, 1); 5169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ret == -1) { 5170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var streamObj = FS.getStreamFromPtr(stream); 5171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (streamObj) streamObj.error = true; 5172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return -1; 5173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return chr; 5175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }function _puts(s) { 5177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // int puts(const char *s); 5178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html 5179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // NOTE: puts() always writes an extra newline. 5180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var stdout = HEAP32[((_stdout)>>2)]; 5181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = _fputs(s, stdout); 5182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ret < 0) { 5183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 5184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var newlineRet = _fputc(10, stdout); 5186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (newlineRet < 0) ? -1 : ret + 1; 5187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _sbrk(bytes) { 5191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Implement a Linux-like 'memory area' for our 'process'. 5192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Changes the size of the memory area by |bytes|; returns the 5193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // address of the previous top ('break') of the memory area 5194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP 5195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var self = _sbrk; 5196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!self.called) { 5197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned 5198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier self.called = true; 5199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(Runtime.dynamicAlloc); 5200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier self.alloc = Runtime.dynamicAlloc; 5201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') }; 5202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = DYNAMICTOP; 5204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (bytes != 0) self.alloc(bytes); 5205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; // Previous break location. 5206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function ___errno_location() { 5209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ___errno_state; 5210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function __ZNSt9exceptionD2Ev() {} 5213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Browser={mainLoop:{scheduler:null,method:"",shouldPause:false,paused:false,queue:[],pause:function () { 5215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mainLoop.shouldPause = true; 5216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },resume:function () { 5217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.mainLoop.paused) { 5218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mainLoop.paused = false; 5219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mainLoop.scheduler(); 5220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mainLoop.shouldPause = false; 5222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },updateStatus:function () { 5223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['setStatus']) { 5224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var message = Module['statusMessage'] || 'Please wait...'; 5225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var remaining = Browser.mainLoop.remainingBlockers; 5226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var expected = Browser.mainLoop.expectedBlockers; 5227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (remaining) { 5228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (remaining < expected) { 5229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')'); 5230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['setStatus'](message); 5232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['setStatus'](''); 5235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () { 5238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers 5239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.initted || ENVIRONMENT_IS_WORKER) return; 5241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.initted = true; 5242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 5244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier new Blob(); 5245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.hasBlobConstructor = true; 5246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 5247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.hasBlobConstructor = false; 5248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier console.log("warning: no blob constructor, cannot create blobs with mimetypes"); 5249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null)); 5251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined; 5252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') { 5253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."); 5254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.noImageDecoding = true; 5255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Support for plugins that can process preloaded files. You can add more of these to 5258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // your app by creating and appending to Module.preloadPlugins. 5259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // 5260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Each plugin is asked if it can handle a file based on the file's name. If it can, 5261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // it is given the file's raw data. When it is done, it calls a callback with the file's 5262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // (possibly modified) data. For example, a plugin might decompress a file, or it 5263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // might create some side data structure for use later (like an Image element, etc.). 5264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var imagePlugin = {}; 5266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier imagePlugin['canHandle'] = function imagePlugin_canHandle(name) { 5267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name); 5268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) { 5270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var b = null; 5271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.hasBlobConstructor) { 5272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 5273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier b = new Blob([byteArray], { type: Browser.getMimetype(name) }); 5274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (b.size !== byteArray.length) { // Safari bug #118630 5275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Safari's Blob can only take an ArrayBuffer 5276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) }); 5277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 5279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder'); 5280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!b) { 5283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var bb = new Browser.BlobBuilder(); 5284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range 5285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier b = bb.getBlob(); 5286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var url = Browser.URLObject.createObjectURL(b); 5288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var img = new Image(); 5289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier img.onload = function img_onload() { 5290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(img.complete, 'Image ' + name + ' could not be decoded'); 5291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var canvas = document.createElement('canvas'); 5292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.width = img.width; 5293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.height = img.height; 5294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ctx = canvas.getContext('2d'); 5295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ctx.drawImage(img, 0, 0); 5296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["preloadedImages"][name] = canvas; 5297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.URLObject.revokeObjectURL(url); 5298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (onload) onload(byteArray); 5299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier img.onerror = function img_onerror(event) { 5301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier console.log('Image ' + url + ' could not be decoded'); 5302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (onerror) onerror(); 5303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier img.src = url; 5305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['preloadPlugins'].push(imagePlugin); 5307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var audioPlugin = {}; 5309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier audioPlugin['canHandle'] = function audioPlugin_canHandle(name) { 5310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 }; 5311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) { 5313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var done = false; 5314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function finish(audio) { 5315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (done) return; 5316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier done = true; 5317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["preloadedAudios"][name] = audio; 5318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (onload) onload(byteArray); 5319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function fail() { 5321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (done) return; 5322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier done = true; 5323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["preloadedAudios"][name] = new Audio(); // empty shim 5324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (onerror) onerror(); 5325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.hasBlobConstructor) { 5327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 5328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); 5329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 5330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return fail(); 5331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this! 5333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var audio = new Audio(); 5334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926 5335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier audio.onerror = function audio_onerror(event) { 5336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (done) return; 5337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach'); 5338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function encode64(data) { 5339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 5340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var PAD = '='; 5341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = ''; 5342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var leftchar = 0; 5343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var leftbits = 0; 5344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < data.length; i++) { 5345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier leftchar = (leftchar << 8) | data[i]; 5346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier leftbits += 8; 5347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (leftbits >= 6) { 5348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var curr = (leftchar >> (leftbits-6)) & 0x3f; 5349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier leftbits -= 6; 5350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret += BASE[curr]; 5351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (leftbits == 2) { 5354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret += BASE[(leftchar&3) << 4]; 5355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret += PAD + PAD; 5356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (leftbits == 4) { 5357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret += BASE[(leftchar&0xf) << 2]; 5358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ret += PAD; 5359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 5361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray); 5363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier finish(audio); // we don't wait for confirmation this worked - but it's worth trying 5364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier audio.src = url; 5366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror 5367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.safeSetTimeout(function() { 5368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier finish(audio); // try to use it even though it is not necessarily ready to play 5369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 10000); 5370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return fail(); 5372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['preloadPlugins'].push(audioPlugin); 5375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Canvas event setup 5377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var canvas = Module['canvas']; 5379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module 5381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Module['forcedAspectRatio'] = 4 / 3; 5382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.requestPointerLock = canvas['requestPointerLock'] || 5384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas['mozRequestPointerLock'] || 5385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas['webkitRequestPointerLock'] || 5386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas['msRequestPointerLock'] || 5387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function(){}; 5388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.exitPointerLock = document['exitPointerLock'] || 5389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['mozExitPointerLock'] || 5390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['webkitExitPointerLock'] || 5391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['msExitPointerLock'] || 5392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function(){}; // no-op if function does not exist 5393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.exitPointerLock = canvas.exitPointerLock.bind(document); 5394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function pointerLockChange() { 5396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.pointerLock = document['pointerLockElement'] === canvas || 5397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['mozPointerLockElement'] === canvas || 5398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['webkitPointerLockElement'] === canvas || 5399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['msPointerLockElement'] === canvas; 5400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document.addEventListener('pointerlockchange', pointerLockChange, false); 5403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document.addEventListener('mozpointerlockchange', pointerLockChange, false); 5404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document.addEventListener('webkitpointerlockchange', pointerLockChange, false); 5405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document.addEventListener('mspointerlockchange', pointerLockChange, false); 5406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['elementPointerLock']) { 5408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.addEventListener("click", function(ev) { 5409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Browser.pointerLock && canvas.requestPointerLock) { 5410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.requestPointerLock(); 5411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ev.preventDefault(); 5412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, false); 5414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) { 5416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ctx; 5417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var errorInfo = '?'; 5418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function onContextCreationError(event) { 5419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier errorInfo = event.statusMessage || errorInfo; 5420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 5422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (useWebGL) { 5423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var contextAttributes = { 5424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier antialias: false, 5425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alpha: false 5426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (webGLContextAttributes) { 5429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var attribute in webGLContextAttributes) { 5430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier contextAttributes[attribute] = webGLContextAttributes[attribute]; 5431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false); 5436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 5437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ['experimental-webgl', 'webgl'].some(function(webglId) { 5438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ctx = canvas.getContext(webglId, contextAttributes); 5439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 5440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } finally { 5441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false); 5442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ctx = canvas.getContext('2d'); 5445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ctx) throw ':('; 5447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch (e) { 5448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.print('Could not create canvas: ' + [errorInfo, e]); 5449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return null; 5450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (useWebGL) { 5452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Set the background of the WebGL canvas to black 5453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.style.backgroundColor = "black"; 5454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Warn on context loss 5456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.addEventListener('webglcontextlost', function(event) { 5457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier alert('WebGL context lost. You will need to reload the page.'); 5458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, false); 5459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (setInModule) { 5461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GLctx = Module.ctx = ctx; 5462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.useWebGL = useWebGL; 5463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() }); 5464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.init(); 5465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ctx; 5467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) { 5468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.lockPointer = lockPointer; 5469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.resizeCanvas = resizeCanvas; 5470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true; 5471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false; 5472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var canvas = Module['canvas']; 5474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function fullScreenChange() { 5475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.isFullScreen = false; 5476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var canvasContainer = canvas.parentNode; 5477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] || 5478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['mozFullScreenElement'] || document['mozFullscreenElement'] || 5479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['fullScreenElement'] || document['fullscreenElement'] || 5480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['msFullScreenElement'] || document['msFullscreenElement'] || 5481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['webkitCurrentFullScreenElement']) === canvasContainer) { 5482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.cancelFullScreen = document['cancelFullScreen'] || 5483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['mozCancelFullScreen'] || 5484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['webkitCancelFullScreen'] || 5485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['msExitFullscreen'] || 5486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['exitFullscreen'] || 5487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function() {}; 5488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document); 5489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.lockPointer) canvas.requestPointerLock(); 5490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.isFullScreen = true; 5491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize(); 5492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen 5495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvasContainer.parentNode.insertBefore(canvas, canvasContainer); 5496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvasContainer.parentNode.removeChild(canvasContainer); 5497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.resizeCanvas) Browser.setWindowedCanvasSize(); 5499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen); 5501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.updateCanvasDimensions(canvas); 5502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Browser.fullScreenHandlersInstalled) { 5505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.fullScreenHandlersInstalled = true; 5506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document.addEventListener('fullscreenchange', fullScreenChange, false); 5507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document.addEventListener('mozfullscreenchange', fullScreenChange, false); 5508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document.addEventListener('webkitfullscreenchange', fullScreenChange, false); 5509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document.addEventListener('MSFullscreenChange', fullScreenChange, false); 5510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // 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 5513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var canvasContainer = document.createElement("div"); 5514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.parentNode.insertBefore(canvasContainer, canvas); 5515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvasContainer.appendChild(canvas); 5516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size) 5518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] || 5519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvasContainer['mozRequestFullScreen'] || 5520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvasContainer['msRequestFullscreen'] || 5521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null); 5522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvasContainer.requestFullScreen(); 5523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },requestAnimationFrame:function requestAnimationFrame(func) { 5524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js) 5525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setTimeout(func, 1000/60); 5526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!window.requestAnimationFrame) { 5528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window.requestAnimationFrame = window['requestAnimationFrame'] || 5529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window['mozRequestAnimationFrame'] || 5530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window['webkitRequestAnimationFrame'] || 5531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window['msRequestAnimationFrame'] || 5532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window['oRequestAnimationFrame'] || 5533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window['setTimeout']; 5534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window.requestAnimationFrame(func); 5536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },safeCallback:function (func) { 5538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return function() { 5539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ABORT) return func.apply(null, arguments); 5540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },safeRequestAnimationFrame:function (func) { 5542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Browser.requestAnimationFrame(function() { 5543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ABORT) func(); 5544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 5545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },safeSetTimeout:function (func, timeout) { 5546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return setTimeout(function() { 5547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ABORT) func(); 5548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, timeout); 5549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },safeSetInterval:function (func, timeout) { 5550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return setInterval(function() { 5551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ABORT) func(); 5552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, timeout); 5553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getMimetype:function (name) { 5554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return { 5555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'jpg': 'image/jpeg', 5556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'jpeg': 'image/jpeg', 5557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'png': 'image/png', 5558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'bmp': 'image/bmp', 5559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'ogg': 'audio/ogg', 5560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'wav': 'audio/wav', 5561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'mp3': 'audio/mpeg' 5562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }[name.substr(name.lastIndexOf('.')+1)]; 5563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getUserMedia:function (func) { 5564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if(!window.getUserMedia) { 5565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window.getUserMedia = navigator['getUserMedia'] || 5566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier navigator['mozGetUserMedia']; 5567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier window.getUserMedia(func); 5569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getMovementX:function (event) { 5570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return event['movementX'] || 5571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier event['mozMovementX'] || 5572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier event['webkitMovementX'] || 5573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 0; 5574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getMovementY:function (event) { 5575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return event['movementY'] || 5576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier event['mozMovementY'] || 5577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier event['webkitMovementY'] || 5578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 0; 5579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },getMouseWheelDelta:function (event) { 5580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta)); 5581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup 5582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.pointerLock) { 5583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // When the pointer is locked, calculate the coordinates 5584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // based on the movement of the mouse. 5585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Workaround for Firefox bug 764498 5586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (event.type != 'mousemove' && 5587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ('mozMovementX' in event)) { 5588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseMovementX = Browser.mouseMovementY = 0; 5589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseMovementX = Browser.getMovementX(event); 5591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseMovementY = Browser.getMovementY(event); 5592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // check if SDL is available 5595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof SDL != "undefined") { 5596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseX = SDL.mouseX + Browser.mouseMovementX; 5597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseY = SDL.mouseY + Browser.mouseMovementY; 5598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // just add the mouse delta to the current absolut mouse position 5600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // FIXME: ideally this should be clamped against the canvas size and zero 5601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseX += Browser.mouseMovementX; 5602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseY += Browser.mouseMovementY; 5603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Otherwise, calculate the movement based on the changes 5606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // in the coordinates. 5607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var rect = Module["canvas"].getBoundingClientRect(); 5608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var x, y; 5609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Neither .scrollX or .pageXOffset are defined in a spec, but 5611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // we prefer .scrollX because it is currently in a spec draft. 5612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/) 5613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset); 5614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset); 5615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (event.type == 'touchstart' || 5616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier event.type == 'touchend' || 5617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier event.type == 'touchmove') { 5618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var t = event.touches.item(0); 5619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (t) { 5620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier x = t.pageX - (scrollX + rect.left); 5621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier y = t.pageY - (scrollY + rect.top); 5622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 5624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier x = event.pageX - (scrollX + rect.left); 5627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier y = event.pageY - (scrollY + rect.top); 5628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // the canvas might be CSS-scaled compared to its backbuffer; 5631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // SDL-using content will want mouse coordinates in terms 5632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // of backbuffer units. 5633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var cw = Module["canvas"].width; 5634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ch = Module["canvas"].height; 5635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier x = x * (cw / rect.width); 5636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier y = y * (ch / rect.height); 5637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseMovementX = x - Browser.mouseX; 5639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseMovementY = y - Browser.mouseY; 5640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseX = x; 5641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.mouseY = y; 5642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },xhrLoad:function (url, onload, onerror) { 5644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var xhr = new XMLHttpRequest(); 5645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.open('GET', url, true); 5646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.responseType = 'arraybuffer'; 5647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.onload = function xhr_onload() { 5648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 5649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onload(xhr.response); 5650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onerror(); 5652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 5654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.onerror = onerror; 5655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier xhr.send(null); 5656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },asyncLoad:function (url, onload, onerror, noRunDep) { 5657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.xhrLoad(url, function(arrayBuffer) { 5658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); 5659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onload(new Uint8Array(arrayBuffer)); 5660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!noRunDep) removeRunDependency('al ' + url); 5661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, function(event) { 5662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (onerror) { 5663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier onerror(); 5664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw 'Loading data file "' + url + '" failed.'; 5666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 5668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!noRunDep) addRunDependency('al ' + url); 5669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },resizeListeners:[],updateResizeListeners:function () { 5670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var canvas = Module['canvas']; 5671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.resizeListeners.forEach(function(listener) { 5672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier listener(canvas.width, canvas.height); 5673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 5674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },setCanvasSize:function (width, height, noUpdates) { 5675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var canvas = Module['canvas']; 5676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.updateCanvasDimensions(canvas, width, height); 5677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!noUpdates) Browser.updateResizeListeners(); 5678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () { 5679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // check if SDL is available 5680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof SDL != "undefined") { 5681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]; 5682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags = flags | 0x00800000; // set SDL_FULLSCREEN flag 5683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags 5684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.updateResizeListeners(); 5686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },setWindowedCanvasSize:function () { 5687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // check if SDL is available 5688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof SDL != "undefined") { 5689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]; 5690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag 5691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags 5692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.updateResizeListeners(); 5694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier },updateCanvasDimensions:function (canvas, wNative, hNative) { 5695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (wNative && hNative) { 5696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.widthNative = wNative; 5697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.heightNative = hNative; 5698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier wNative = canvas.widthNative; 5700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier hNative = canvas.heightNative; 5701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var w = wNative; 5703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var h = hNative; 5704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) { 5705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (w/h < Module['forcedAspectRatio']) { 5706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier w = Math.round(h * Module['forcedAspectRatio']); 5707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier h = Math.round(w / Module['forcedAspectRatio']); 5709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] || 5712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['mozFullScreenElement'] || document['mozFullscreenElement'] || 5713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['fullScreenElement'] || document['fullscreenElement'] || 5714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['msFullScreenElement'] || document['msFullscreenElement'] || 5715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) { 5716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var factor = Math.min(screen.width / w, screen.height / h); 5717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier w = Math.round(w * factor); 5718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier h = Math.round(h * factor); 5719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Browser.resizeCanvas) { 5721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (canvas.width != w) canvas.width = w; 5722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (canvas.height != h) canvas.height = h; 5723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof canvas.style != 'undefined') { 5724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.style.removeProperty( "width"); 5725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.style.removeProperty("height"); 5726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (canvas.width != wNative) canvas.width = wNative; 5729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (canvas.height != hNative) canvas.height = hNative; 5730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof canvas.style != 'undefined') { 5731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (w != wNative || h != hNative) { 5732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.style.setProperty( "width", w + "px", "important"); 5733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.style.setProperty("height", h + "px", "important"); 5734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.style.removeProperty( "width"); 5736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier canvas.style.removeProperty("height"); 5737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }}; 5741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _time(ptr) { 5743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = Math.floor(Date.now()/1000); 5744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ptr) { 5745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[((ptr)>>2)]=ret; 5746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ret; 5748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function _malloc(bytes) { 5752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier /* Over-allocate to make sure it is byte-aligned by 8. 5753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * This will leak memory, but this is only the dummy 5754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * implementation (replaced by dlmalloc normally) so 5755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier * not an issue. 5756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier */ 5757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ptr = Runtime.dynamicAlloc(bytes + 8); 5758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return (ptr+8) & 0xFFFFFFF8; 5759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["_malloc"] = _malloc;function ___cxa_allocate_exception(size) { 5761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ptr = _malloc(size + ___cxa_exception_header_size); 5762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return ptr + ___cxa_exception_header_size; 5763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var __ZTISt9exception=allocate([allocate([1,0,0,0,0,0,0], "i8", ALLOC_STATIC)+8, 0], "i32", ALLOC_STATIC); 5766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function __ZTVN10__cxxabiv120__si_class_type_infoE() { 5768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['printErr']('missing function: _ZTVN10__cxxabiv120__si_class_type_infoE'); abort(-1); 5769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0; 5771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierFS.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; 5772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor(); 5773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (ENVIRONMENT_IS_NODE) { var fs = require("fs"); NODEFS.staticInit(); } 5774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } }); 5775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier_fputc.ret = allocate([0], "i8", ALLOC_STATIC); 5776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) }; 5777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) }; 5778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) }; 5779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() }; 5780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() }; 5781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() } 5782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP); 5783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierstaticSealed = true; // seal the static portion of memory 5785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierSTACK_MAX = STACK_BASE + 5242880; 5787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX); 5789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierassert(DYNAMIC_BASE < TOTAL_MEMORY, "TOTAL_MEMORY not big enough for stack"); 5791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar Math_min = Math.min; 5794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction invoke_ii(index,a1) { 5795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 5796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Module["dynCall_ii"](index,a1); 5797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 5798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof e !== 'number' && e !== 'longjmp') throw e; 5799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier asm["setThrew"](1, 0); 5800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction invoke_vi(index,a1) { 5804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 5805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["dynCall_vi"](index,a1); 5806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 5807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof e !== 'number' && e !== 'longjmp') throw e; 5808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier asm["setThrew"](1, 0); 5809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction invoke_v(index) { 5813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 5814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module["dynCall_v"](index); 5815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } catch(e) { 5816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof e !== 'number' && e !== 'longjmp') throw e; 5817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier asm["setThrew"](1, 0); 5818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction asmPrintInt(x, y) { 5822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack); 5823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction asmPrintFloat(x, y) { 5825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack); 5826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 5827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// EMSCRIPTEN_START_ASM 5828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar asm = (function(global, env, buffer) { 5829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 'use asm'; 5830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var HEAP8 = new global.Int8Array(buffer); 5831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var HEAP16 = new global.Int16Array(buffer); 5832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var HEAP32 = new global.Int32Array(buffer); 5833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var HEAPU8 = new global.Uint8Array(buffer); 5834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var HEAPU16 = new global.Uint16Array(buffer); 5835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var HEAPU32 = new global.Uint32Array(buffer); 5836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var HEAPF32 = new global.Float32Array(buffer); 5837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var HEAPF64 = new global.Float64Array(buffer); 5838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var STACKTOP=env.STACKTOP|0; 5840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var STACK_MAX=env.STACK_MAX|0; 5841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempDoublePtr=env.tempDoublePtr|0; 5842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ABORT=env.ABORT|0; 5843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var __ZTISt9exception=env.__ZTISt9exception|0; 5844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var __ZTVN10__cxxabiv120__si_class_type_infoE=env.__ZTVN10__cxxabiv120__si_class_type_infoE|0; 5845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var __THREW__ = 0; 5847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var threwValue = 0; 5848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var setjmpId = 0; 5849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var undef = 0; 5850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var nan = +env.NaN, inf = +env.Infinity; 5851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempInt = 0, tempBigInt = 0, tempBigIntP = 0, tempBigIntS = 0, tempBigIntR = 0.0, tempBigIntI = 0, tempBigIntD = 0, tempValue = 0, tempDouble = 0.0; 5852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet0 = 0; 5854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet1 = 0; 5855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet2 = 0; 5856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet3 = 0; 5857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet4 = 0; 5858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet5 = 0; 5859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet6 = 0; 5860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet7 = 0; 5861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet8 = 0; 5862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempRet9 = 0; 5863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_floor=global.Math.floor; 5864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_abs=global.Math.abs; 5865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_sqrt=global.Math.sqrt; 5866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_pow=global.Math.pow; 5867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_cos=global.Math.cos; 5868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_sin=global.Math.sin; 5869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_tan=global.Math.tan; 5870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_acos=global.Math.acos; 5871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_asin=global.Math.asin; 5872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_atan=global.Math.atan; 5873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_atan2=global.Math.atan2; 5874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_exp=global.Math.exp; 5875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_log=global.Math.log; 5876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_ceil=global.Math.ceil; 5877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_imul=global.Math.imul; 5878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var abort=env.abort; 5879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var assert=env.assert; 5880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var asmPrintInt=env.asmPrintInt; 5881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var asmPrintFloat=env.asmPrintFloat; 5882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var Math_min=env.min; 5883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var invoke_ii=env.invoke_ii; 5884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var invoke_vi=env.invoke_vi; 5885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var invoke_v=env.invoke_v; 5886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _send=env._send; 5887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___setErrNo=env.___setErrNo; 5888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___cxa_is_number_type=env.___cxa_is_number_type; 5889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___cxa_allocate_exception=env.___cxa_allocate_exception; 5890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___cxa_find_matching_catch=env.___cxa_find_matching_catch; 5891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _fflush=env._fflush; 5892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _time=env._time; 5893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _pwrite=env._pwrite; 5894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var __reallyNegative=env.__reallyNegative; 5895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _sbrk=env._sbrk; 5896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _emscripten_memcpy_big=env._emscripten_memcpy_big; 5897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _fileno=env._fileno; 5898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___resumeException=env.___resumeException; 5899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var __ZSt18uncaught_exceptionv=env.__ZSt18uncaught_exceptionv; 5900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _sysconf=env._sysconf; 5901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _puts=env._puts; 5902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _mkport=env._mkport; 5903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _write=env._write; 5904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___errno_location=env.___errno_location; 5905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var __ZNSt9exceptionD2Ev=env.__ZNSt9exceptionD2Ev; 5906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _fputc=env._fputc; 5907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___cxa_throw=env.___cxa_throw; 5908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _abort=env._abort; 5909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _fwrite=env._fwrite; 5910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ___cxa_does_inherit=env.___cxa_does_inherit; 5911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _fprintf=env._fprintf; 5912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var __formatString=env.__formatString; 5913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _fputs=env._fputs; 5914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var _printf=env._printf; 5915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var tempFloat = 0.0; 5916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// EMSCRIPTEN_START_FUNCS 5918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction _malloc(i12) { 5919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i12 | 0; 5920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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; 5921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = STACKTOP; 5922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 5923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i12 >>> 0 < 245) { 5924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i12 >>> 0 < 11) { 5925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = 16; 5926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i12 + 11 & -8; 5928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = i12 >>> 3; 5930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[146] | 0; 5931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = i18 >>> i20; 5932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i21 & 3 | 0) != 0) { 5933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = (i21 & 1 ^ 1) + i20 | 0; 5934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i6 << 1; 5935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 624 + (i5 << 2) | 0; 5936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 624 + (i5 + 2 << 2) | 0; 5937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[i5 >> 2] | 0; 5938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i7 + 8 | 0; 5939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[i2 >> 2] | 0; 5940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 5941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) != (i4 | 0)) { 5942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i4 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 5943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 5944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i4 + 12 | 0; 5946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i8 >> 2] | 0) == (i7 | 0)) { 5947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i8 >> 2] = i3; 5948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 >> 2] = i4; 5949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 5950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 5952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = i18 & ~(1 << i6); 5955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 5957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i6 << 3; 5958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i7 + 4 >> 2] = i32 | 3; 5959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i7 + (i32 | 4) | 0; 5960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1; 5961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i2; 5962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 5963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 5964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i12 >>> 0 > (HEAP32[592 >> 2] | 0) >>> 0) { 5966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i21 | 0) != 0) { 5967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = 2 << i20; 5968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i21 << i20 & (i7 | 0 - i7); 5969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = (i7 & 0 - i7) + -1 | 0; 5970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i7 >>> 12 & 16; 5971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 >>> i2; 5972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i7 >>> 5 & 8; 5973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 >>> i6; 5974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i7 >>> 2 & 4; 5975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 >>> i5; 5976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i7 >>> 1 & 2; 5977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 >>> i4; 5978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i7 >>> 1 & 1; 5979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = (i6 | i2 | i5 | i4 | i3) + (i7 >>> i3) | 0; 5980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i3 << 1; 5981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 624 + (i7 << 2) | 0; 5982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = 624 + (i7 + 2 << 2) | 0; 5983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i7 >> 2] | 0; 5984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i5 + 8 | 0; 5985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[i2 >> 2] | 0; 5986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 5987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i4 | 0) != (i6 | 0)) { 5988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 5989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 5990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i6 + 12 | 0; 5992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i8 >> 2] | 0) == (i5 | 0)) { 5993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i8 >> 2] = i4; 5994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i7 >> 2] = i6; 5995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 5996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 5997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 5998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 5999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = i18 & ~(1 << i3); 6001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i3 << 3; 6004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i6 - i12 | 0; 6005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 4 >> 2] = i12 | 3; 6006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i5 + i12 | 0; 6007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + (i12 | 4) >> 2] = i4 | 1; 6008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + i6 >> 2] = i4; 6009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[592 >> 2] | 0; 6010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) != 0) { 6011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[604 >> 2] | 0; 6012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i6 >>> 3; 6013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i8 << 1; 6014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 624 + (i9 << 2) | 0; 6015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[146] | 0; 6016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = 1 << i8; 6017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 & i8 | 0) != 0) { 6018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = 624 + (i9 + 2 << 2) | 0; 6019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = HEAP32[i7 >> 2] | 0; 6020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i8 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i28 = i7; 6024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = i8; 6025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = i7 | i8; 6028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i28 = 624 + (i9 + 2 << 2) | 0; 6029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = i6; 6030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i28 >> 2] = i5; 6032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i27 + 12 >> 2] = i5; 6033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 8 >> 2] = i27; 6034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 12 >> 2] = i6; 6035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = i4; 6037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[604 >> 2] = i3; 6038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i2; 6039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 6040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 6041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[588 >> 2] | 0; 6043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i18 | 0) != 0) { 6044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = (i18 & 0 - i18) + -1 | 0; 6045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = i2 >>> 12 & 16; 6046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 >>> i31; 6047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i30 = i2 >>> 5 & 8; 6048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 >>> i30; 6049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i2 >>> 2 & 4; 6050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 >>> i32; 6051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i2 >>> 1 & 2; 6052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 >>> i6; 6053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i2 >>> 1 & 1; 6054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[888 + ((i30 | i31 | i32 | i6 | i3) + (i2 >>> i3) << 2) >> 2] | 0; 6055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = (HEAP32[i3 + 4 >> 2] & -8) - i12 | 0; 6056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i3; 6057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i6 + 16 >> 2] | 0; 6059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 6060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i6 + 20 >> 2] | 0; 6061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 6062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = (HEAP32[i5 + 4 >> 2] & -8) - i12 | 0; 6066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i6 >>> 0 < i2 >>> 0; 6067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i4 ? i6 : i2; 6068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i5; 6069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i4 ? i5 : i3; 6070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[600 >> 2] | 0; 6072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < i6 >>> 0) { 6073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i3 + i12 | 0; 6076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i3 >>> 0 < i4 >>> 0)) { 6077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i3 + 24 >> 2] | 0; 6080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[i3 + 12 >> 2] | 0; 6081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) == (i3 | 0)) { 6083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i3 + 20 | 0; 6084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[i8 >> 2] | 0; 6085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) == 0) { 6086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i3 + 16 | 0; 6087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[i8 >> 2] | 0; 6088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) == 0) { 6089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = 0; 6090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i10 = i7 + 20 | 0; 6095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[i10 >> 2] | 0; 6096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) != 0) { 6097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i9; 6098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i10; 6099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 6100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i10 = i7 + 16 | 0; 6102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[i10 >> 2] | 0; 6103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) == 0) { 6104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i9; 6107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i10; 6108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i8 >>> 0 < i6 >>> 0) { 6111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i8 >> 2] = 0; 6114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = i7; 6115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = HEAP32[i3 + 8 >> 2] | 0; 6119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i8 >>> 0 < i6 >>> 0) { 6120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i8 + 12 | 0; 6123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i6 >> 2] | 0) != (i3 | 0)) { 6124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i7 + 8 | 0; 6127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i9 >> 2] | 0) == (i3 | 0)) { 6128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = i7; 6129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 >> 2] = i8; 6130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = i7; 6131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) != 0) { 6139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[i3 + 28 >> 2] | 0; 6140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 888 + (i7 << 2) | 0; 6141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) == (HEAP32[i6 >> 2] | 0)) { 6142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = i26; 6143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i26 | 0) == 0) { 6144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i7); 6145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i5 + 16 | 0; 6152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i6 >> 2] | 0) == (i3 | 0)) { 6153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = i26; 6154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 20 >> 2] = i26; 6156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i26 | 0) == 0) { 6158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i26 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i26 + 24 >> 2] = i5; 6165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i3 + 16 >> 2] | 0; 6166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) != 0) { 6168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i26 + 16 >> 2] = i5; 6172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 24 >> 2] = i26; 6173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i3 + 20 >> 2] | 0; 6178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) != 0) { 6179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i26 + 20 >> 2] = i5; 6183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 24 >> 2] = i26; 6184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i2 >>> 0 < 16) { 6190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i2 + i12 | 0; 6191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 4 >> 2] = i32 | 3; 6192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i3 + (i32 + 4) | 0; 6193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1; 6194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 4 >> 2] = i12 | 3; 6196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + (i12 | 4) >> 2] = i2 | 1; 6197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + (i2 + i12) >> 2] = i2; 6198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[592 >> 2] | 0; 6199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) != 0) { 6200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[604 >> 2] | 0; 6201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i6 >>> 3; 6202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i8 << 1; 6203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 624 + (i9 << 2) | 0; 6204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[146] | 0; 6205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = 1 << i8; 6206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 & i8 | 0) != 0) { 6207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = 624 + (i9 + 2 << 2) | 0; 6208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = HEAP32[i7 >> 2] | 0; 6209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i8 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i7; 6213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i8; 6214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = i7 | i8; 6217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = 624 + (i9 + 2 << 2) | 0; 6218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i6; 6219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i25 >> 2] = i5; 6221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + 12 >> 2] = i5; 6222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 8 >> 2] = i24; 6223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 12 >> 2] = i6; 6224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = i2; 6226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[604 >> 2] = i4; 6227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i3 + 8 | 0; 6229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 6230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 6231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i12 >>> 0 > 4294967231)) { 6235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i12 + 11 | 0; 6236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i24 & -8; 6237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = HEAP32[588 >> 2] | 0; 6238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i26 | 0) != 0) { 6239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = 0 - i12 | 0; 6240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i24 >>> 8; 6241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i24 | 0) != 0) { 6242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i12 >>> 0 > 16777215) { 6243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = 31; 6244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = (i24 + 1048320 | 0) >>> 16 & 8; 6246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i24 << i31; 6247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i30 = (i32 + 520192 | 0) >>> 16 & 4; 6248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 << i30; 6249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = (i32 + 245760 | 0) >>> 16 & 2; 6250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = 14 - (i30 | i31 | i27) + (i32 << i27 >>> 15) | 0; 6251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = i12 >>> (i27 + 7 | 0) & 1 | i27 << 1; 6252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = 0; 6255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i30 = HEAP32[888 + (i27 << 2) >> 2] | 0; 6257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L126 : do { 6258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i30 | 0) == 0) { 6259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i29 = 0; 6260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = 0; 6261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i27 | 0) == 31) { 6263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = 0; 6264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = 25 - (i27 >>> 1) | 0; 6266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i29 = 0; 6268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i28 = i12 << i24; 6269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = 0; 6270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = HEAP32[i30 + 4 >> 2] & -8; 6272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = i32 - i12 | 0; 6273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i31 >>> 0 < i25 >>> 0) { 6274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i32 | 0) == (i12 | 0)) { 6275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i31; 6276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i29 = i30; 6277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i30; 6278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L126; 6279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i31; 6281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i30; 6282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = HEAP32[i30 + 20 >> 2] | 0; 6285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i30 = HEAP32[i30 + (i28 >>> 31 << 2) + 16 >> 2] | 0; 6286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i29 = (i31 | 0) == 0 | (i31 | 0) == (i30 | 0) ? i29 : i31; 6287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i30 | 0) == 0) { 6288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i28 = i28 << 1; 6291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i29 | 0) == 0 & (i24 | 0) == 0) { 6296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = 2 << i27; 6297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = i26 & (i32 | 0 - i32); 6298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i26 | 0) == 0) { 6299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = (i26 & 0 - i26) + -1 | 0; 6302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i28 = i32 >>> 12 & 16; 6303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 >>> i28; 6304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = i32 >>> 5 & 8; 6305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 >>> i27; 6306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i30 = i32 >>> 2 & 4; 6307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 >>> i30; 6308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = i32 >>> 1 & 2; 6309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 >>> i31; 6310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i29 = i32 >>> 1 & 1; 6311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i29 = HEAP32[888 + ((i27 | i28 | i30 | i31 | i29) + (i32 >>> i29) << 2) >> 2] | 0; 6312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i29 | 0) != 0) { 6314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = (HEAP32[i29 + 4 >> 2] & -8) - i12 | 0; 6316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = i27 >>> 0 < i25 >>> 0; 6317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i26 ? i27 : i25; 6318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i26 ? i29 : i24; 6319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = HEAP32[i29 + 16 >> 2] | 0; 6320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i26 | 0) != 0) { 6321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i29 = i26; 6322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 6323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i29 = HEAP32[i29 + 20 >> 2] | 0; 6325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i29 | 0) == 0) { 6326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i24 | 0) != 0 ? i25 >>> 0 < ((HEAP32[592 >> 2] | 0) - i12 | 0) >>> 0 : 0) { 6331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[600 >> 2] | 0; 6332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i24 >>> 0 < i4 >>> 0) { 6333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i24 + i12 | 0; 6336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i24 >>> 0 < i2 >>> 0)) { 6337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i24 + 24 >> 2] | 0; 6340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[i24 + 12 >> 2] | 0; 6341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == (i24 | 0)) { 6343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i24 + 20 | 0; 6344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i6 >> 2] | 0; 6345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 6346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i24 + 16 | 0; 6347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i6 >> 2] | 0; 6348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 6349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i22 = 0; 6350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i5 + 20 | 0; 6355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[i8 >> 2] | 0; 6356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) != 0) { 6357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i7; 6358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i8; 6359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 6360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i5 + 16 | 0; 6362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = HEAP32[i7 >> 2] | 0; 6363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i8 | 0) == 0) { 6364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i8; 6367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i7; 6368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i6 >>> 0 < i4 >>> 0) { 6371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = 0; 6374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i22 = i5; 6375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i24 + 8 >> 2] | 0; 6379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 < i4 >>> 0) { 6380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i5 + 12 | 0; 6383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i7 >> 2] | 0) != (i24 | 0)) { 6384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i6 + 8 | 0; 6387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) { 6388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i7 >> 2] = i6; 6389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = i5; 6390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i22 = i6; 6391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) != 0) { 6399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[i24 + 28 >> 2] | 0; 6400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 888 + (i4 << 2) | 0; 6401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i24 | 0) == (HEAP32[i5 >> 2] | 0)) { 6402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 >> 2] = i22; 6403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i22 | 0) == 0) { 6404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i4); 6405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i3 + 16 | 0; 6412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i4 >> 2] | 0) == (i24 | 0)) { 6413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = i22; 6414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 20 >> 2] = i22; 6416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i22 | 0) == 0) { 6418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i22 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i22 + 24 >> 2] = i3; 6425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i24 + 16 >> 2] | 0; 6426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) != 0) { 6428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i22 + 16 >> 2] = i3; 6432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 24 >> 2] = i22; 6433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i24 + 20 >> 2] | 0; 6438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) != 0) { 6439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i22 + 20 >> 2] = i3; 6443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 24 >> 2] = i22; 6444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L204 : do { 6450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i25 >>> 0 < 16)) { 6451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + 4 >> 2] = i12 | 3; 6452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 | 4) >> 2] = i25 | 1; 6453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i25 + i12) >> 2] = i25; 6454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i25 >>> 3; 6455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i25 >>> 0 < 256) { 6456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i4 << 1; 6457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 624 + (i6 << 2) | 0; 6458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[146] | 0; 6459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 1 << i4; 6460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 & i4 | 0) != 0) { 6461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 624 + (i6 + 2 << 2) | 0; 6462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[i5 >> 2] | 0; 6463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i4 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = i5; 6467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = i4; 6468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = i5 | i4; 6471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = 624 + (i6 + 2 << 2) | 0; 6472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = i3; 6473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i21 >> 2] = i2; 6475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i20 + 12 >> 2] = i2; 6476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 8) >> 2] = i20; 6477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 12) >> 2] = i3; 6478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i25 >>> 8; 6481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) != 0) { 6482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i25 >>> 0 > 16777215) { 6483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 31; 6484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = (i3 + 1048320 | 0) >>> 16 & 8; 6486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i3 << i31; 6487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i30 = (i32 + 520192 | 0) >>> 16 & 4; 6488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 << i30; 6489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = (i32 + 245760 | 0) >>> 16 & 2; 6490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0; 6491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i25 >>> (i3 + 7 | 0) & 1 | i3 << 1; 6492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0; 6495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 888 + (i3 << 2) | 0; 6497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 28) >> 2] = i3; 6498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 20) >> 2] = 0; 6499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 16) >> 2] = 0; 6500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[588 >> 2] | 0; 6501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 1 << i3; 6502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i4 & i5 | 0) == 0) { 6503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = i4 | i5; 6504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = i2; 6505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 24) >> 2] = i6; 6506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 12) >> 2] = i2; 6507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 8) >> 2] = i2; 6508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[i6 >> 2] | 0; 6511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) == 31) { 6512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0; 6513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 25 - (i3 >>> 1) | 0; 6515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L225 : do { 6517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i25 | 0)) { 6518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i25 << i3; 6519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i4 + (i3 >>> 31 << 2) + 16 | 0; 6521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i6 >> 2] | 0; 6522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 6523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i25 | 0)) { 6526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i5; 6527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L225; 6528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 << 1; 6530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i5; 6531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = i2; 6537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 24) >> 2] = i4; 6538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 12) >> 2] = i2; 6539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 8) >> 2] = i2; 6540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L204; 6541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i4; 6544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i18 + 8 | 0; 6547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i4 >> 2] | 0; 6548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[600 >> 2] | 0; 6549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i18 >>> 0 < i5 >>> 0) { 6550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < i5 >>> 0) { 6553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 12 >> 2] = i2; 6556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = i2; 6557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 8) >> 2] = i3; 6558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 12) >> 2] = i18; 6559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + (i12 + 24) >> 2] = 0; 6560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i25 + i12 | 0; 6564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i24 + 4 >> 2] = i32 | 3; 6565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i24 + (i32 + 4) | 0; 6566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1; 6567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i24 + 8 | 0; 6570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 6571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 6572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = -1; 6576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[592 >> 2] | 0; 6580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i12 >>> 0 > i18 >>> 0)) { 6581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i18 - i12 | 0; 6582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = HEAP32[604 >> 2] | 0; 6583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 > 15) { 6584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[604 >> 2] = i2 + i12; 6585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = i3; 6586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + (i12 + 4) >> 2] = i3 | 1; 6587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + i18 >> 2] = i3; 6588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 4 >> 2] = i12 | 3; 6589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = 0; 6591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[604 >> 2] = 0; 6592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 4 >> 2] = i18 | 3; 6593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i2 + (i18 + 4) | 0; 6594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i32 >> 2] = HEAP32[i32 >> 2] | 1; 6595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i2 + 8 | 0; 6597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 6598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 6599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[596 >> 2] | 0; 6601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i12 >>> 0 < i18 >>> 0) { 6602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = i18 - i12 | 0; 6603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[596 >> 2] = i31; 6604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = HEAP32[608 >> 2] | 0; 6605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[608 >> 2] = i32 + i12; 6606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1; 6607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i32 + 4 >> 2] = i12 | 3; 6608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 + 8 | 0; 6609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 6610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 6611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[264] | 0) == 0) { 6614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = _sysconf(30) | 0; 6615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i18 + -1 & i18 | 0) == 0) { 6616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1064 >> 2] = i18; 6617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1060 >> 2] = i18; 6618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1068 >> 2] = -1; 6619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1072 >> 2] = -1; 6620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1076 >> 2] = 0; 6621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1028 >> 2] = 0; 6622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[264] = (_time(0) | 0) & -16 ^ 1431655768; 6623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = i12 + 48 | 0; 6630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = HEAP32[1064 >> 2] | 0; 6631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = i12 + 47 | 0; 6632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i22 = i25 + i21 | 0; 6633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = 0 - i25 | 0; 6634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i22 & i25; 6635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i18 >>> 0 > i12 >>> 0)) { 6636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = 0; 6637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 6638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 6639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = HEAP32[1024 >> 2] | 0; 6641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i24 | 0) != 0 ? (i31 = HEAP32[1016 >> 2] | 0, i32 = i31 + i18 | 0, i32 >>> 0 <= i31 >>> 0 | i32 >>> 0 > i24 >>> 0) : 0) { 6642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = 0; 6643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 6644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 6645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L269 : do { 6647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[1028 >> 2] & 4 | 0) == 0) { 6648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = HEAP32[608 >> 2] | 0; 6649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L271 : do { 6650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i26 | 0) != 0) { 6651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = 1032 | 0; 6652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i27 = HEAP32[i24 >> 2] | 0; 6654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i27 >>> 0 > i26 >>> 0) ? (i23 = i24 + 4 | 0, (i27 + (HEAP32[i23 >> 2] | 0) | 0) >>> 0 > i26 >>> 0) : 0) { 6655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = HEAP32[i24 + 8 >> 2] | 0; 6658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i24 | 0) == 0) { 6659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 182; 6660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L271; 6661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i24 | 0) != 0) { 6664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i22 - (HEAP32[596 >> 2] | 0) & i25; 6665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i25 >>> 0 < 2147483647) { 6666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = _sbrk(i25 | 0) | 0; 6667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = (i13 | 0) == ((HEAP32[i24 >> 2] | 0) + (HEAP32[i23 >> 2] | 0) | 0); 6668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i22 = i13; 6669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i25; 6670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i23 = i26 ? i13 : -1; 6671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i26 ? i25 : 0; 6672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 191; 6673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = 0; 6675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 182; 6678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 182; 6681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 | 0) == 182) { 6685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i23 = _sbrk(0) | 0; 6686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i23 | 0) != (-1 | 0)) { 6687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i23; 6688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i22 = HEAP32[1060 >> 2] | 0; 6689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i22 + -1 | 0; 6690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i25 & i24 | 0) == 0) { 6691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i18; 6692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i18 - i24 + (i25 + i24 & 0 - i22) | 0; 6694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = HEAP32[1016 >> 2] | 0; 6696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i26 = i24 + i25 | 0; 6697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i25 >>> 0 > i12 >>> 0 & i25 >>> 0 < 2147483647) { 6698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i22 = HEAP32[1024 >> 2] | 0; 6699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i22 | 0) != 0 ? i26 >>> 0 <= i24 >>> 0 | i26 >>> 0 > i22 >>> 0 : 0) { 6700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = 0; 6701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i22 = _sbrk(i25 | 0) | 0; 6704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = (i22 | 0) == (i23 | 0); 6705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i25; 6706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i23 = i13 ? i23 : -1; 6707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = i13 ? i25 : 0; 6708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 191; 6709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = 0; 6711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = 0; 6714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L291 : do { 6718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 | 0) == 191) { 6719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 0 - i24 | 0; 6720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i23 | 0) != (-1 | 0)) { 6721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i17 = i23; 6722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i25; 6723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 202; 6724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L269; 6725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i22 | 0) != (-1 | 0) & i24 >>> 0 < 2147483647 & i24 >>> 0 < i20 >>> 0 ? (i19 = HEAP32[1064 >> 2] | 0, i19 = i21 - i24 + i19 & 0 - i19, i19 >>> 0 < 2147483647) : 0) { 6728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((_sbrk(i19 | 0) | 0) == (-1 | 0)) { 6729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _sbrk(i13 | 0) | 0; 6730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L291; 6731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i24 = i19 + i24 | 0; 6733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i22 | 0) != (-1 | 0)) { 6738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i17 = i22; 6739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i24; 6740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 202; 6741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L269; 6742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1028 >> 2] = HEAP32[1028 >> 2] | 4; 6746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 199; 6747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i25 = 0; 6749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 199; 6750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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) { 6753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i14 ? i15 : i25; 6754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 202; 6755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 | 0) == 202) { 6757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = (HEAP32[1016 >> 2] | 0) + i14 | 0; 6758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1016 >> 2] = i15; 6759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i15 >>> 0 > (HEAP32[1020 >> 2] | 0) >>> 0) { 6760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1020 >> 2] = i15; 6761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = HEAP32[608 >> 2] | 0; 6763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L311 : do { 6764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i15 | 0) != 0) { 6765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = 1032 | 0; 6766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = HEAP32[i21 >> 2] | 0; 6768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = i21 + 4 | 0; 6769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = HEAP32[i19 >> 2] | 0; 6770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i17 | 0) == (i16 + i20 | 0)) { 6771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 214; 6772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[i21 + 8 >> 2] | 0; 6775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i18 | 0) == 0) { 6776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = i18; 6779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (((i13 | 0) == 214 ? (HEAP32[i21 + 12 >> 2] & 8 | 0) == 0 : 0) ? i15 >>> 0 >= i16 >>> 0 & i15 >>> 0 < i17 >>> 0 : 0) { 6782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i19 >> 2] = i20 + i14; 6783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = (HEAP32[596 >> 2] | 0) + i14 | 0; 6784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i15 + 8 | 0; 6785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 & 7 | 0) == 0) { 6786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0; 6787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0 - i3 & 7; 6789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i2 - i3 | 0; 6791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[608 >> 2] = i15 + i3; 6792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[596 >> 2] = i32; 6793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + (i3 + 4) >> 2] = i32 | 1; 6794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + (i2 + 4) >> 2] = 40; 6795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[612 >> 2] = HEAP32[1072 >> 2]; 6796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i17 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[600 >> 2] = i17; 6800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = i17 + i14 | 0; 6802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = 1032 | 0; 6803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i16 >> 2] | 0) == (i19 | 0)) { 6805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 224; 6806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[i16 + 8 >> 2] | 0; 6809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i18 | 0) == 0) { 6810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i18; 6813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 | 0) == 224 ? (HEAP32[i16 + 12 >> 2] & 8 | 0) == 0 : 0) { 6816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i16 >> 2] = i17; 6817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i16 + 4 | 0; 6818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = (HEAP32[i6 >> 2] | 0) + i14; 6819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i17 + 8 | 0; 6820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 & 7 | 0) == 0) { 6821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 0; 6822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 0 - i6 & 7; 6824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i17 + (i14 + 8) | 0; 6826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 & 7 | 0) == 0) { 6827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 0; 6828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 0 - i7 & 7; 6830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = i17 + (i13 + i14) | 0; 6832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i6 + i12 | 0; 6833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i17 + i8 | 0; 6834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i10 = i15 - (i17 + i6) - i12 | 0; 6835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i6 + 4) >> 2] = i12 | 3; 6836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L348 : do { 6837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i15 | 0) != (HEAP32[608 >> 2] | 0)) { 6838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i15 | 0) == (HEAP32[604 >> 2] | 0)) { 6839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = (HEAP32[592 >> 2] | 0) + i10 | 0; 6840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = i32; 6841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[604 >> 2] = i7; 6842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1; 6843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i32 + i8) >> 2] = i32; 6844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i14 + 4 | 0; 6847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[i17 + (i12 + i13) >> 2] | 0; 6848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i18 & 3 | 0) == 1) { 6849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i18 & -8; 6850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i18 >>> 3; 6851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i18 >>> 0 < 256)) { 6853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[i17 + ((i13 | 24) + i14) >> 2] | 0; 6854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0; 6855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i19 | 0) == (i15 | 0)) { 6857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = i13 | 16; 6858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i17 + (i12 + i19) | 0; 6859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = HEAP32[i18 >> 2] | 0; 6860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i16 | 0) == 0) { 6861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i17 + (i19 + i14) | 0; 6862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = HEAP32[i18 >> 2] | 0; 6863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i16 | 0) == 0) { 6864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 0; 6865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 6869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = i16 + 20 | 0; 6870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = HEAP32[i20 >> 2] | 0; 6871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i19 | 0) != 0) { 6872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i19; 6873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i20; 6874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 6875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = i16 + 16 | 0; 6877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = HEAP32[i19 >> 2] | 0; 6878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i20 | 0) == 0) { 6879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i20; 6882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i19; 6883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i18 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i18 >> 2] = 0; 6889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i16; 6890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0; 6894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i18 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i18 + 12 | 0; 6898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i16 >> 2] | 0) != (i15 | 0)) { 6899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = i19 + 8 | 0; 6902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i20 >> 2] | 0) == (i15 | 0)) { 6903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i16 >> 2] = i19; 6904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i20 >> 2] = i18; 6905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i19; 6906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) != 0) { 6913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = HEAP32[i17 + (i14 + 28 + i13) >> 2] | 0; 6914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = 888 + (i16 << 2) | 0; 6915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i15 | 0) == (HEAP32[i18 >> 2] | 0)) { 6916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i18 >> 2] = i5; 6917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 6918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i16); 6919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i9 + 16 | 0; 6926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) { 6927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i16 >> 2] = i5; 6928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 + 20 >> 2] = i5; 6930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 6932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 24 >> 2] = i9; 6939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = i13 | 16; 6940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[i17 + (i15 + i14) >> 2] | 0; 6941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 6942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) != 0) { 6943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 16 >> 2] = i9; 6947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 + 24 >> 2] = i5; 6948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[i17 + (i12 + i15) >> 2] | 0; 6953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) != 0) { 6954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 20 >> 2] = i9; 6958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 + 24 >> 2] = i5; 6959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i17 + ((i13 | 8) + i14) >> 2] | 0; 6965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = HEAP32[i17 + (i14 + 12 + i13) >> 2] | 0; 6966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = 624 + (i16 << 1 << 2) | 0; 6967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) != (i18 | 0)) { 6968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i5 + 12 >> 2] | 0) != (i15 | 0)) { 6972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i12 | 0) == (i5 | 0)) { 6976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = HEAP32[146] & ~(1 << i16); 6977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 6978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i12 | 0) != (i18 | 0)) { 6980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i12 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 6981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i12 + 8 | 0; 6984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i16 >> 2] | 0) == (i15 | 0)) { 6985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i16; 6986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 6988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 6990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i12 + 8 | 0; 6991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 12 >> 2] = i12; 6993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 >> 2] = i5; 6994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 6996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = i17 + ((i11 | i13) + i14) | 0; 6997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i10 = i11 + i10 | 0; 6998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 6999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i15 + 4 | 0; 7000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 >> 2] = HEAP32[i5 >> 2] & -2; 7001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 4) >> 2] = i10 | 1; 7002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i10 + i8) >> 2] = i10; 7003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i10 >>> 3; 7004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i10 >>> 0 < 256) { 7005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i10 = i5 << 1; 7006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = 624 + (i10 << 2) | 0; 7007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[146] | 0; 7008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 1 << i5; 7009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 & i5 | 0) != 0) { 7010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = 624 + (i10 + 2 << 2) | 0; 7011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i9 >> 2] | 0; 7012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i9; 7016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i5; 7017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = i9 | i5; 7020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 624 + (i10 + 2 << 2) | 0; 7021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i2; 7022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 >> 2] = i7; 7024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 + 12 >> 2] = i7; 7025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 8) >> 2] = i4; 7026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 12) >> 2] = i2; 7027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i10 >>> 8; 7030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) != 0) { 7031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i10 >>> 0 > 16777215) { 7032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 31; 7033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = (i3 + 1048320 | 0) >>> 16 & 8; 7035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i3 << i31; 7036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i30 = (i32 + 520192 | 0) >>> 16 & 4; 7037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 << i30; 7038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = (i32 + 245760 | 0) >>> 16 & 2; 7039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0; 7040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i10 >>> (i3 + 7 | 0) & 1 | i3 << 1; 7041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0; 7044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 888 + (i3 << 2) | 0; 7046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 28) >> 2] = i3; 7047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 20) >> 2] = 0; 7048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 16) >> 2] = 0; 7049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[588 >> 2] | 0; 7050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 1 << i3; 7051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 & i5 | 0) == 0) { 7052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = i9 | i5; 7053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = i7; 7054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 24) >> 2] = i4; 7055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 12) >> 2] = i7; 7056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 8) >> 2] = i7; 7057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[i4 >> 2] | 0; 7060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) == 31) { 7061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0; 7062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 25 - (i3 >>> 1) | 0; 7064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L444 : do { 7066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i10 | 0)) { 7067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i10 << i3; 7068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i4 + (i3 >>> 31 << 2) + 16 | 0; 7070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[i5 >> 2] | 0; 7071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) == 0) { 7072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i9 + 4 >> 2] & -8 | 0) == (i10 | 0)) { 7075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i9; 7076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L444; 7077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 << 1; 7079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i9; 7080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 >> 2] = i7; 7086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 24) >> 2] = i4; 7087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 12) >> 2] = i7; 7088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 8) >> 2] = i7; 7089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L348; 7090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i4; 7093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i2 + 8 | 0; 7096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i4 >> 2] | 0; 7097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[600 >> 2] | 0; 7098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i2 >>> 0 < i5 >>> 0) { 7099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < i5 >>> 0) { 7102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 12 >> 2] = i7; 7105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = i7; 7106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 8) >> 2] = i3; 7107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 12) >> 2] = i2; 7108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 24) >> 2] = 0; 7109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = (HEAP32[596 >> 2] | 0) + i10 | 0; 7113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[596 >> 2] = i32; 7114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[608 >> 2] = i7; 7115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i8 + 4) >> 2] = i32 | 1; 7116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i17 + (i6 | 8) | 0; 7119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 7121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 1032 | 0; 7123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = HEAP32[i3 >> 2] | 0; 7125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i2 >>> 0 > i15 >>> 0) ? (i11 = HEAP32[i3 + 4 >> 2] | 0, i10 = i2 + i11 | 0, i10 >>> 0 > i15 >>> 0) : 0) { 7126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i3 + 8 >> 2] | 0; 7129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i2 + (i11 + -39) | 0; 7131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 & 7 | 0) == 0) { 7132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0; 7133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0 - i3 & 7; 7135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 + (i11 + -47 + i3) | 0; 7137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 >>> 0 < (i15 + 16 | 0) >>> 0 ? i15 : i2; 7138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i2 + 8 | 0; 7139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i17 + 8 | 0; 7140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i4 & 7 | 0) == 0) { 7141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 0; 7142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 0 - i4 & 7; 7144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i14 + -40 - i4 | 0; 7146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[608 >> 2] = i17 + i4; 7147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[596 >> 2] = i32; 7148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i4 + 4) >> 2] = i32 | 1; 7149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i14 + -36) >> 2] = 40; 7150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[612 >> 2] = HEAP32[1072 >> 2]; 7151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 4 >> 2] = 27; 7152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 0 >> 2] = HEAP32[1032 >> 2]; 7153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 4 >> 2] = HEAP32[1036 >> 2]; 7154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 8 >> 2] = HEAP32[1040 >> 2]; 7155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 12 >> 2] = HEAP32[1044 >> 2]; 7156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1032 >> 2] = i17; 7157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1036 >> 2] = i14; 7158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1044 >> 2] = 0; 7159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1040 >> 2] = i3; 7160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i2 + 28 | 0; 7161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = 7; 7162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i2 + 32 | 0) >>> 0 < i10 >>> 0) { 7163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i4 + 4 | 0; 7165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 >> 2] = 7; 7166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i4 + 8 | 0) >>> 0 < i10 >>> 0) { 7167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i3; 7168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i2 | 0) != (i15 | 0)) { 7174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 - i15 | 0; 7175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i15 + (i2 + 4) | 0; 7176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 >> 2] = HEAP32[i3 >> 2] & -2; 7177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 4 >> 2] = i2 | 1; 7178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + i2 >> 2] = i2; 7179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i2 >>> 3; 7180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i2 >>> 0 < 256) { 7181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i3 << 1; 7182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = 624 + (i4 << 2) | 0; 7183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[146] | 0; 7184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 1 << i3; 7185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 & i3 | 0) != 0) { 7186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 624 + (i4 + 2 << 2) | 0; 7187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i4 >> 2] | 0; 7188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i4; 7192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i3; 7193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = i5 | i3; 7196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = 624 + (i4 + 2 << 2) | 0; 7197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i2; 7198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i7 >> 2] = i15; 7200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i8 + 12 >> 2] = i15; 7201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 8 >> 2] = i8; 7202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 12 >> 2] = i2; 7203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i2 >>> 8; 7206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) != 0) { 7207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i2 >>> 0 > 16777215) { 7208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 31; 7209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = (i3 + 1048320 | 0) >>> 16 & 8; 7211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i3 << i31; 7212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i30 = (i32 + 520192 | 0) >>> 16 & 4; 7213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 << i30; 7214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = (i32 + 245760 | 0) >>> 16 & 2; 7215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 14 - (i30 | i31 | i3) + (i32 << i3 >>> 15) | 0; 7216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i2 >>> (i3 + 7 | 0) & 1 | i3 << 1; 7217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0; 7220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = 888 + (i3 << 2) | 0; 7222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 28 >> 2] = i3; 7223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 20 >> 2] = 0; 7224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 16 >> 2] = 0; 7225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[588 >> 2] | 0; 7226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 1 << i3; 7227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i4 & i5 | 0) == 0) { 7228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = i4 | i5; 7229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i7 >> 2] = i15; 7230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 24 >> 2] = i7; 7231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 12 >> 2] = i15; 7232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 8 >> 2] = i15; 7233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[i7 >> 2] | 0; 7236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) == 31) { 7237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 0; 7238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 25 - (i3 >>> 1) | 0; 7240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L499 : do { 7242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i4 + 4 >> 2] & -8 | 0) != (i2 | 0)) { 7243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i2 << i3; 7244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i4 + (i3 >>> 31 << 2) + 16 | 0; 7246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i7 >> 2] | 0; 7247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 7248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i2 | 0)) { 7251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i5; 7252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L499; 7253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 << 1; 7255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i5; 7256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i7 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i7 >> 2] = i15; 7262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 24 >> 2] = i4; 7263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 12 >> 2] = i15; 7264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 8 >> 2] = i15; 7265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L311; 7266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i4; 7269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i6 + 8 | 0; 7272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i4 >> 2] | 0; 7273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = HEAP32[600 >> 2] | 0; 7274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i6 >>> 0 < i2 >>> 0) { 7275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < i2 >>> 0) { 7278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 + 12 >> 2] = i15; 7281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = i15; 7282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 8 >> 2] = i3; 7283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 12 >> 2] = i6; 7284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 24 >> 2] = 0; 7285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = HEAP32[600 >> 2] | 0; 7290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i32 | 0) == 0 | i17 >>> 0 < i32 >>> 0) { 7291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[600 >> 2] = i17; 7292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1032 >> 2] = i17; 7294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1036 >> 2] = i14; 7295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[1044 >> 2] = 0; 7296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[620 >> 2] = HEAP32[264]; 7297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[616 >> 2] = -1; 7298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = 0; 7299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i2 << 1; 7301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = 624 + (i32 << 2) | 0; 7302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[624 + (i32 + 3 << 2) >> 2] = i31; 7303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[624 + (i32 + 2 << 2) >> 2] = i31; 7304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 + 1 | 0; 7305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while ((i2 | 0) != 32); 7306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i17 + 8 | 0; 7307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i2 & 7 | 0) == 0) { 7308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = 0; 7309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = 0 - i2 & 7; 7311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i14 + -40 - i2 | 0; 7313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[608 >> 2] = i17 + i2; 7314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[596 >> 2] = i32; 7315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i2 + 4) >> 2] = i32 | 1; 7316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + (i14 + -36) >> 2] = 40; 7317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[612 >> 2] = HEAP32[1072 >> 2]; 7318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = HEAP32[596 >> 2] | 0; 7321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i2 >>> 0 > i12 >>> 0) { 7322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i31 = i2 - i12 | 0; 7323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[596 >> 2] = i31; 7324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = HEAP32[608 >> 2] | 0; 7325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[608 >> 2] = i32 + i12; 7326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i32 + (i12 + 4) >> 2] = i31 | 1; 7327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i32 + 4 >> 2] = i12 | 3; 7328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = i32 + 8 | 0; 7329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 7331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[(___errno_location() | 0) >> 2] = 12; 7334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i32 = 0; 7335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i32 | 0; 7337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 7338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction _free(i7) { 7339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 | 0; 7340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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; 7341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = STACKTOP; 7342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) == 0) { 7343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = i7 + -8 | 0; 7347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = HEAP32[600 >> 2] | 0; 7348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i15 >>> 0 < i16 >>> 0) { 7349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = HEAP32[i7 + -4 >> 2] | 0; 7352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i13 & 3; 7353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i12 | 0) == 1) { 7354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i13 & -8; 7357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i7 + (i8 + -8) | 0; 7358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 & 1 | 0) == 0) { 7360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = HEAP32[i15 >> 2] | 0; 7361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i12 | 0) == 0) { 7362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = -8 - i19 | 0; 7366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = i7 + i15 | 0; 7367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i19 + i8 | 0; 7368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i13 >>> 0 < i16 >>> 0) { 7369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 | 0) == (HEAP32[604 >> 2] | 0)) { 7372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i7 + (i8 + -4) | 0; 7373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i2 >> 2] & 3 | 0) != 3) { 7374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i13; 7375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i12; 7376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = i12; 7379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 >> 2] = HEAP32[i2 >> 2] & -2; 7380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i7 + (i15 + 4) >> 2] = i12 | 1; 7381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = i12; 7382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i19 >>> 3; 7386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i19 >>> 0 < 256) { 7387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = HEAP32[i7 + (i15 + 8) >> 2] | 0; 7388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = HEAP32[i7 + (i15 + 12) >> 2] | 0; 7389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = 624 + (i18 << 1 << 2) | 0; 7390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i2 | 0) != (i14 | 0)) { 7391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i2 >>> 0 < i16 >>> 0) { 7392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i2 + 12 >> 2] | 0) != (i13 | 0)) { 7395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i11 | 0) == (i2 | 0)) { 7399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = HEAP32[146] & ~(1 << i18); 7400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i13; 7401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i12; 7402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i11 | 0) != (i14 | 0)) { 7405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i11 >>> 0 < i16 >>> 0) { 7406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i11 + 8 | 0; 7409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i14 >> 2] | 0) == (i13 | 0)) { 7410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i17 = i14; 7411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i17 = i11 + 8 | 0; 7416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 12 >> 2] = i11; 7418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 >> 2] = i2; 7419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i13; 7420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i12; 7421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i17 = HEAP32[i7 + (i15 + 24) >> 2] | 0; 7424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[i7 + (i15 + 12) >> 2] | 0; 7425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i18 | 0) == (i13 | 0)) { 7427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = i7 + (i15 + 20) | 0; 7428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[i19 >> 2] | 0; 7429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i18 | 0) == 0) { 7430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = i7 + (i15 + 16) | 0; 7431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[i19 >> 2] | 0; 7432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i18 | 0) == 0) { 7433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = 0; 7434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = i18 + 20 | 0; 7439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = HEAP32[i21 >> 2] | 0; 7440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i20 | 0) != 0) { 7441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i20; 7442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = i21; 7443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 7444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = i18 + 16 | 0; 7446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = HEAP32[i20 >> 2] | 0; 7447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i21 | 0) == 0) { 7448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = i21; 7451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = i20; 7452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i19 >>> 0 < i16 >>> 0) { 7455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i19 >> 2] = 0; 7458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i18; 7459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = HEAP32[i7 + (i15 + 8) >> 2] | 0; 7463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i19 >>> 0 < i16 >>> 0) { 7464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i19 + 12 | 0; 7467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i16 >> 2] | 0) != (i13 | 0)) { 7468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = i18 + 8 | 0; 7471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i20 >> 2] | 0) == (i13 | 0)) { 7472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i16 >> 2] = i18; 7473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i20 >> 2] = i19; 7474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i18; 7475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i17 | 0) != 0) { 7482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i18 = HEAP32[i7 + (i15 + 28) >> 2] | 0; 7483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = 888 + (i18 << 2) | 0; 7484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 | 0) == (HEAP32[i16 >> 2] | 0)) { 7485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i16 >> 2] = i14; 7486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i14 | 0) == 0) { 7487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i18); 7488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i13; 7489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i12; 7490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i17 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = i17 + 16 | 0; 7497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i16 >> 2] | 0) == (i13 | 0)) { 7498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i16 >> 2] = i14; 7499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i17 + 20 >> 2] = i14; 7501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i14 | 0) == 0) { 7503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i13; 7504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i12; 7505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i14 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i14 + 24 >> 2] = i17; 7512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i16 = HEAP32[i7 + (i15 + 16) >> 2] | 0; 7513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i16 | 0) != 0) { 7515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i16 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i14 + 16 >> 2] = i16; 7519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i16 + 24 >> 2] = i14; 7520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = HEAP32[i7 + (i15 + 20) >> 2] | 0; 7525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i15 | 0) != 0) { 7526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i15 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i14 + 20 >> 2] = i15; 7530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i15 + 24 >> 2] = i14; 7531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i13; 7532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i12; 7533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i13; 7537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i12; 7538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i13; 7541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i12; 7542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i15; 7545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = i8; 7546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i2 >>> 0 < i6 >>> 0)) { 7549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i7 + (i8 + -4) | 0; 7552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = HEAP32[i12 >> 2] | 0; 7553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 & 1 | 0) == 0) { 7554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i13 & 2 | 0) == 0) { 7557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == (HEAP32[608 >> 2] | 0)) { 7558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = (HEAP32[596 >> 2] | 0) + i11 | 0; 7559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[596 >> 2] = i21; 7560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[608 >> 2] = i2; 7561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 4 >> 2] = i21 | 1; 7562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i2 | 0) != (HEAP32[604 >> 2] | 0)) { 7563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[604 >> 2] = 0; 7567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = 0; 7568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == (HEAP32[604 >> 2] | 0)) { 7572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = (HEAP32[592 >> 2] | 0) + i11 | 0; 7573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = i21; 7574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[604 >> 2] = i2; 7575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 4 >> 2] = i21 | 1; 7576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + i21 >> 2] = i21; 7577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i11 = (i13 & -8) + i11 | 0; 7581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i13 >>> 3; 7582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i13 >>> 0 < 256)) { 7584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i10 = HEAP32[i7 + (i8 + 16) >> 2] | 0; 7585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = HEAP32[i7 + (i8 | 4) >> 2] | 0; 7586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i15 | 0) == (i6 | 0)) { 7588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = i7 + (i8 + 12) | 0; 7589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = HEAP32[i13 >> 2] | 0; 7590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i12 | 0) == 0) { 7591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = i7 + (i8 + 8) | 0; 7592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = HEAP32[i13 >> 2] | 0; 7593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i12 | 0) == 0) { 7594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = 0; 7595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i12 + 20 | 0; 7600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = HEAP32[i14 >> 2] | 0; 7601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i15 | 0) != 0) { 7602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i15; 7603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = i14; 7604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier continue; 7605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i12 + 16 | 0; 7607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i15 = HEAP32[i14 >> 2] | 0; 7608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i15 | 0) == 0) { 7609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i15; 7612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = i14; 7613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i13 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i13 >> 2] = 0; 7619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i12; 7620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = HEAP32[i7 + i8 >> 2] | 0; 7624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i13 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i14 = i13 + 12 | 0; 7628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i14 >> 2] | 0) != (i6 | 0)) { 7629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i15 + 8 | 0; 7632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) { 7633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i14 >> 2] = i15; 7634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i12 >> 2] = i13; 7635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i15; 7636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i10 | 0) != 0) { 7643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = HEAP32[i7 + (i8 + 20) >> 2] | 0; 7644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i13 = 888 + (i12 << 2) | 0; 7645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == (HEAP32[i13 >> 2] | 0)) { 7646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i13 >> 2] = i9; 7647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) == 0) { 7648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = HEAP32[588 >> 2] & ~(1 << i12); 7649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i10 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i12 = i10 + 16 | 0; 7656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i12 >> 2] | 0) == (i6 | 0)) { 7657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i12 >> 2] = i9; 7658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i10 + 20 >> 2] = i9; 7660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) == 0) { 7662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 + 24 >> 2] = i10; 7669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[i7 + (i8 + 8) >> 2] | 0; 7670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) != 0) { 7672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 + 16 >> 2] = i6; 7676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 + 24 >> 2] = i9; 7677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[i7 + (i8 + 12) >> 2] | 0; 7682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) != 0) { 7683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 + 20 >> 2] = i6; 7687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 + 24 >> 2] = i9; 7688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[i7 + i8 >> 2] | 0; 7694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[i7 + (i8 | 4) >> 2] | 0; 7695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = 624 + (i12 << 1 << 2) | 0; 7696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) != (i8 | 0)) { 7697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i9 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i9 + 12 >> 2] | 0) != (i6 | 0)) { 7701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) == (i9 | 0)) { 7705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = HEAP32[146] & ~(1 << i12); 7706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) != (i8 | 0)) { 7709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i7 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i7 + 8 | 0; 7713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i8 >> 2] | 0) == (i6 | 0)) { 7714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i10 = i8; 7715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i10 = i7 + 8 | 0; 7720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i9 + 12 >> 2] = i7; 7722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i10 >> 2] = i9; 7723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 4 >> 2] = i11 | 1; 7726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + i11 >> 2] = i11; 7727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i2 | 0) == (HEAP32[604 >> 2] | 0)) { 7728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[592 >> 2] = i11; 7729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i12 >> 2] = i13 & -2; 7734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 4 >> 2] = i11 | 1; 7735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + i11 >> 2] = i11; 7736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i11 >>> 3; 7738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i11 >>> 0 < 256) { 7739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i6 << 1; 7740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 624 + (i7 << 2) | 0; 7741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = HEAP32[146] | 0; 7742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 1 << i6; 7743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i8 & i6 | 0) != 0) { 7744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 624 + (i7 + 2 << 2) | 0; 7745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[i6 >> 2] | 0; 7746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i7 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i6; 7750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i7; 7751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[146] = i8 | i6; 7754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 624 + (i7 + 2 << 2) | 0; 7755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i3; 7756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = i2; 7758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 12 >> 2] = i2; 7759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 8 >> 2] = i5; 7760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 12 >> 2] = i3; 7761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i11 >>> 8; 7765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i4 | 0) != 0) { 7766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i11 >>> 0 > 16777215) { 7767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 31; 7768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i20 = (i4 + 1048320 | 0) >>> 16 & 8; 7770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = i4 << i20; 7771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i19 = (i21 + 520192 | 0) >>> 16 & 4; 7772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = i21 << i19; 7773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = (i21 + 245760 | 0) >>> 16 & 2; 7774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 14 - (i19 | i20 | i4) + (i21 << i4 >>> 15) | 0; 7775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i11 >>> (i4 + 7 | 0) & 1 | i4 << 1; 7776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 0; 7779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 888 + (i4 << 2) | 0; 7781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 28 >> 2] = i4; 7782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 20 >> 2] = 0; 7783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 16 >> 2] = 0; 7784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[588 >> 2] | 0; 7785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 1 << i4; 7786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L199 : do { 7787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 & i6 | 0) != 0) { 7788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i5 >> 2] | 0; 7789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i4 | 0) == 31) { 7790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 0; 7791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 25 - (i4 >>> 1) | 0; 7793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L204 : do { 7795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i5 + 4 >> 2] & -8 | 0) != (i11 | 0)) { 7796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i11 << i4; 7797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i5; 7798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i7 + (i4 >>> 31 << 2) + 16 | 0; 7800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i6 >> 2] | 0; 7801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) == 0) { 7802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i5 + 4 >> 2] & -8 | 0) == (i11 | 0)) { 7805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i5; 7806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L204; 7807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i4 << 1; 7809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i5; 7810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i6 >>> 0 < (HEAP32[600 >> 2] | 0) >>> 0) { 7813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i6 >> 2] = i2; 7816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 24 >> 2] = i7; 7817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 12 >> 2] = i2; 7818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 8 >> 2] = i2; 7819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L199; 7820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i5; 7823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i3 + 8 | 0; 7826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = HEAP32[i5 >> 2] | 0; 7827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[600 >> 2] | 0; 7828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i3 >>> 0 < i6 >>> 0) { 7829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i4 >>> 0 < i6 >>> 0) { 7832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _abort(); 7833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 + 12 >> 2] = i2; 7835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 >> 2] = i2; 7836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 8 >> 2] = i4; 7837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 12 >> 2] = i3; 7838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 24 >> 2] = 0; 7839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[588 >> 2] = i7 | i6; 7843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 >> 2] = i2; 7844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 24 >> 2] = i5; 7845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 12 >> 2] = i2; 7846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 + 8 >> 2] = i2; 7847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i21 = (HEAP32[616 >> 2] | 0) + -1 | 0; 7850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[616 >> 2] = i21; 7851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i21 | 0) == 0) { 7852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = 1040 | 0; 7853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = HEAP32[i2 >> 2] | 0; 7859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i2 | 0) == 0) { 7860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 + 8 | 0; 7863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[616 >> 2] = -1; 7866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 7867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 7868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 7869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction _main(i7, i8) { 7870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 | 0; 7871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i8 | 0; 7872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, d9 = 0.0, d10 = 0.0; 7873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = STACKTOP; 7874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = STACKTOP + 4272 | 0; 7875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i2; 7876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i2 + 4248 | 0; 7877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i2 + 2128 | 0; 7878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i2 + 8 | 0; 7879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier L1 : do { 7880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) > 1) { 7881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP8[HEAP32[i8 + 4 >> 2] | 0] | 0; 7882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (i7 | 0) { 7883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 50: 7884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 7885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 95e5; 7886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L1; 7887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 51: 7889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 7890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 4; 7891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L1; 7892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 52: 7894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 7895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 95e6; 7896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L1; 7897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 53: 7899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 7900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 19e7; 7901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L1; 7902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 49: 7904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 7905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 95e4; 7906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break L1; 7907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case 48: 7909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 7910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = 0; 7911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 7912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i8 | 0; 7913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier default: 7915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 7916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 >> 2] = i7 + -48; 7917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _printf(280, i3 | 0) | 0; 7918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = -1; 7919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 7920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i8 | 0; 7921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 4; 7925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while (0); 7927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == 4) { 7928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = 19e6; 7929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 8 >> 2] = 0; 7931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 4 >> 2] = 287; 7932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = __Znaj(347) | 0; 7933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 >> 2] = i8; 7934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _memcpy(i8 | 0, 296, 287) | 0; 7935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i8 + 287 | 0; 7936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = 296 | 0; 7937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i8 + 60 | 0; 7938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i8] = HEAP8[i7] | 0; 7940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = i8 + 1 | 0; 7941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 + 1 | 0; 7942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while ((i8 | 0) < (i6 | 0)); 7943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i3 << 1; 7944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i7 >>> 0 < 60 ? i7 : 60; 7946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZN14RotatingString5writeEj(i5, i6); 7947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) == (i6 | 0)) { 7948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 - i6 | 0; 7951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = HEAP32[i5 >> 2] | 0; 7954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) != 0) { 7955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZdaPv(i5); 7956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[6] | 0) == 0) { 7958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 24; 7959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 0; 7960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 24; 7962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier d9 = 0.0; 7963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i5 + 4 | 0; 7965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier d9 = d9 + +HEAPF32[i6 >> 2]; 7966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier d10 = d9 < 1.0 ? d9 : 1.0; 7967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAPF32[i6 >> 2] = d10; 7968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 8 >> 2] = ~~(d10 * 512.0) >>> 0; 7969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i5 + 12 | 0; 7970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i5 >> 2] | 0) == 0) { 7971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 24; 7972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 0; 7973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 7978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = HEAP32[i6 + 8 >> 2] | 0; 7980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i5 >>> 0 > i8 >>> 0 & (i8 | 0) != 0) { 7981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i6 + 12 | 0; 7982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 7984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 7986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 + (i5 << 2) >> 2] = i6; 7987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i5 + 1 | 0; 7988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while ((i5 | 0) != 513); 7989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 + 2116 >> 2] = 0; 7990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __Z9makeFastaI10RandomizedEvPKcS2_jRT_(0, 0, i3 * 3 | 0, i4); 7991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[54] | 0) == 0) { 7992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 216; 7993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 0; 7994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 7995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 216; 7996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier d9 = 0.0; 7997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 7998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i5 + 4 | 0; 7999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier d9 = d9 + +HEAPF32[i4 >> 2]; 8000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier d10 = d9 < 1.0 ? d9 : 1.0; 8001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAPF32[i4 >> 2] = d10; 8002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i5 + 8 >> 2] = ~~(d10 * 512.0) >>> 0; 8003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i5 + 12 | 0; 8004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((HEAP32[i5 >> 2] | 0) == 0) { 8005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = 216; 8006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = 0; 8007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 8008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 8012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 8013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = HEAP32[i5 + 8 >> 2] | 0; 8014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i4 >>> 0 > i8 >>> 0 & (i8 | 0) != 0) { 8015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i5 + 12 | 0; 8016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 8018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i1 + (i4 << 2) >> 2] = i5; 8021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i4 + 1 | 0; 8022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while ((i4 | 0) != 513); 8023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i1 + 2116 >> 2] = 0; 8024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __Z9makeFastaI10RandomizedEvPKcS2_jRT_(0, 0, i3 * 5 | 0, i1); 8025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i8 = 0; 8026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 8027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i8 | 0; 8028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __Z9makeFastaI10RandomizedEvPKcS2_jRT_(i3, i2, i6, i1) { 8030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 | 0; 8031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 | 0; 8032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i6 | 0; 8033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i4 = 0, i5 = 0, i7 = 0, d8 = 0.0, i9 = 0; 8035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = STACKTOP; 8036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == 0) { 8037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 8038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i1 + 2116 | 0; 8041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i1 + 2052 | 0; 8042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 8043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i6 >>> 0 < 60 ? i6 : 60; 8044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i5 | 0) != 0) { 8045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = 0; 8046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier do { 8047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = ((((HEAP32[4] | 0) * 3877 | 0) + 29573 | 0) >>> 0) % 139968 | 0; 8048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[4] = i9; 8049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier d8 = +(i9 >>> 0) / 139968.0; 8050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = HEAP32[i1 + (~~(d8 * 512.0) >>> 0 << 2) >> 2] | 0; 8051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 8052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (+HEAPF32[i9 + 4 >> 2] < d8) { 8053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i9 + 12 | 0; 8054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 8056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i1 + i7 + 2052 | 0] = HEAP32[i9 >> 2]; 8059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i7 + 1 | 0; 8060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } while ((i7 | 0) != (i5 | 0)); 8061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i1 + i5 + 2052 | 0] = 10; 8063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = i5 + 1 | 0; 8064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i1 + i9 + 2052 | 0] = 0; 8065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i4 >> 2] = i9; 8066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i9 = _strlen(i3 | 0) | 0; 8067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = HEAP32[2] | 0; 8068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i9 | 0) > (i7 | 0)) { 8069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) > 0) { 8070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i1 + i7 + 2052 | 0] = 0; 8071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _puts(i3 | 0) | 0; 8072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i1 + (HEAP32[2] | 0) + 2052 | 0] = 122; 8073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[2] = 0; 8074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _puts(i3 | 0) | 0; 8077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[2] = (HEAP32[2] | 0) - i9; 8078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == (i5 | 0)) { 8080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 8081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i6 - i5 | 0; 8083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 8086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __ZN14RotatingString5writeEj(i3, i4) { 8089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 | 0; 8090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i4 | 0; 8091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i1 = 0, i2 = 0, i5 = 0, i6 = 0, i7 = 0; 8092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = STACKTOP; 8093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = __Znaj(i4 + 2 | 0) | 0; 8094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i3 + 8 | 0; 8095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _memcpy(i5 | 0, (HEAP32[i3 >> 2] | 0) + (HEAP32[i2 >> 2] | 0) | 0, i4 | 0) | 0; 8096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i5 + i4 | 0] = 0; 8097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = _strlen(i5 | 0) | 0; 8098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = HEAP32[2] | 0; 8099958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i7 | 0) > (i6 | 0)) { 8100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) > 0) { 8101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i5 + i6 | 0] = 0; 8102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _puts(i5 | 0) | 0; 8103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[2] = 0; 8104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 6; 8105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 5; 8107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _puts(i5 | 0) | 0; 8110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[2] = (HEAP32[2] | 0) - i7; 8111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 5; 8112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == 5 ? (i5 | 0) != 0 : 0) { 8114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = 6; 8115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i6 | 0) == 6) { 8117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZdlPv(i5); 8118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = (HEAP32[i2 >> 2] | 0) + i4 | 0; 8120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 >> 2] = i4; 8121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[i3 + 4 >> 2] | 0; 8122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!(i4 >>> 0 > i3 >>> 0)) { 8123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 8124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i2 >> 2] = i4 - i3; 8127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 8128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction _memcpy(i3, i2, i1) { 8131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 | 0; 8132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 | 0; 8133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i4 = 0; 8135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i1 | 0) >= 4096) return _emscripten_memcpy_big(i3 | 0, i2 | 0, i1 | 0) | 0; 8136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i3 | 0; 8137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 & 3) == (i2 & 3)) { 8138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (i3 & 3) { 8139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i1 | 0) == 0) return i4 | 0; 8140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i3] = HEAP8[i2] | 0; 8141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 + 1 | 0; 8142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 + 1 | 0; 8143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 - 1 | 0; 8144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while ((i1 | 0) >= 4) { 8146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 >> 2] = HEAP32[i2 >> 2]; 8147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 + 4 | 0; 8148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 + 4 | 0; 8149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 - 4 | 0; 8150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while ((i1 | 0) > 0) { 8153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i3] = HEAP8[i2] | 0; 8154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 + 1 | 0; 8155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 + 1 | 0; 8156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 - 1 | 0; 8157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i4 | 0; 8159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction _memset(i1, i4, i3) { 8161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i4 | 0; 8163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = i3 | 0; 8164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i2 = 0, i5 = 0, i6 = 0, i7 = 0; 8165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i1 + i3 | 0; 8166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) >= 20) { 8167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i4 = i4 & 255; 8168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i1 & 3; 8169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i6 = i4 | i4 << 8 | i4 << 16 | i4 << 24; 8170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i5 = i2 & ~3; 8171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (i7) { 8172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i7 = i1 + 4 - i7 | 0; 8173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while ((i1 | 0) < (i7 | 0)) { 8174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i1] = i4; 8175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 + 1 | 0; 8176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while ((i1 | 0) < (i5 | 0)) { 8179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i1 >> 2] = i6; 8180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 + 4 | 0; 8181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while ((i1 | 0) < (i2 | 0)) { 8184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[i1] = i4; 8185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 + 1 | 0; 8186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i1 - i3 | 0; 8188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __Znwj(i2) { 8190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 | 0; 8191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i1 = 0, i3 = 0; 8192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = STACKTOP; 8193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = (i2 | 0) == 0 ? 1 : i2; 8194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (1) { 8195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = _malloc(i2) | 0; 8196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) != 0) { 8197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = 6; 8198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 8199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = HEAP32[270] | 0; 8201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[270] = i3 + 0; 8202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i3 | 0) == 0) { 8203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = 5; 8204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier break; 8205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FUNCTION_TABLE_v[i3 & 0](); 8207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i2 | 0) == 5) { 8209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i3 = ___cxa_allocate_exception(4) | 0; 8210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[i3 >> 2] = 1096; 8211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ___cxa_throw(i3 | 0, 1144, 1); 8212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if ((i2 | 0) == 6) { 8213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 8214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i3 | 0; 8215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 8217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction copyTempDouble(i1) { 8219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr] = HEAP8[i1]; 8221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0]; 8222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0]; 8223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0]; 8224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 4 | 0] = HEAP8[i1 + 4 | 0]; 8225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 5 | 0] = HEAP8[i1 + 5 | 0]; 8226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 6 | 0] = HEAP8[i1 + 6 | 0]; 8227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 7 | 0] = HEAP8[i1 + 7 | 0]; 8228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction copyTempFloat(i1) { 8230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr] = HEAP8[i1]; 8232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 1 | 0] = HEAP8[i1 + 1 | 0]; 8233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 2 | 0] = HEAP8[i1 + 2 | 0]; 8234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP8[tempDoublePtr + 3 | 0] = HEAP8[i1 + 3 | 0]; 8235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __ZNSt9bad_allocD0Ev(i1) { 8237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i2 = 0; 8239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = STACKTOP; 8240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZNSt9exceptionD2Ev(i1 | 0); 8241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZdlPv(i1); 8242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 8243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction stackAlloc(i1) { 8246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i2 = 0; 8248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = STACKTOP; 8249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = STACKTOP + i1 | 0; 8250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = STACKTOP + 7 & -8; 8251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i2 | 0; 8252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __ZNSt9bad_allocD2Ev(i1) { 8254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i2 = 0; 8256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = STACKTOP; 8257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZNSt9exceptionD2Ev(i1 | 0); 8258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 8259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __ZdlPv(i1) { 8262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i2 = 0; 8264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = STACKTOP; 8265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((i1 | 0) != 0) { 8266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier _free(i1); 8267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 8269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction _strlen(i1) { 8272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i2 = 0; 8274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i1; 8275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (HEAP8[i2] | 0) { 8276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 + 1 | 0; 8277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i2 - i1 | 0; 8279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setThrew(i1, i2) { 8281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 | 0; 8283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if ((__THREW__ | 0) == 0) { 8284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __THREW__ = i1; 8285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier threwValue = i2; 8286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __Znaj(i1) { 8289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i2 = 0; 8291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = STACKTOP; 8292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = __Znwj(i1) | 0; 8293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 8294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return i1 | 0; 8295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction runPostSets() { 8297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[286] = __ZTVN10__cxxabiv120__si_class_type_infoE; 8298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAP32[288] = __ZTISt9exception; 8299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction dynCall_ii(i2, i1) { 8301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 | 0; 8302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FUNCTION_TABLE_ii[i2 & 1](i1 | 0) | 0; 8304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __ZdaPv(i1) { 8306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var i2 = 0; 8308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = STACKTOP; 8309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier __ZdlPv(i1); 8310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i2; 8311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction dynCall_vi(i2, i1) { 8314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i2 = i2 | 0; 8315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FUNCTION_TABLE_vi[i2 & 3](i1 | 0); 8317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction dynCall_v(i1) { 8319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FUNCTION_TABLE_v[i1 & 0](); 8321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction __ZNKSt9bad_alloc4whatEv(i1) { 8323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 1112; 8325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction stackRestore(i1) { 8327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = i1; 8329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet9(i1) { 8331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet9 = i1; 8333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet8(i1) { 8335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet8 = i1; 8337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet7(i1) { 8339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet7 = i1; 8341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet6(i1) { 8343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet6 = i1; 8345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet5(i1) { 8347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet5 = i1; 8349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet4(i1) { 8351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet4 = i1; 8353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet3(i1) { 8355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet3 = i1; 8357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet2(i1) { 8359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet2 = i1; 8361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet1(i1) { 8363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet1 = i1; 8365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction setTempRet0(i1) { 8367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier tempRet0 = i1; 8369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction b0(i1) { 8371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier abort(0); 8373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return 0; 8374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction stackSave() { 8376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return STACKTOP | 0; 8377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction b1(i1) { 8379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i1 = i1 | 0; 8380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier abort(1); 8381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction b2() { 8383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier abort(2); 8384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// EMSCRIPTEN_END_FUNCS 8387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var FUNCTION_TABLE_ii = [b0,__ZNKSt9bad_alloc4whatEv]; 8388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var FUNCTION_TABLE_vi = [b1,__ZNSt9bad_allocD2Ev,__ZNSt9bad_allocD0Ev,b1]; 8389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var FUNCTION_TABLE_v = [b2]; 8390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 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, dynCall_ii: dynCall_ii, dynCall_vi: dynCall_vi, dynCall_v: dynCall_v }; 8392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}) 8393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// EMSCRIPTEN_END_ASM 8394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier({ "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, "invoke_ii": invoke_ii, "invoke_vi": invoke_vi, "invoke_v": invoke_v, "_send": _send, "___setErrNo": ___setErrNo, "___cxa_is_number_type": ___cxa_is_number_type, "___cxa_allocate_exception": ___cxa_allocate_exception, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "_fflush": _fflush, "_time": _time, "_pwrite": _pwrite, "__reallyNegative": __reallyNegative, "_sbrk": _sbrk, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_fileno": _fileno, "___resumeException": ___resumeException, "__ZSt18uncaught_exceptionv": __ZSt18uncaught_exceptionv, "_sysconf": _sysconf, "_puts": _puts, "_mkport": _mkport, "_write": _write, "___errno_location": ___errno_location, "__ZNSt9exceptionD2Ev": __ZNSt9exceptionD2Ev, "_fputc": _fputc, "___cxa_throw": ___cxa_throw, "_abort": _abort, "_fwrite": _fwrite, "___cxa_does_inherit": ___cxa_does_inherit, "_fprintf": _fprintf, "__formatString": __formatString, "_fputs": _fputs, "_printf": _printf, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity, "__ZTISt9exception": __ZTISt9exception, "__ZTVN10__cxxabiv120__si_class_type_infoE": __ZTVN10__cxxabiv120__si_class_type_infoE }, buffer); 8395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar _strlen = Module["_strlen"] = asm["_strlen"]; 8396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar _free = Module["_free"] = asm["_free"]; 8397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar _main = Module["_main"] = asm["_main"]; 8398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar _memset = Module["_memset"] = asm["_memset"]; 8399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar _malloc = Module["_malloc"] = asm["_malloc"]; 8400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar _memcpy = Module["_memcpy"] = asm["_memcpy"]; 8401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar runPostSets = Module["runPostSets"] = asm["runPostSets"]; 8402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"]; 8403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"]; 8404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar dynCall_v = Module["dynCall_v"] = asm["dynCall_v"]; 8405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) }; 8407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRuntime.stackSave = function() { return asm['stackSave']() }; 8408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRuntime.stackRestore = function(top) { asm['stackRestore'](top) }; 8409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included 8412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar i64Math = null; 8413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// === Auto-generated postamble setup entry stuff === 8415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (memoryInitializer) { 8417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) { 8418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var data = Module['readBinary'](memoryInitializer); 8419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAPU8.set(data, STATIC_BASE); 8420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier addRunDependency('memory initializer'); 8422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Browser.asyncLoad(memoryInitializer, function(data) { 8423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HEAPU8.set(data, STATIC_BASE); 8424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier removeRunDependency('memory initializer'); 8425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, function(data) { 8426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw 'could not load memory initializer ' + memoryInitializer; 8427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }); 8428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction ExitStatus(status) { 8432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.name = "ExitStatus"; 8433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.message = "Program terminated with exit(" + status + ")"; 8434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier this.status = status; 8435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 8436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierExitStatus.prototype = new Error(); 8437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierExitStatus.prototype.constructor = ExitStatus; 8438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar initialStackTop; 8440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar preloadStartTime = null; 8441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar calledMain = false; 8442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierdependenciesFulfilled = function runCaller() { 8444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) 8445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['calledRun'] && shouldRunNow) run([].concat(Module["arguments"])); 8446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled 8447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['callMain'] = Module.callMain = function callMain(args) { 8450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)'); 8451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); 8452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier args = args || []; 8454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ensureInitRuntime(); 8456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var argc = args.length+1; 8458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function pad() { 8459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < 4-1; i++) { 8460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argv.push(0); 8461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL) ]; 8464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier pad(); 8465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier for (var i = 0; i < argc-1; i = i + 1) { 8466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL)); 8467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier pad(); 8468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argv.push(0); 8470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier argv = allocate(argv, 'i32', ALLOC_NORMAL); 8471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier initialStackTop = STACKTOP; 8473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier try { 8475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var ret = Module['_main'](argc, argv, 0); 8477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // if we're not running an evented main loop, it's time to exit 8480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!Module['noExitRuntime']) { 8481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier exit(ret); 8482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier catch(e) { 8485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (e instanceof ExitStatus) { 8486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // exit() throws this once it's done to make sure execution 8487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // has been stopped completely 8488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else if (e == 'SimulateInfiniteLoop') { 8490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // running an evented main loop, don't immediately exit 8491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['noExitRuntime'] = true; 8492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]); 8495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw e; 8496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } finally { 8498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier calledMain = true; 8499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction run(args) { 8506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier args = args || Module['arguments']; 8507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (preloadStartTime === null) preloadStartTime = Date.now(); 8509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (runDependencies > 0) { 8511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.printErr('run() called, but dependencies remain, so not running'); 8512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return; 8513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier preRun(); 8516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (runDependencies > 0) return; // a preRun added a dependency, run will be called later 8518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame 8519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function doRun() { 8521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening 8522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['calledRun'] = true; 8523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ensureInitRuntime(); 8525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier preMain(); 8527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) { 8529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.printErr('pre-main prep time: ' + (Date.now() - preloadStartTime) + ' ms'); 8530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['_main'] && shouldRunNow) { 8533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['callMain'](args); 8534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier postRun(); 8537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (Module['setStatus']) { 8540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['setStatus']('Running...'); 8541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setTimeout(function() { 8542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier setTimeout(function() { 8543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['setStatus'](''); 8544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1); 8545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!ABORT) doRun(); 8546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }, 1); 8547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 8548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier doRun(); 8549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['run'] = Module.run = run; 8552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction exit(status) { 8554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ABORT = true; 8555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier EXITSTATUS = status; 8556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STACKTOP = initialStackTop; 8557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // exit the runtime 8559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier exitRuntime(); 8560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO We should handle this differently based on environment. 8562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // In the browser, the best we can do is throw an exception 8563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // to halt execution, but in node we could process.exit and 8564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // I'd imagine SM shell would have something equivalent. 8565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // This would let us set a proper exit status (which 8566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // would be great for checking test exit statuses). 8567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // https://github.com/kripken/emscripten/issues/1371 8568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // throw an exception to halt the current execution 8570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw new ExitStatus(status); 8571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['exit'] = Module.exit = exit; 8573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierfunction abort(text) { 8575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (text) { 8576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.print(text); 8577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module.printErr(text); 8578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ABORT = true; 8581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier EXITSTATUS = 1; 8582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier var extra = '\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.'; 8584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier throw 'abort() at ' + stackTrace() + extra; 8586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierModule['abort'] = Module.abort = abort; 8588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// {{PRE_RUN_ADDITIONS}} 8590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (Module['preInit']) { 8592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; 8593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (Module['preInit'].length > 0) { 8594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Module['preInit'].pop()(); 8595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// shouldRunNow refers to calling main(), not run(). 8599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervar shouldRunNow = true; 8600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierif (Module['noInitialRun']) { 8601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier shouldRunNow = false; 8602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 8603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierrun([].concat(Module["arguments"])); 8606