aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jsifier.js4
-rw-r--r--src/library.js18
-rw-r--r--src/library_browser.js18
-rw-r--r--src/library_glut.js26
-rw-r--r--src/library_sdl.js6
-rw-r--r--src/modules.js15
-rw-r--r--src/preamble.js2
-rw-r--r--src/runtime.js4
8 files changed, 49 insertions, 44 deletions
diff --git a/src/jsifier.js b/src/jsifier.js
index 6f40e2d4..9b7e9dc7 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -1228,7 +1228,7 @@ function JSify(data, functionsOnly, givenFunctions) {
}
if (byPointer) {
- ident = 'FUNCTION_TABLE_' + Functions.getSignature(type, argsTypes) + '[' + ident + ']';
+ ident = Functions.getTable(Functions.getSignature(type, argsTypes)) + '[' + ident + ']';
}
return ident + '(' + args.join(', ') + ')';
@@ -1358,7 +1358,7 @@ function JSify(data, functionsOnly, givenFunctions) {
// Load runtime-linked libraries
RUNTIME_LINKED_LIBS.forEach(function(lib) {
- print('eval(Module["read"]("' + lib + '"))(FUNCTION_TABLE.length, this);');
+ print('eval(Module["read"]("' + lib + '"))(' + Functions.getTable('x') + '.length, this);');
});
print(postParts[1]);
diff --git a/src/library.js b/src/library.js
index 5a8a9ae7..88e962fc 100644
--- a/src/library.js
+++ b/src/library.js
@@ -3616,7 +3616,7 @@ LibraryManager.library = {
},
bsearch: function(key, base, num, size, compar) {
- var cmp = FUNCTION_TABLE[compar];
+ var cmp = {{{ Functions.getTable('iii') }}}[compar];
var left = 0;
var right = num;
var mid, test, addr;
@@ -3858,7 +3858,7 @@ LibraryManager.library = {
if (num == 0 || size == 0) return;
// forward calls to the JavaScript sort method
// first, sort the items logically
- comparator = FUNCTION_TABLE[comparator];
+ comparator = {{{ Functions.getTable('iii') }}}[comparator];
var keys = [];
for (var i = 0; i < num; i++) keys.push(i);
keys.sort(function(a, b) {
@@ -4851,7 +4851,7 @@ LibraryManager.library = {
var ptr = {{{ makeGetValue('_llvm_eh_exception.buf', '0', 'void*') }}};
var destructor = {{{ makeGetValue('_llvm_eh_exception.buf', 2 * QUANTUM_SIZE, 'void*') }}};
if (destructor) {
- FUNCTION_TABLE[destructor](ptr);
+ {{{ Functions.getTable('i') }}}[destructor](ptr);
{{{ makeSetValue('_llvm_eh_exception.buf', 2 * QUANTUM_SIZE, '0', 'i32') }}}
}
// Free ptr if it isn't null.
@@ -5510,7 +5510,7 @@ LibraryManager.library = {
}
try {
- var lib_module = eval(lib_data)(FUNCTION_TABLE.length);
+ var lib_module = eval(lib_data)({{{ Functions.getTable('x') }}}.length);
} catch (e) {
#if ASSERTIONS
Module.printErr('Error in loading dynamic library: ' + e);
@@ -5583,9 +5583,9 @@ LibraryManager.library = {
} else {
var result = lib.module[symbol];
if (typeof result == 'function') {
- FUNCTION_TABLE.push(result);
- FUNCTION_TABLE.push(0);
- result = FUNCTION_TABLE.length - 2;
+ {{{ Functions.getTable('x') }}}.push(result);
+ {{{ Functions.getTable('x') }}}.push(0);
+ result = {{{ Functions.getTable('x') }}}.length - 2;
lib.cached_functions = result;
}
return result;
@@ -6486,7 +6486,7 @@ LibraryManager.library = {
pthread_once: function(ptr, func) {
if (!_pthread_once.seen) _pthread_once.seen = {};
if (ptr in _pthread_once.seen) return;
- FUNCTION_TABLE[func]();
+ {{{ Functions.getTable('v') }}}[func]();
_pthread_once.seen[ptr] = 1;
},
@@ -6504,7 +6504,7 @@ LibraryManager.library = {
},
pthread_cleanup_push: function(routine, arg) {
- __ATEXIT__.push({ func: function() { FUNCTION_TABLE[routine](arg) } })
+ __ATEXIT__.push({ func: function() { {{{ Functions.getTable('vi') }}}[routine](arg) } })
_pthread_cleanup_push.level = __ATEXIT__.length;
},
diff --git a/src/library_browser.js b/src/library_browser.js
index 00ee158c..c9c37491 100644
--- a/src/library_browser.js
+++ b/src/library_browser.js
@@ -377,10 +377,10 @@ mergeInto(LibraryManager.library, {
_file.substr(index +1),
_url, true, true,
function() {
- if (onload) FUNCTION_TABLE[onload](file);
+ if (onload) {{{ Functions.getTable('vi') }}}[onload](file);
},
function() {
- if (onerror) FUNCTION_TABLE[onerror](file);
+ if (onerror) {{{ Functions.getTable('vi') }}}[onerror](file);
}
);
},
@@ -395,10 +395,10 @@ mergeInto(LibraryManager.library, {
_file.substr(index +1),
new Uint8Array(data.object.contents), true, true,
function() {
- if (onload) FUNCTION_TABLE[onload](file);
+ if (onload) {{{ Functions.getTable('vi') }}}[onload](file);
},
function() {
- if (onerror) FUNCTION_TABLE[onerror](file);
+ if (onerror) {{{ Functions.getTable('vi') }}}[onerror](file);
},
true // don'tCreateFile - it's already there
);
@@ -417,10 +417,10 @@ mergeInto(LibraryManager.library, {
{{{ makeHEAPView('U8', 'data', 'data + size') }}},
true, true,
function() {
- if (onload) FUNCTION_TABLE[onload](arg, cname);
+ if (onload) {{{ Functions.getTable('vi') }}}[onload](arg, cname);
},
function() {
- if (onerror) FUNCTION_TABLE[onerror](arg);
+ if (onerror) {{{ Functions.getTable('vi') }}}[onerror](arg);
},
true // don'tCreateFile - it's already there
);
@@ -440,7 +440,7 @@ mergeInto(LibraryManager.library, {
emscripten_set_main_loop: function(func, fps, simulateInfiniteLoop) {
Module['noExitRuntime'] = true;
- var jsFunc = FUNCTION_TABLE[func];
+ var jsFunc = {{{ Functions.getTable('v') }}}[func];
Browser.mainLoop.runner = function() {
if (Browser.mainLoop.queue.length > 0) {
var start = Date.now();
@@ -517,12 +517,12 @@ mergeInto(LibraryManager.library, {
},
_emscripten_push_main_loop_blocker: function(func, arg, name) {
- Browser.mainLoop.queue.push({ func: FUNCTION_TABLE[func], arg: arg, name: Pointer_stringify(name), counted: true });
+ Browser.mainLoop.queue.push({ func: {{{ Functions.getTable('vi') }}}[func], arg: arg, name: Pointer_stringify(name), counted: true });
Browser.mainLoop.updateStatus();
},
_emscripten_push_uncounted_main_loop_blocker: function(func, arg, name) {
- Browser.mainLoop.queue.push({ func: FUNCTION_TABLE[func], arg: arg, name: Pointer_stringify(name), counted: false });
+ Browser.mainLoop.queue.push({ func: {{{ Functions.getTable('vi') }}}[func], arg: arg, name: Pointer_stringify(name), counted: false });
Browser.mainLoop.updateStatus();
},
diff --git a/src/library_glut.js b/src/library_glut.js
index 6069b484..5f807c63 100644
--- a/src/library_glut.js
+++ b/src/library_glut.js
@@ -54,11 +54,11 @@ var LibraryGLUT = {
if (GLUT.buttons == 0 && event.target == Module["canvas"] && GLUT.passiveMotionFunc) {
event.preventDefault();
GLUT.saveModifiers(event);
- FUNCTION_TABLE[GLUT.passiveMotionFunc](GLUT.lastX, GLUT.lastY);
+ {{{ Functions.getTable('vii') }}}[GLUT.passiveMotionFunc](GLUT.lastX, GLUT.lastY);
} else if (GLUT.buttons != 0 && GLUT.motionFunc) {
event.preventDefault();
GLUT.saveModifiers(event);
- FUNCTION_TABLE[GLUT.motionFunc](GLUT.lastX, GLUT.lastY);
+ {{{ Functions.getTable('vii') }}}[GLUT.motionFunc](GLUT.lastX, GLUT.lastY);
}
},
@@ -159,7 +159,7 @@ var LibraryGLUT = {
if( GLUT.specialFunc ) {
event.preventDefault();
GLUT.saveModifiers(event);
- FUNCTION_TABLE[GLUT.specialFunc](key, GLUT.lastX, GLUT.lastY);
+ {{{ Functions.getTable('viii') }}}[GLUT.specialFunc](key, GLUT.lastX, GLUT.lastY);
}
}
else
@@ -168,7 +168,7 @@ var LibraryGLUT = {
if( key !== null && GLUT.keyboardFunc ) {
event.preventDefault();
GLUT.saveModifiers(event);
- FUNCTION_TABLE[GLUT.keyboardFunc](key, GLUT.lastX, GLUT.lastY);
+ {{{ Functions.getTable('viii') }}}[GLUT.keyboardFunc](key, GLUT.lastX, GLUT.lastY);
}
}
}
@@ -181,7 +181,7 @@ var LibraryGLUT = {
if(GLUT.specialUpFunc) {
event.preventDefault ();
GLUT.saveModifiers(event);
- FUNCTION_TABLE[GLUT.specialUpFunc](key, GLUT.lastX, GLUT.lastY);
+ {{{ Functions.getTable('viii') }}}[GLUT.specialUpFunc](key, GLUT.lastX, GLUT.lastY);
}
}
else
@@ -190,7 +190,7 @@ var LibraryGLUT = {
if( key !== null && GLUT.keyboardUpFunc ) {
event.preventDefault ();
GLUT.saveModifiers(event);
- FUNCTION_TABLE[GLUT.keyboardUpFunc](key, GLUT.lastX, GLUT.lastY);
+ {{{ Functions.getTable('viii') }}}[GLUT.keyboardUpFunc](key, GLUT.lastX, GLUT.lastY);
}
}
}
@@ -206,7 +206,7 @@ var LibraryGLUT = {
} catch (e) {}
event.preventDefault();
GLUT.saveModifiers(event);
- FUNCTION_TABLE[GLUT.mouseFunc](event['button'], 0/*GLUT_DOWN*/, GLUT.lastX, GLUT.lastY);
+ {{{ Functions.getTable('viiii') }}}[GLUT.mouseFunc](event['button'], 0/*GLUT_DOWN*/, GLUT.lastX, GLUT.lastY);
}
},
@@ -217,7 +217,7 @@ var LibraryGLUT = {
if(GLUT.mouseFunc) {
event.preventDefault();
GLUT.saveModifiers(event);
- FUNCTION_TABLE[GLUT.mouseFunc](event['button'], 1/*GLUT_UP*/, GLUT.lastX, GLUT.lastY);
+ {{{ Functions.getTable('viiii') }}}[GLUT.mouseFunc](event['button'], 1/*GLUT_UP*/, GLUT.lastX, GLUT.lastY);
}
},
@@ -241,7 +241,7 @@ var LibraryGLUT = {
/* Can't call _glutReshapeWindow as that requests cancelling fullscreen. */
if (GLUT.reshapeFunc) {
// console.log("GLUT.reshapeFunc (from FS): " + width + ", " + height);
- FUNCTION_TABLE[GLUT.reshapeFunc](width, height);
+ {{{ Functions.getTable('vii') }}}[GLUT.reshapeFunc](width, height);
}
_glutPostRedisplay();
},
@@ -326,7 +326,7 @@ var LibraryGLUT = {
glutIdleFunc: function(func) {
var callback = function() {
if (GLUT.idleFunc) {
- FUNCTION_TABLE[GLUT.idleFunc]();
+ {{{ Functions.getTable('v') }}}[GLUT.idleFunc]();
window.setTimeout(callback, 0);
}
}
@@ -336,7 +336,7 @@ var LibraryGLUT = {
},
glutTimerFunc: function(msec, func, value) {
- window.setTimeout(function() { FUNCTION_TABLE[func](value); }, msec);
+ window.setTimeout(function() { {{{ Functions.getTable('vi') }}}[func](value); }, msec);
},
glutDisplayFunc: function(func) {
@@ -388,7 +388,7 @@ var LibraryGLUT = {
Browser.setCanvasSize(width, height);
if (GLUT.reshapeFunc) {
// console.log("GLUT.reshapeFunc: " + width + ", " + height);
- FUNCTION_TABLE[GLUT.reshapeFunc](width, height);
+ {{{ Functions.getTable('vii') }}}[GLUT.reshapeFunc](width, height);
}
_glutPostRedisplay();
},
@@ -417,7 +417,7 @@ var LibraryGLUT = {
glutPostRedisplay: function() {
if (GLUT.displayFunc) {
- Browser.requestAnimationFrame(FUNCTION_TABLE[GLUT.displayFunc]);
+ Browser.requestAnimationFrame({{{ Functions.getTable('vi') }}}[GLUT.displayFunc]);
}
},
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 0969f738..62353c59 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -1116,7 +1116,7 @@ var LibrarySDL = {
SDL.audio.bufferSize = totalSamples*2; // hardcoded 16-bit audio
SDL.audio.buffer = _malloc(SDL.audio.bufferSize);
SDL.audio.caller = function() {
- FUNCTION_TABLE[SDL.audio.callback](SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize);
+ {{{ Functions.getTable('viii') }}}[SDL.audio.callback](SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize);
SDL.audio.pushAudio(SDL.audio.buffer, SDL.audio.bufferSize);
};
// Mozilla Audio API. TODO: Other audio APIs
@@ -1408,7 +1408,7 @@ var LibrarySDL = {
audio.pause();
SDL.music.audio = null;
if (SDL.hookMusicFinished) {
- FUNCTION_TABLE[SDL.hookMusicFinished]();
+ {{{ Functions.getTable('v') }}}[SDL.hookMusicFinished]();
}
return 0;
},
@@ -1551,7 +1551,7 @@ var LibrarySDL = {
SDL_AddTimer: function(interval, callback, param) {
return window.setTimeout(function() {
- FUNCTION_TABLE[callback](interval, param);
+ {{{ Functions.getTable('ii') }}}[callback](interval, param);
}, interval);
},
SDL_RemoveTimer: function(id) {
diff --git a/src/modules.js b/src/modules.js
index 232403e8..de84d9e4 100644
--- a/src/modules.js
+++ b/src/modules.js
@@ -251,11 +251,20 @@ var Functions = {
}
},
+ getTable: function(sig) {
+ return ASM_JS ? 'FUNCTION_TABLE_' + sig : 'FUNCTION_TABLE';
+ },
+
// Generate code for function indexing
generateIndexing: function() {
var tables = {};
+ if (ASM_JS) {
+ ['x', 'ii'].forEach(function(sig) { // add some default signatures that are used in the library
+ tables[sig] = zeros(this.nextIndex); // TODO: make them compact
+ });
+ }
for (var ident in this.indexedFunctions) {
- var sig = Functions.implementedFunctions[ident] || Functions.libraryFunctions[ident];
+ var sig = ASM_JS ? Functions.implementedFunctions[ident] || Functions.libraryFunctions[ident] : 'x';
assert(sig, ident);
if (!tables[sig]) tables[sig] = zeros(this.nextIndex); // TODO: make them compact
tables[sig][this.indexedFunctions[ident]] = ident;
@@ -274,9 +283,9 @@ var Functions = {
var indices = table.toString().replace('"', '');
if (BUILD_AS_SHARED_LIB) {
// Shared libraries reuse the parent's function table.
- ret += 'FUNCTION_TABLE.push.apply(FUNCTION_TABLE_' + t + ', [' + indices + ']);\n';
+ ret += Functions.getTable(t) + '.push.apply(' + Functions.getTable(t) + ', [' + indices + ']);\n';
} else {
- ret += 'var FUNCTION_TABLE_' + t + ' = [' + indices + '];\n';
+ ret += 'var ' + Functions.getTable(t) + ' = [' + indices + '];\n';
}
}
Functions.tables = ret;
diff --git a/src/preamble.js b/src/preamble.js
index 931c8f51..4b65a372 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -732,7 +732,7 @@ function callRuntimeCallbacks(callbacks) {
var callback = callbacks.shift();
var func = callback.func;
if (typeof func === 'number') {
- func = FUNCTION_TABLE_v[func]; // void()
+ func = {{{ Functions.getTable('v') }}}[func]; // void()
}
func(callback.arg === undefined ? null : callback.arg);
}
diff --git a/src/runtime.js b/src/runtime.js
index 8c1fbd65..814a91bb 100644
--- a/src/runtime.js
+++ b/src/runtime.js
@@ -311,10 +311,6 @@ var Runtime = {
return ret;
},
- getFunctionTable: function(sig) { // return value, param types e.g. "vid" void (int, double)
- return Module['FUNCTION_TABLE_' + sig];
- },
-
addFunction: function(func, sig) {
assert(sig);
var table = Runtime.getFunctionTable(sig);