aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jsifier.js2
-rw-r--r--src/library_browser.js2
-rw-r--r--src/parseTools.js2
-rw-r--r--src/postamble.js10
-rw-r--r--src/preamble.js41
-rw-r--r--src/settings.js2
-rw-r--r--src/shell.js19
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') {