diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jsifier.js | 2 | ||||
-rw-r--r-- | src/library_browser.js | 2 | ||||
-rw-r--r-- | src/parseTools.js | 2 | ||||
-rw-r--r-- | src/postamble.js | 10 | ||||
-rw-r--r-- | src/preamble.js | 41 | ||||
-rw-r--r-- | src/settings.js | 2 | ||||
-rw-r--r-- | src/shell.js | 19 |
7 files changed, 61 insertions, 17 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index ce089334..50030268 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -1524,6 +1524,8 @@ function JSify(data, functionsOnly, givenFunctions) { }); // write out the singleton big memory initialization value print('/* memory initializer */ ' + makePointer(memoryInitialization, null, 'ALLOC_NONE', 'i8', 'TOTAL_STACK', true)); // we assert on TOTAL_STACK == GLOBAL_BASE + } else { + print('/* memory initializer */'); // test purposes } } diff --git a/src/library_browser.js b/src/library_browser.js index 099516a8..c1add740 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -379,7 +379,7 @@ mergeInto(LibraryManager.library, { xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function() { - if (xhr.status == 200) { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 onload(xhr.response); } else { onerror(); diff --git a/src/parseTools.js b/src/parseTools.js index 20049094..7dafbebe 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1560,7 +1560,7 @@ function makePointer(slab, pos, allocator, type, ptr, finalMemoryInitialization) } // JS engines sometimes say array initializers are too large. Work around that by chunking and calling concat to combine at runtime - var chunkSize = 10240; + var chunkSize = JS_CHUNK_SIZE; function chunkify(array) { // break very large slabs into parts var ret = ''; diff --git a/src/postamble.js b/src/postamble.js index dd4f4f37..4b3e831d 100644 --- a/src/postamble.js +++ b/src/postamble.js @@ -2,6 +2,12 @@ // === Auto-generated postamble setup entry stuff === Module.callMain = function callMain(args) { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)'); + + args = args || []; + + ensureInitRuntime(); + var argc = args.length+1; function pad() { for (var i = 0; i < {{{ QUANTUM_SIZE }}}-1; i++) { @@ -70,6 +76,8 @@ function run(args) { } function doRun() { + ensureInitRuntime(); + var ret = 0; calledRun = true; if (Module['_main']) { @@ -112,8 +120,6 @@ if (Module['preInit']) { } } -initRuntime(); - #if INVOKE_RUN var shouldRunNow = true; #else diff --git a/src/preamble.js b/src/preamble.js index 2cff440c..68510e3a 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -718,7 +718,11 @@ var __ATINIT__ = []; // functions called during startup var __ATMAIN__ = []; // functions called when main() is to be run var __ATEXIT__ = []; // functions called during shutdown -function initRuntime() { +var runtimeInitialized = false; + +function ensureInitRuntime() { + if (runtimeInitialized) return; + runtimeInitialized = true; callRuntimeCallbacks(__ATINIT__); } function preMain() { @@ -805,7 +809,7 @@ Math.imul = function(a, b) { // the dependencies are met. var runDependencies = 0; var runDependencyTracking = {}; -var calledRun = false; +var calledInit = false, calledRun = false; var runDependencyWatcher = null; function addRunDependency(id) { runDependencies++; @@ -861,6 +865,12 @@ Module['removeRunDependency'] = removeRunDependency; Module["preloadedImages"] = {}; // maps url to image data Module["preloadedAudios"] = {}; // maps url to audio data +function addPreRun(func) { + if (!Module['preRun']) Module['preRun'] = []; + else if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + Module['preRun'].push(func); +} + #if PGO var PGOMonitor = { called: {}, @@ -874,9 +884,32 @@ var PGOMonitor = { } }; __ATEXIT__.push({ func: function() { PGOMonitor.dump() } }); -if (!Module.preRun) Module.preRun = []; -Module.preRun.push(function() { addRunDependency('pgo') }); +addPreRun(function() { addRunDependency('pgo') }); +#endif + +function loadMemoryInitializer(filename) { + function applyData(data) { +#if USE_TYPED_ARRAYS == 2 + HEAPU8.set(data, TOTAL_STACK); +#else + allocate(data, 'i8', ALLOC_NONE, TOTAL_STACK); #endif + } + + if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) { + // synchronous + applyData(Module['readBinary'](filename)); + } else { + // asynchronous + addPreRun(function() { + Browser.asyncLoad(filename, function(data) { + applyData(data); + }, function(data) { + throw 'could not load memory initializer ' + filename; + }); + }); + } +} // === Body === diff --git a/src/settings.js b/src/settings.js index 6b054443..f9b47228 100644 --- a/src/settings.js +++ b/src/settings.js @@ -357,6 +357,8 @@ var NECESSARY_BLOCKADDRS = []; // List of (function, block) for all block addres var EMIT_GENERATED_FUNCTIONS = 0; // whether to emit the list of generated functions, needed for external JS optimization passes +var JS_CHUNK_SIZE = 10240; // Used as a maximum size before breaking up expressions and lines into smaller pieces + // Compiler debugging options var DEBUG_TAGS_SHOWING = []; // Some useful items: diff --git a/src/shell.js b/src/shell.js index 8c37bf5b..c8f3644a 100644 --- a/src/shell.js +++ b/src/shell.js @@ -24,17 +24,20 @@ if (ENVIRONMENT_IS_NODE) { var nodeFS = require('fs'); var nodePath = require('path'); - Module['read'] = function(filename) { + Module['read'] = function(filename, binary) { filename = nodePath['normalize'](filename); - var ret = nodeFS['readFileSync'](filename).toString(); + var ret = nodeFS['readFileSync'](filename); // The path is absolute if the normalized version is the same as the resolved. if (!ret && filename != nodePath['resolve'](filename)) { filename = path.join(__dirname, '..', 'src', filename); - ret = nodeFS['readFileSync'](filename).toString(); + ret = nodeFS['readFileSync'](filename); } + if (ret && !binary) ret = ret.toString(); return ret; }; + Module['readBinary'] = function(filename) { return Module['read'](filename, true) }; + Module['load'] = function(f) { globalEval(read(f)); }; @@ -48,12 +51,10 @@ if (ENVIRONMENT_IS_SHELL) { Module['print'] = print; if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm - // Polyfill over SpiderMonkey/V8 differences - if (typeof read != 'undefined') { - Module['read'] = read; - } else { - Module['read'] = function(f) { snarf(f) }; - } + Module['read'] = read; + Module['readBinary'] = function(f) { + return read(f, 'binary'); + }; if (!Module['arguments']) { if (typeof scriptArgs != 'undefined') { |