// === Auto-generated postamble setup entry stuff === var initialStackTop; var inMain; Module['callMain'] = Module.callMain = function callMain(args) { assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)'); assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); args = args || []; ensureInitRuntime(); var argc = args.length+1; function pad() { for (var i = 0; i < {{{ QUANTUM_SIZE }}}-1; i++) { argv.push(0); } } var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL) ]; pad(); for (var i = 0; i < argc-1; i = i + 1) { argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL)); pad(); } argv.push(0); argv = allocate(argv, 'i32', ALLOC_NORMAL); #if BENCHMARK var start = Date.now(); #endif initialStackTop = STACKTOP; inMain = true; var ret; try { ret = Module['_main'](argc, argv, 0); } catch(e) { if (e && typeof e == 'object' && e.type == 'ExitStatus') { // exit() throws this once it's done to make sure execution // has been stopped completely Module.print('Exit Status: ' + e.value); return e.value; } else if (e == 'SimulateInfiniteLoop') { // running an evented main loop, don't immediately exit Module['noExitRuntime'] = true; } else { throw e; } } finally { inMain = false; } #if BENCHMARK Module.realPrint('main() took ' + (Date.now() - start) + ' milliseconds'); #endif // if we're not running an evented main loop, it's time to exit if (!Module['noExitRuntime']) { exit(ret); } } {{GLOBAL_VARS}} function run(args) { args = args || Module['arguments']; if (runDependencies > 0) { Module.printErr('run() called, but dependencies remain, so not running'); return; } preRun(); if (runDependencies > 0) { // a preRun added a dependency, run will be called later return; } function doRun() { ensureInitRuntime(); preMain(); calledRun = true; if (Module['_main'] && shouldRunNow) { Module['callMain'](args); } postRun(); } if (Module['setStatus']) { Module['setStatus']('Running...'); setTimeout(function() { setTimeout(function() { Module['setStatus'](''); }, 1); if (!ABORT) doRun(); }, 1); } else { doRun(); } } Module['run'] = Module.run = run; function exit(status) { ABORT = true; STACKTOP = initialStackTop; // TODO call externally added 'exit' callbacks with the status code. // It'd be nice to provide the same interface for all Module events (e.g. // prerun, premain, postmain). Perhaps an EventEmitter so we can do: // Module.on('exit', function (status) {}); // exit the runtime exitRuntime(); if (inMain) { // if we're still inside the callMain's try/catch, we need to throw an // exception in order to immediately terminate execution. throw { type: 'ExitStatus', value: status }; } } Module['exit'] = Module.exit = exit; function abort(text) { if (text) { Module.print(text); } ABORT = true; throw 'abort() at ' + (new Error().stack); } Module['abort'] = Module.abort = abort; // {{PRE_RUN_ADDITIONS}} if (Module['preInit']) { if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; while (Module['preInit'].length > 0) { Module['preInit'].pop()(); } } // shouldRunNow refers to calling main(), not run(). #if INVOKE_RUN var shouldRunNow = true; #else var shouldRunNow = false; #endif if (Module['noInitialRun']) { shouldRunNow = false; } run(); // {{POST_RUN_ADDITIONS}} #if BUILD_AS_WORKER var buffer = 0, bufferSize = 0; var inWorkerCall = false, workerResponded = false, workerCallbackId = -1; onmessage = function(msg) { var func = Module['_' + msg.data['funcName']]; if (!func) throw 'invalid worker function to call: ' + msg.data['funcName']; var data = msg.data['data']; if (data) { if (!data.byteLength) data = new Uint8Array(data); if (!buffer || bufferSize < data.length) { if (buffer) _free(buffer); bufferSize = data.length; buffer = _malloc(data.length); } HEAPU8.set(data, buffer); } inWorkerCall = true; workerResponded = false; workerCallbackId = msg.data['callbackId']; if (data) { func(buffer, data.length); } else { func(0, 0); } inWorkerCall = false; } #endif