diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jsifier.js | 4 | ||||
-rw-r--r-- | src/library.js | 18 | ||||
-rw-r--r-- | src/library_browser.js | 18 | ||||
-rw-r--r-- | src/library_glut.js | 26 | ||||
-rw-r--r-- | src/library_sdl.js | 6 | ||||
-rw-r--r-- | src/modules.js | 15 | ||||
-rw-r--r-- | src/preamble.js | 2 | ||||
-rw-r--r-- | src/runtime.js | 4 |
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); |