From dbf71f5ccdb6353ba22eed29296861774ccfc088 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Fri, 21 Aug 2020 07:06:04 -0700 Subject: [PATCH 1/3] Part two of dynCall removal This change now passes flags to binaryen to limit the creation of the dynCall functions and removes more internal use of the legacy dynCall functions. See #12002 --- emcc.py | 15 +++-- emscripten.py | 7 +++ src/Fetch.js | 12 ++-- src/embind/embind.js | 38 +++--------- src/library.js | 62 +++++++++++++++++-- src/library_async.js | 4 +- src/library_browser.js | 42 ++++++------- src/library_exceptions.js | 2 +- src/library_glfw.js | 46 +++++++------- src/library_glut.js | 30 ++++----- src/library_html5.js | 58 ++++++++--------- src/library_html5_webgl.js | 2 +- src/library_idbstore.js | 16 ++--- src/library_pthread.js | 2 +- src/library_pthread_stub.js | 3 +- src/library_sdl.js | 12 ++-- src/library_signals.js | 2 +- src/library_sockfs.js | 4 +- src/library_webgpu.js | 10 +-- src/library_websocket.js | 8 +-- src/parseTools.js | 11 ++-- src/postamble_minimal.js | 2 +- src/settings_internal.js | 2 + src/support.js | 27 -------- src/worker.js | 2 +- tests/code_size/hello_webgl2_wasm.json | 12 ++-- tests/code_size/hello_webgl2_wasm2js.json | 8 +-- tests/code_size/hello_webgl_wasm.json | 12 ++-- tests/code_size/hello_webgl_wasm2js.json | 8 +-- tests/code_size/random_printf_wasm2js.json | 4 +- tests/other/metadce/hello_libcxx_O2.exports | 16 ----- .../hello_libcxx_O2_fexceptions.exports | 26 -------- ...xx_O2_fexceptions_DEMANGLE_SUPPORT.exports | 26 -------- tests/other/metadce/hello_world.exports | 4 -- tests/other/metadce/hello_world.funcs | 4 -- tests/other/metadce/hello_world_O1.exports | 2 - tests/other/metadce/hello_world_O1.funcs | 2 - tests/other/metadce/hello_world_O2.exports | 2 - tests/other/metadce/hello_world_O2.funcs | 2 - .../hello_world_O3_MAIN_MODULE_2.exports | 2 - tests/return64bit/testbind_bigint.js | 2 +- tests/test_core.py | 1 + tests/test_other.py | 3 +- tools/ports/sdl2.py | 2 +- tools/shared.py | 2 +- 45 files changed, 250 insertions(+), 309 deletions(-) diff --git a/emcc.py b/emcc.py index c2bf3db5476e6..127f8a550b4f3 100755 --- a/emcc.py +++ b/emcc.py @@ -1267,6 +1267,12 @@ def check(input_file): if shared.Settings.RELOCATABLE: shared.Settings.ALLOW_TABLE_GROWTH = 1 + if shared.Settings.WASM2C or shared.Settings.ASYNCIFY: + # See: https://github.com/emscripten-core/emscripten/issues/12065 + # See: https://github.com/emscripten-core/emscripten/issues/12066 + shared.Settings.USE_LEGACY_DYNCALLS = 1 + shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$getDynCaller'] + # Reconfigure the cache now that settings have been applied. Some settings # such as LTO and SIDE_MODULE/MAIN_MODULE effect which cache directory we use. shared.reconfigure_cache() @@ -1522,7 +1528,7 @@ def check(input_file): 'removeRunDependency', ] - if not shared.Settings.MINIMAL_RUNTIME or (shared.Settings.USE_PTHREADS or shared.Settings.EXIT_RUNTIME): + if not shared.Settings.MINIMAL_RUNTIME or shared.Settings.EXIT_RUNTIME: # MINIMAL_RUNTIME only needs callRuntimeCallbacks in certain cases, but the normal runtime # always does. shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$callRuntimeCallbacks'] @@ -1531,10 +1537,11 @@ def check(input_file): # memalign is used to ensure allocated thread stacks are aligned. shared.Settings.EXPORTED_FUNCTIONS += ['_memalign', '_malloc'] - # dynCall_ii is used to call pthread entry points in worker.js (as + # dynCall is used to call pthread entry points in worker.js (as # metadce does not consider worker.js, which is external, we must - # consider it a user export, i.e., one which can never be removed). - building.user_requested_exports += ['dynCall_ii'] + # consider it an export, i.e., one which can never be removed). + shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$dynCall'] + shared.Settings.EXPORTED_FUNCTIONS += ['dynCall'] if shared.Settings.MINIMAL_RUNTIME: building.user_requested_exports += ['exit'] diff --git a/emscripten.py b/emscripten.py index a488aa821e6d2..0c438c8415be5 100644 --- a/emscripten.py +++ b/emscripten.py @@ -549,6 +549,13 @@ def finalize_wasm(temp_files, infile, outfile, memfile, DEBUG): args.append('-g') if shared.Settings.WASM_BIGINT: args.append('--bigint') + + if not shared.Settings.USE_LEGACY_DYNCALLS: + if shared.Settings.WASM_BIGINT: + args.append('--no-dyncalls') + else: + args.append('--dyncalls-i64') + if shared.Settings.LEGALIZE_JS_FFI != 1: args.append('--no-legalize-javascript-ffi') if not shared.Settings.MEM_INIT_IN_WASM: diff --git a/src/Fetch.js b/src/Fetch.js index 4d6dfcc5f893c..800d9078ab1c1 100644 --- a/src/Fetch.js +++ b/src/Fetch.js @@ -454,12 +454,12 @@ function emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystat #if FETCH_DEBUG console.log('fetch: operation success. e: ' + e); #endif - if (onsuccess) {{{ makeDynCall('vi') }}}(onsuccess, fetch); + if (onsuccess) {{{ makeDynCall('vi', 'onsuccess') }}}(fetch); else if (successcb) successcb(fetch); }; var reportProgress = function(fetch, xhr, e) { - if (onprogress) {{{ makeDynCall('vi') }}}(onprogress, fetch); + if (onprogress) {{{ makeDynCall('vi', 'onprogress') }}}(fetch); else if (progresscb) progresscb(fetch); }; @@ -467,7 +467,7 @@ function emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystat #if FETCH_DEBUG console.error('fetch: operation failed: ' + e); #endif - if (onerror) {{{ makeDynCall('vi') }}}(onerror, fetch); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(fetch); else if (errorcb) errorcb(fetch); }; @@ -475,7 +475,7 @@ function emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystat #if FETCH_DEBUG console.log('fetch: ready state change. e: ' + e); #endif - if (onreadystatechange) {{{ makeDynCall('vi') }}}(onreadystatechange, fetch); + if (onreadystatechange) {{{ makeDynCall('vi', 'onreadystatechange') }}}(fetch); else if (readystatechangecb) readystatechangecb(fetch); }; @@ -495,14 +495,14 @@ function emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystat #if FETCH_DEBUG console.log('fetch: IndexedDB store succeeded.'); #endif - if (onsuccess) {{{ makeDynCall('vi') }}}(onsuccess, fetch); + if (onsuccess) {{{ makeDynCall('vi', 'onsuccess') }}}(fetch); else if (successcb) successcb(fetch); }; var storeError = function(fetch, xhr, e) { #if FETCH_DEBUG console.error('fetch: IndexedDB store failed.'); #endif - if (onsuccess) {{{ makeDynCall('vi') }}}(onsuccess, fetch); + if (onsuccess) {{{ makeDynCall('vi', 'onsuccess') }}}(fetch); else if (successcb) successcb(fetch); }; __emscripten_fetch_cache_data(Fetch.dbInstance, fetch, xhr.response, storeSuccess, storeError); diff --git a/src/embind/embind.js b/src/embind/embind.js index 6f05404cd6f4c..f72a60c8fab0d 100644 --- a/src/embind/embind.js +++ b/src/embind/embind.js @@ -1062,42 +1062,20 @@ var LibraryEmbind = { #endif }, - $embind__requireFunction__deps: ['$readLatin1String', '$throwBindingError'], + $embind__requireFunction__deps: ['$readLatin1String', '$throwBindingError', '$getDynCaller'], $embind__requireFunction: function(signature, rawFunction) { signature = readLatin1String(signature); - function makeDynCaller(dynCall) { -#if DYNAMIC_EXECUTION == 0 - var argCache = [rawFunction]; - return function() { - argCache.length = arguments.length + 1; - for (var i = 0; i < arguments.length; i++) { - argCache[i + 1] = arguments[i]; - } - return dynCall.apply(null, argCache); - }; -#else - var args = []; - for (var i = 1; i < signature.length; ++i) { - args.push('a' + i); - } - - var name = 'dynCall_' + signature + '_' + rawFunction; - var body = 'return function ' + name + '(' + args.join(', ') + ') {\n'; - body += ' return dynCall(rawFunction' + (args.length ? ', ' : '') + args.join(', ') + ');\n'; - body += '};\n'; - - return (new Function('dynCall', 'rawFunction', body))(dynCall, rawFunction); + function makeDynCaller() { +#if !USE_LEGACY_DYNCALLS + if (signature.indexOf('j') == -1) { + return wasmTable.get(rawFunction); + } #endif + return getDynCaller(signature, rawFunction); } -#if MINIMAL_RUNTIME - var dc = asm['dynCall_' + signature]; -#else - var dc = Module['dynCall_' + signature]; -#endif - var fp = makeDynCaller(dc); - + var fp = makeDynCaller(); if (typeof fp !== "function") { throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction); } diff --git a/src/library.js b/src/library.js index 4d2d9efe8aec3..4182dffaf097c 100644 --- a/src/library.js +++ b/src/library.js @@ -3872,7 +3872,7 @@ LibraryManager.library = { var trace = _emscripten_get_callstack_js(); var parts = trace.split('\n'); for (var i = 0; i < parts.length; i++) { - var ret = {{{ makeDynCall('iii') }}}(func, 0, arg); + var ret = {{{ makeDynCall('iii', 'func') }}}(0, arg); if (ret !== 0) return; } }, @@ -3921,7 +3921,7 @@ LibraryManager.library = { emscripten_scan_stack: function(func) { var base = STACK_BASE; // TODO verify this is right on pthreads var end = stackSave(); - {{{ makeDynCall('vii') }}}(func, Math.min(base, end), Math.max(base, end)); + {{{ makeDynCall('vii', 'func') }}}(Math.min(base, end), Math.max(base, end)); }, // misc definitions to avoid unnecessary unresolved symbols being reported @@ -4004,6 +4004,60 @@ LibraryManager.library = { }); }, +#if USE_LEGACY_DYNCALLS || !WASM_BIGINT + $dynCallLegacy: function(sig, ptr, args) { +#if ASSERTIONS + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + if (args && args.length) { + // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. + assert(args.length === sig.substring(1).replace(/j/g, '--').length); + } else { + assert(sig.length == 1); + } +#endif + if (args && args.length) { + return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); + } + return Module['dynCall_' + sig].call(null, ptr); + }, + $dynCall__deps: ['$dynCallLegacy'], + + // Used in library code to get JS function from wasm function pointer. + // All callers should use direct table access where possible and only fall + // back to this function if needed. + $getDynCaller__deps: ['$dynCall'], + $getDynCaller: function(sig, ptr) { +#if !USE_LEGACY_DYNCALLS + assert(sig.indexOf('j') >= 0, 'getDynCaller should only be called with i64 sigs') +#endif + var argCache = []; + return function() { + argCache.length = arguments.length; + for (var i = 0; i < arguments.length; i++) { + argCache[i] = arguments[i]; + } + return dynCall(sig, ptr, argCache); + }; + }, +#endif + + $dynCall: function (sig, ptr, args) { +#if USE_LEGACY_DYNCALLS + return dynCallLegacy(sig, ptr, args); +#else +#if !WASM_BIGINT + // Without WASM_BIGINT support we cannot directly call function with i64 as + // part of thier signature, so we rely the dynCall functions generated by + // wasm-emscripten-finalize + if (sig.indexOf('j') != -1) { + return dynCallLegacy(sig, ptr, args); + } +#endif + + return wasmTable.get(ptr).apply(null, args) +#endif + }, + $callRuntimeCallbacks: function(callbacks) { while(callbacks.length > 0) { var callback = callbacks.shift(); @@ -4014,9 +4068,9 @@ LibraryManager.library = { var func = callback.func; if (typeof func === 'number') { if (callback.arg === undefined) { - dynCall_v(func); + {{{ makeDynCall('v', 'func') }}}(); } else { - dynCall_vi(func, callback.arg); + {{{ makeDynCall('vi', 'func') }}}(callback.arg); } } else { func(callback.arg === undefined ? null : callback.arg); diff --git a/src/library_async.js b/src/library_async.js index 93f9c724f1e7e..a1cecaf41d85a 100644 --- a/src/library_async.js +++ b/src/library_async.js @@ -347,7 +347,7 @@ mergeInto(LibraryManager.library, { Asyncify.afterUnwind = function() { var stackBegin = Asyncify.currData + {{{ C_STRUCTS.asyncify_data_s.__size__ }}}; var stackEnd = HEAP32[Asyncify.currData >> 2]; - {{{ makeDynCall('vii') }}}(func, stackBegin, stackEnd); + {{{ makeDynCall('vii', 'func') }}}(stackBegin, stackEnd); wakeUp(); }; }); @@ -408,7 +408,7 @@ mergeInto(LibraryManager.library, { {{{ makeSetValue('newFiber', C_STRUCTS.emscripten_fiber_s.entry, 0, 'i32') }}}; var userData = {{{ makeGetValue('newFiber', C_STRUCTS.emscripten_fiber_s.user_data, 'i32') }}}; - {{{ makeDynCall('vi') }}}(entryPoint, userData); + {{{ makeDynCall('vi', 'entryPoint') }}}(userData); } else { var asyncifyData = newFiber + {{{ C_STRUCTS.emscripten_fiber_s.asyncify_data }}}; Asyncify.currData = asyncifyData; diff --git a/src/library_browser.js b/src/library_browser.js index d174cdf0e4e37..4dce3af830ffd 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -831,7 +831,7 @@ var LibraryBrowser = { function doCallback(callback) { if (callback) { var stack = stackSave(); - {{{ makeDynCall('vi') }}}(callback, allocate(intArrayFromString(_file), 'i8', ALLOC_STACK)); + {{{ makeDynCall('vi', 'callback') }}}(allocate(intArrayFromString(_file), 'i8', ALLOC_STACK)); stackRestore(stack); } } @@ -861,7 +861,7 @@ var LibraryBrowser = { $funcWrappers: {}, - $getFuncWrapper__deps: ['$funcWrappers'], + $getFuncWrapper__deps: ['$funcWrappers', '$dynCall'], $getFuncWrapper: function(func, sig) { if (!func) return; // on null pointer, return undefined assert(sig); @@ -895,10 +895,10 @@ var LibraryBrowser = { Browser.asyncLoad(UTF8ToString(url), function(byteArray) { var buffer = _malloc(byteArray.length); HEAPU8.set(byteArray, buffer); - {{{ makeDynCall('viii') }}}(onload, arg, buffer, byteArray.length); + {{{ makeDynCall('viii', 'onload') }}}(arg, buffer, byteArray.length); _free(buffer); }, function() { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); }, true /* no need for run dependency, this is async but will not do any prepare etc. step */ ); }, @@ -936,11 +936,11 @@ var LibraryBrowser = { FS.createDataFile( _file.substr(0, index), _file.substr(index + 1), new Uint8Array(/** @type{ArrayBuffer}*/(http.response)), true, true, false); if (onload) { var stack = stackSave(); - {{{ makeDynCall('viii') }}}(onload, handle, arg, allocate(intArrayFromString(_file), 'i8', ALLOC_STACK)); + {{{ makeDynCall('viii', 'onload') }}}(handle, arg, allocate(intArrayFromString(_file), 'i8', ALLOC_STACK)); stackRestore(stack); } } else { - if (onerror) {{{ makeDynCall('viii') }}}(onerror, handle, arg, http.status); + if (onerror) {{{ makeDynCall('viii', 'onerror') }}}(handle, arg, http.status); } delete Browser.wgetRequests[handle]; @@ -948,7 +948,7 @@ var LibraryBrowser = { // ERROR http.onerror = function http_onerror(e) { - if (onerror) {{{ makeDynCall('viii') }}}(onerror, handle, arg, http.status); + if (onerror) {{{ makeDynCall('viii', 'onerror') }}}(handle, arg, http.status); delete Browser.wgetRequests[handle]; }; @@ -956,7 +956,7 @@ var LibraryBrowser = { http.onprogress = function http_onprogress(e) { if (e.lengthComputable || (e.lengthComputable === undefined && e.total != 0)) { var percentComplete = (e.loaded / e.total)*100; - if (onprogress) {{{ makeDynCall('viii') }}}(onprogress, handle, arg, percentComplete); + if (onprogress) {{{ makeDynCall('viii', 'onprogress') }}}(handle, arg, percentComplete); } }; @@ -997,10 +997,10 @@ var LibraryBrowser = { var byteArray = new Uint8Array(/** @type{ArrayBuffer} */(http.response)); var buffer = _malloc(byteArray.length); HEAPU8.set(byteArray, buffer); - if (onload) {{{ makeDynCall('viiii') }}}(onload, handle, arg, buffer, byteArray.length); + if (onload) {{{ makeDynCall('viiii', 'onload') }}}(handle, arg, buffer, byteArray.length); if (free) _free(buffer); } else { - if (onerror) {{{ makeDynCall('viiii') }}}(onerror, handle, arg, http.status, http.statusText); + if (onerror) {{{ makeDynCall('viiii', 'onerror') }}}(handle, arg, http.status, http.statusText); } delete Browser.wgetRequests[handle]; }; @@ -1008,14 +1008,14 @@ var LibraryBrowser = { // ERROR http.onerror = function http_onerror(e) { if (onerror) { - {{{ makeDynCall('viiii') }}}(onerror, handle, arg, http.status, http.statusText); + {{{ makeDynCall('viiii', 'onerror') }}}(handle, arg, http.status, http.statusText); } delete Browser.wgetRequests[handle]; }; // PROGRESS http.onprogress = function http_onprogress(e) { - if (onprogress) {{{ makeDynCall('viiii') }}}(onprogress, handle, arg, e.loaded, e.lengthComputable || e.lengthComputable === undefined ? e.total : 0); + if (onprogress) {{{ makeDynCall('viiii', 'onprogress') }}}(handle, arg, e.loaded, e.lengthComputable || e.lengthComputable === undefined ? e.total : 0); }; // ABORT @@ -1059,10 +1059,10 @@ var LibraryBrowser = { PATH.basename(_file), new Uint8Array(data.object.contents), true, true, function() { - if (onload) {{{ makeDynCall('vi') }}}(onload, file); + if (onload) {{{ makeDynCall('vi', 'onload') }}}(file); }, function() { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, file); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(file); }, true // don'tCreateFile - it's already there ); @@ -1086,10 +1086,10 @@ var LibraryBrowser = { {{{ makeHEAPView('U8', 'data', 'data + size') }}}, true, true, function() { - if (onload) {{{ makeDynCall('vii') }}}(onload, arg, cname); + if (onload) {{{ makeDynCall('vii', 'onload') }}}(arg, cname); }, function() { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); }, true // don'tCreateFile - it's already there ); @@ -1199,7 +1199,7 @@ var LibraryBrowser = { emscripten_set_main_loop__deps: ['$setMainLoop'], emscripten_set_main_loop__docs: '/** @param {number|boolean=} noSetTiming */', emscripten_set_main_loop: function(func, fps, simulateInfiniteLoop, arg, noSetTiming) { - var browserIterationFunc = function() { {{{ makeDynCall('v') }}}(func); }; + var browserIterationFunc = function() { {{{ makeDynCall('v', 'func') }}}(); }; setMainLoop(browserIterationFunc, fps, simulateInfiniteLoop, arg, noSetTiming); }, @@ -1334,7 +1334,7 @@ var LibraryBrowser = { // Runs natively in pthread, no __proxy needed. emscripten_set_main_loop_arg__deps: ['$setMainLoop'], emscripten_set_main_loop_arg: function(func, arg, fps, simulateInfiniteLoop) { - var browserIterationFunc = function() { {{{ makeDynCall('vi') }}}(func, arg); }; + var browserIterationFunc = function() { {{{ makeDynCall('vi', 'func') }}}(arg); }; setMainLoop(browserIterationFunc, fps, simulateInfiniteLoop, arg); }, @@ -1357,7 +1357,7 @@ var LibraryBrowser = { // Runs natively in pthread, no __proxy needed. _emscripten_push_main_loop_blocker: function(func, arg, name) { Browser.mainLoop.queue.push({ func: function() { - {{{ makeDynCall('vi') }}}(func, arg); + {{{ makeDynCall('vi', 'func') }}}(arg); }, name: UTF8ToString(name), counted: true }); Browser.mainLoop.updateStatus(); }, @@ -1365,7 +1365,7 @@ var LibraryBrowser = { // Runs natively in pthread, no __proxy needed. _emscripten_push_uncounted_main_loop_blocker: function(func, arg, name) { Browser.mainLoop.queue.push({ func: function() { - {{{ makeDynCall('vi') }}}(func, arg); + {{{ makeDynCall('vi', 'func') }}}(arg); }, name: UTF8ToString(name), counted: false }); Browser.mainLoop.updateStatus(); }, @@ -1382,7 +1382,7 @@ var LibraryBrowser = { noExitRuntime = true; function wrapper() { - {{{ makeDynCall('vi') }}}(func, arg); + {{{ makeDynCall('vi', 'func') }}}(arg); } if (millis >= 0) { diff --git a/src/library_exceptions.js b/src/library_exceptions.js index 6b81a85851213..878d84c353083 100644 --- a/src/library_exceptions.js +++ b/src/library_exceptions.js @@ -195,7 +195,7 @@ var LibraryExceptions = { var destructor = info.get_destructor(); if (destructor) { // In Wasm, destructors return 'this' as in ARM - {{{ makeDynCall('ii') }}}(destructor, info.excPtr); + {{{ makeDynCall('ii', 'destructor') }}}(info.excPtr); } ___cxa_free_exception(info.excPtr); #if EXCEPTION_DEBUG diff --git a/src/library_glfw.js b/src/library_glfw.js index cecdeeb889ef6..8869b8feda73c 100644 --- a/src/library_glfw.js +++ b/src/library_glfw.js @@ -361,11 +361,11 @@ var LibraryGLFW = { if (charCode == 0 || (charCode >= 0x00 && charCode <= 0x1F)) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.charFunc, charCode, 1); + {{{ makeDynCall('vii', 'GLFW.active.charFunc') }}}(charCode, 1); #endif #if USE_GLFW == 3 - {{{ makeDynCall('vii') }}}(GLFW.active.charFunc, GLFW.active.id, charCode); + {{{ makeDynCall('vii', 'GLFW.active.charFunc') }}}(GLFW.active.id, charCode); #endif }, @@ -383,12 +383,12 @@ var LibraryGLFW = { if (!GLFW.active.keyFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.keyFunc, key, status); + {{{ makeDynCall('vii', 'GLFW.active.keyFunc') }}}(key, status); #endif #if USE_GLFW == 3 if (repeat) status = 2; // GLFW_REPEAT - {{{ makeDynCall('viiiii') }}}(GLFW.active.keyFunc, GLFW.active.id, key, keyCode, status, GLFW.getModBits(GLFW.active)); + {{{ makeDynCall('viiiii', 'GLFW.active.keyFunc') }}}(GLFW.active.id, key, keyCode, status, GLFW.getModBits(GLFW.active)); #endif }, @@ -433,11 +433,11 @@ var LibraryGLFW = { if (event.target != Module["canvas"] || !GLFW.active.cursorPosFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.cursorPosFunc, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('vii', 'GLFW.active.cursorPosFunc') }}}(Browser.mouseX, Browser.mouseY); #endif #if USE_GLFW == 3 - {{{ makeDynCall('vidd') }}}(GLFW.active.cursorPosFunc, GLFW.active.id, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('vidd', 'GLFW.active.cursorPosFunc') }}}(GLFW.active.id, Browser.mouseX, Browser.mouseY); #endif }, @@ -461,7 +461,7 @@ var LibraryGLFW = { if (event.target != Module["canvas"] || !GLFW.active.cursorEnterFunc) return; #if USE_GLFW == 3 - {{{ makeDynCall('vii') }}}(GLFW.active.cursorEnterFunc, GLFW.active.id, 1); + {{{ makeDynCall('vii', 'GLFW.active.cursorEnterFunc') }}}(GLFW.active.id, 1); #endif }, @@ -471,7 +471,7 @@ var LibraryGLFW = { if (event.target != Module["canvas"] || !GLFW.active.cursorEnterFunc) return; #if USE_GLFW == 3 - {{{ makeDynCall('vii') }}}(GLFW.active.cursorEnterFunc, GLFW.active.id, 0); + {{{ makeDynCall('vii', 'GLFW.active.cursorEnterFunc') }}}(GLFW.active.id, 0); #endif }, @@ -496,11 +496,11 @@ var LibraryGLFW = { if (!GLFW.active.mouseButtonFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.mouseButtonFunc, eventButton, status); + {{{ makeDynCall('vii', 'GLFW.active.mouseButtonFunc') }}}(eventButton, status); #endif #if USE_GLFW == 3 - {{{ makeDynCall('viiii') }}}(GLFW.active.mouseButtonFunc, GLFW.active.id, eventButton, status, GLFW.getModBits(GLFW.active)); + {{{ makeDynCall('viiii', 'GLFW.active.mouseButtonFunc') }}}(GLFW.active.id, eventButton, status, GLFW.getModBits(GLFW.active)); #endif }, @@ -523,7 +523,7 @@ var LibraryGLFW = { if (!GLFW.active || !GLFW.active.scrollFunc || event.target != Module['canvas']) return; #if USE_GLFW == 2 - {{{ makeDynCall('vi') }}}(GLFW.active.scrollFunc, GLFW.wheelPos); + {{{ makeDynCall('vi', 'GLFW.active.scrollFunc') }}}(GLFW.wheelPos); #endif #if USE_GLFW == 3 @@ -537,7 +537,7 @@ var LibraryGLFW = { sy = event.deltaY; } - {{{ makeDynCall('vidd') }}}(GLFW.active.scrollFunc, GLFW.active.id, sx, sy); + {{{ makeDynCall('vidd', 'GLFW.active.scrollFunc') }}}(GLFW.active.id, sx, sy); #endif event.preventDefault(); @@ -592,11 +592,11 @@ var LibraryGLFW = { if (!GLFW.active.windowSizeFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.windowSizeFunc, GLFW.active.width, GLFW.active.height); + {{{ makeDynCall('vii', 'GLFW.active.windowSizeFunc') }}}(GLFW.active.width, GLFW.active.height); #endif #if USE_GLFW == 3 - {{{ makeDynCall('viii') }}}(GLFW.active.windowSizeFunc, GLFW.active.id, GLFW.active.width, GLFW.active.height); + {{{ makeDynCall('viii', 'GLFW.active.windowSizeFunc') }}}(GLFW.active.id, GLFW.active.width, GLFW.active.height); #endif }, @@ -606,7 +606,7 @@ var LibraryGLFW = { if (!GLFW.active.framebufferSizeFunc) return; #if USE_GLFW == 3 - {{{ makeDynCall('viii') }}}(GLFW.active.framebufferSizeFunc, GLFW.active.id, GLFW.active.width, GLFW.active.height); + {{{ makeDynCall('viii', 'GLFW.active.framebufferSizeFunc') }}}(GLFW.active.id, GLFW.active.width, GLFW.active.height); #endif }, @@ -656,7 +656,7 @@ var LibraryGLFW = { }; if (GLFW.joystickFunc) { - {{{ makeDynCall('vii') }}}(GLFW.joystickFunc, joy, 0x00040001); // GLFW_CONNECTED + {{{ makeDynCall('vii', 'GLFW.joystickFunc') }}}(joy, 0x00040001); // GLFW_CONNECTED } } @@ -674,7 +674,7 @@ var LibraryGLFW = { console.log('glfw joystick disconnected',joy); if (GLFW.joystickFunc) { - {{{ makeDynCall('vii') }}}(GLFW.joystickFunc, joy, 0x00040002); // GLFW_DISCONNECTED + {{{ makeDynCall('vii', 'GLFW.joystickFunc') }}}(joy, 0x00040002); // GLFW_DISCONNECTED } _free(GLFW.joys[joy].id); @@ -765,7 +765,7 @@ var LibraryGLFW = { var data = e.target.result; FS.writeFile(path, new Uint8Array(data)); if (++written === count) { - {{{ makeDynCall('viii') }}}(GLFW.active.dropFunc, GLFW.active.id, count, filenames); + {{{ makeDynCall('viii', 'GLFW.active.dropFunc') }}}(GLFW.active.id, count, filenames); for (var i = 0; i < filenamesArray.length; ++i) { _free(filenamesArray[i]); @@ -807,7 +807,7 @@ var LibraryGLFW = { // function returns. // GLFW3 on the over hand doesn't have this behavior (https://github.com/glfw/glfw/issues/62). if (!win.windowSizeFunc) return null; - {{{ makeDynCall('vii') }}}(win.windowSizeFunc, win.width, win.height); + {{{ makeDynCall('vii', 'win.windowSizeFunc') }}}(win.width, win.height); #endif return prevcbfun; @@ -969,11 +969,11 @@ var LibraryGLFW = { if (!win.windowSizeFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(win.windowSizeFunc, width, height); + {{{ makeDynCall('vii', 'win.windowSizeFunc') }}}(width, height); #endif #if USE_GLFW == 3 - {{{ makeDynCall('viii') }}}(win.windowSizeFunc, win.id, width, height); + {{{ makeDynCall('viii', 'win.windowSizeFunc') }}}(win.id, width, height); #endif }, @@ -1037,7 +1037,7 @@ var LibraryGLFW = { #if USE_GLFW == 3 if (win.windowCloseFunc) - {{{ makeDynCall('vi') }}}(win.windowCloseFunc, win.id); + {{{ makeDynCall('vi', 'win.windowCloseFunc') }}}(win.id); #endif GLFW.windows[win.id - 1] = null; @@ -1750,7 +1750,7 @@ var LibraryGLFW = { }, glfwCreateThread: function(fun, arg) { - {{{ makeDynCall('vi') }}}(str, fun, arg); + {{{ makeDynCall('vi', 'str') }}}(fun, arg); // One single thread return 0; }, diff --git a/src/library_glut.js b/src/library_glut.js index 350889cb61f98..23e524430acdb 100644 --- a/src/library_glut.js +++ b/src/library_glut.js @@ -55,11 +55,11 @@ var LibraryGLUT = { if (GLUT.buttons == 0 && event.target == Module["canvas"] && GLUT.passiveMotionFunc) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('vii') }}}(GLUT.passiveMotionFunc, lastX, lastY); + {{{ makeDynCall('vii', 'GLUT.passiveMotionFunc') }}}(lastX, lastY); } else if (GLUT.buttons != 0 && GLUT.motionFunc) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('vii') }}}(GLUT.motionFunc, lastX, lastY); + {{{ makeDynCall('vii', 'GLUT.motionFunc') }}}(lastX, lastY); } }, @@ -167,7 +167,7 @@ var LibraryGLUT = { if( GLUT.specialFunc ) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viii') }}}(GLUT.specialFunc, key, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viii', 'GLUT.specialFunc') }}}(key, Browser.mouseX, Browser.mouseY); } } else @@ -176,7 +176,7 @@ var LibraryGLUT = { if( key !== null && GLUT.keyboardFunc ) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viii') }}}(GLUT.keyboardFunc, key, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viii', 'GLUT.keyboardFunc') }}}(key, Browser.mouseX, Browser.mouseY); } } } @@ -189,7 +189,7 @@ var LibraryGLUT = { if(GLUT.specialUpFunc) { event.preventDefault (); GLUT.saveModifiers(event); - {{{ makeDynCall('viii') }}}(GLUT.specialUpFunc, key, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viii', 'GLUT.specialUpFunc') }}}(key, Browser.mouseX, Browser.mouseY); } } else @@ -198,7 +198,7 @@ var LibraryGLUT = { if( key !== null && GLUT.keyboardUpFunc ) { event.preventDefault (); GLUT.saveModifiers(event); - {{{ makeDynCall('viii') }}}(GLUT.keyboardUpFunc, key, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viii', 'GLUT.keyboardUpFunc') }}}(key, Browser.mouseX, Browser.mouseY); } } } @@ -241,7 +241,7 @@ var LibraryGLUT = { } catch (e) {} event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viiii') }}}(GLUT.mouseFunc, event['button'], 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viiii', 'GLUT.mouseFunc') }}}(event['button'], 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY); } }, @@ -253,7 +253,7 @@ var LibraryGLUT = { if (GLUT.mouseFunc) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viiii') }}}(GLUT.mouseFunc, event['button'], 1/*GLUT_UP*/, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viiii', 'GLUT.mouseFunc') }}}(event['button'], 1/*GLUT_UP*/, Browser.mouseX, Browser.mouseY); } }, @@ -274,7 +274,7 @@ var LibraryGLUT = { if (GLUT.mouseFunc) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viiii') }}}(GLUT.mouseFunc, button, 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viiii', 'GLUT.mouseFunc') }}}(button, 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY); } }, @@ -299,7 +299,7 @@ var LibraryGLUT = { /* Can't call _glutReshapeWindow as that requests cancelling fullscreen. */ if (GLUT.reshapeFunc) { // console.log("GLUT.reshapeFunc (from FS): " + width + ", " + height); - {{{ makeDynCall('vii') }}}(GLUT.reshapeFunc, width, height); + {{{ makeDynCall('vii', 'GLUT.reshapeFunc') }}}(width, height); } _glutPostRedisplay(); } @@ -344,7 +344,7 @@ var LibraryGLUT = { Browser.resizeListeners.push(function(width, height) { if (GLUT.reshapeFunc) { - {{{ makeDynCall('vii') }}}(GLUT.reshapeFunc, width, height); + {{{ makeDynCall('vii', 'GLUT.reshapeFunc') }}}(width, height); } }); @@ -426,7 +426,7 @@ var LibraryGLUT = { glutIdleFunc: function(func) { function callback() { if (GLUT.idleFunc) { - {{{ makeDynCall('v') }}}(GLUT.idleFunc); + {{{ makeDynCall('v', 'GLUT.idleFunc') }}}(); Browser.safeSetTimeout(callback, 4); // HTML spec specifies a 4ms minimum delay on the main thread; workers might get more, but we standardize here } } @@ -439,7 +439,7 @@ var LibraryGLUT = { glutTimerFunc__proxy: 'sync', glutTimerFunc__sig: 'viii', glutTimerFunc: function(msec, func, value) { - Browser.safeSetTimeout(function() { {{{ makeDynCall('vi') }}}(func, value); }, msec); + Browser.safeSetTimeout(function() { {{{ makeDynCall('vi', 'func') }}}(value); }, msec); }, glutDisplayFunc__proxy: 'sync', @@ -607,7 +607,7 @@ var LibraryGLUT = { Browser.setCanvasSize(width, height, true); // N.B. GLUT.reshapeFunc is also registered as a canvas resize callback. // Just call it once here. if (GLUT.reshapeFunc) { - {{{ makeDynCall('vii') }}}(GLUT.reshapeFunc, width, height); + {{{ makeDynCall('vii', 'GLUT.reshapeFunc') }}}(width, height); } _glutPostRedisplay(); }, @@ -653,7 +653,7 @@ var LibraryGLUT = { Browser.requestAnimationFrame(function() { GLUT.requestedAnimationFrame = false; Browser.mainLoop.runIter(function() { - {{{ makeDynCall('v') }}}(GLUT.displayFunc); + {{{ makeDynCall('v', 'GLUT.displayFunc') }}}(); }); }); } diff --git a/src/library_html5.js b/src/library_html5.js index 6268930a9bff3..77594bd292f6a 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -271,7 +271,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, keyEventData, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, keyEventData, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, keyEventData, userData)) e.preventDefault(); }; var eventHandler = { @@ -523,7 +523,7 @@ var LibraryJSEvents = { JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, mouseEventData, userData); } else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -651,7 +651,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, wheelEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, wheelEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, wheelEvent, userData)) e.preventDefault(); }; #if MIN_IE_VERSION <= 8 || MIN_SAFARI_VERSION < 60100 // Browsers that do not support https://caniuse.com/#feat=mdn-api_wheelevent // The 'mousewheel' event as implemented in Safari 6.0.5 @@ -664,7 +664,7 @@ var LibraryJSEvents = { {{{ makeSetValue('JSEvents.wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaY, 'wheelDeltaY', 'double') }}}; {{{ makeSetValue('JSEvents.wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaZ, '0 /* Not available */', 'double') }}}; {{{ makeSetValue('JSEvents.wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaMode, '0 /* DOM_DELTA_PIXEL */', 'i32') }}}; - var shouldCancel = {{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, JSEvents.wheelEvent, userData); + var shouldCancel = {{{ makeDynCall('iiii', 'callbackfunc') }}}( eventTypeId, JSEvents.wheelEvent, userData); if (shouldCancel) { e.preventDefault(); } @@ -752,7 +752,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, uiEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, uiEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, uiEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -806,7 +806,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, focusEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, focusEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, focusEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -878,7 +878,7 @@ var LibraryJSEvents = { JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, deviceOrientationEvent, userData); } else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, JSEvents.deviceOrientationEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceOrientationEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -953,7 +953,7 @@ var LibraryJSEvents = { JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, deviceMotionEvent, userData); } else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, JSEvents.deviceMotionEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceMotionEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -1028,7 +1028,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, orientationChangeEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, orientationChangeEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, orientationChangeEvent, userData)) e.preventDefault(); }; if (eventTypeString == "orientationchange" && screen.mozOrientation !== undefined) { @@ -1152,7 +1152,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, fullscreenChangeEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -1237,7 +1237,7 @@ var LibraryJSEvents = { if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', 'strategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; @@ -1389,7 +1389,7 @@ var LibraryJSEvents = { if (__currentFullscreenStrategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(__currentFullscreenStrategy.canvasResizedCallbackTargetThread, __currentFullscreenStrategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(__currentFullscreenStrategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', '__currentFullscreenStrategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); } } } @@ -1517,7 +1517,7 @@ var LibraryJSEvents = { if (__currentFullscreenStrategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(__currentFullscreenStrategy.canvasResizedCallbackTargetThread, __currentFullscreenStrategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(__currentFullscreenStrategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', '__currentFullscreenStrategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); } }, @@ -1641,7 +1641,7 @@ var LibraryJSEvents = { if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', 'strategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); } __currentFullscreenStrategy = 0; } @@ -1655,7 +1655,7 @@ var LibraryJSEvents = { if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', 'strategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; @@ -1736,7 +1736,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, pointerlockChangeEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -1785,7 +1785,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, 0, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, 0, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, 0, userData)) e.preventDefault(); }; var eventHandler = { @@ -1994,7 +1994,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, visibilityChangeEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, visibilityChangeEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, visibilityChangeEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -2116,7 +2116,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, touchEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, touchEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, touchEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -2214,7 +2214,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, gamepadEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, gamepadEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, gamepadEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -2295,7 +2295,7 @@ var LibraryJSEvents = { var e = ev || event; // Note: This is always called on the main browser thread, since it needs synchronously return a value! - var confirmationMessage = {{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, 0, userData); + var confirmationMessage = {{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, 0, userData); if (confirmationMessage) { confirmationMessage = UTF8ToString(confirmationMessage); @@ -2359,7 +2359,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, batteryEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, batteryEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, batteryEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -2648,7 +2648,7 @@ var LibraryJSEvents = { emscripten_request_animation_frame: function(cb, userData) { return requestAnimationFrame(function(timeStamp) { - {{{ makeDynCall('idi') }}}(cb, timeStamp, userData); + {{{ makeDynCall('idi', 'cb') }}}(timeStamp, userData); }); }, @@ -2658,7 +2658,7 @@ var LibraryJSEvents = { emscripten_request_animation_frame_loop: function(cb, userData) { function tick(timeStamp) { - if ({{{ makeDynCall('idi') }}}(cb, timeStamp, userData)) { + if ({{{ makeDynCall('idi', 'cb') }}}(timeStamp, userData)) { requestAnimationFrame(tick); } } @@ -2694,7 +2694,7 @@ var LibraryJSEvents = { emscripten_set_immediate: function(cb, userData) { polyfillSetImmediate(); return setImmediate(function() { - {{{ makeDynCall('vi') }}}(cb, userData); + {{{ makeDynCall('vi', 'cb') }}}(userData); }); }, @@ -2706,7 +2706,7 @@ var LibraryJSEvents = { emscripten_set_immediate_loop: function(cb, userData) { polyfillSetImmediate(); function tick() { - if ({{{ makeDynCall('ii') }}}(cb, userData)) { + if ({{{ makeDynCall('ii', 'cb') }}}(userData)) { setImmediate(tick); } } @@ -2715,7 +2715,7 @@ var LibraryJSEvents = { emscripten_set_timeout: function(cb, msecs, userData) { return setTimeout(function() { - {{{ makeDynCall('vi') }}}(cb, userData); + {{{ makeDynCall('vi', 'cb') }}}(userData); }, msecs); }, @@ -2727,7 +2727,7 @@ var LibraryJSEvents = { function tick() { var t = performance.now(); var n = t + msecs; - if ({{{ makeDynCall('idi') }}}(cb, t, userData)) { + if ({{{ makeDynCall('idi', 'cb') }}}(t, userData)) { setTimeout(tick, #if WASM // Save a little bit of code space: modern browsers should treat negative setTimeout as timeout of 0 (https://stackoverflow.com/questions/8430966/is-calling-settimeout-with-a-negative-delay-ok) @@ -2744,7 +2744,7 @@ var LibraryJSEvents = { emscripten_set_interval: function(cb, msecs, userData) { return setInterval(function() { - {{{ makeDynCall('vi') }}}(cb, userData) + {{{ makeDynCall('vi', 'cb') }}}(userData) }, msecs); }, diff --git a/src/library_html5_webgl.js b/src/library_html5_webgl.js index 84cd712cc42c0..05aeb14c02577 100644 --- a/src/library_html5_webgl.js +++ b/src/library_html5_webgl.js @@ -399,7 +399,7 @@ var LibraryHtml5WebGL = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, 0, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, 0, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, 0, userData)) e.preventDefault(); }; var eventHandler = { diff --git a/src/library_idbstore.js b/src/library_idbstore.js index d407710a7c3c2..fe9c13ce65bdc 100644 --- a/src/library_idbstore.js +++ b/src/library_idbstore.js @@ -17,12 +17,12 @@ var LibraryIDBStore = { emscripten_idb_async_load: function(db, id, arg, onload, onerror) { IDBStore.getFile(UTF8ToString(db), UTF8ToString(id), function(error, byteArray) { if (error) { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); return; } var buffer = _malloc(byteArray.length); HEAPU8.set(byteArray, buffer); - {{{ makeDynCall('viii') }}}(onload, arg, buffer, byteArray.length); + {{{ makeDynCall('viii', 'onload') }}}(arg, buffer, byteArray.length); _free(buffer); }); }, @@ -30,28 +30,28 @@ var LibraryIDBStore = { // note that we copy the data here, as these are async operatins - changes to HEAPU8 meanwhile should not affect us! IDBStore.setFile(UTF8ToString(db), UTF8ToString(id), new Uint8Array(HEAPU8.subarray(ptr, ptr+num)), function(error) { if (error) { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); return; } - if (onstore) {{{ makeDynCall('vi') }}}(onstore, arg); + if (onstore) {{{ makeDynCall('vi', 'onstore') }}}(arg); }); }, emscripten_idb_async_delete: function(db, id, arg, ondelete, onerror) { IDBStore.deleteFile(UTF8ToString(db), UTF8ToString(id), function(error) { if (error) { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); return; } - if (ondelete) {{{ makeDynCall('vi') }}}(ondelete, arg); + if (ondelete) {{{ makeDynCall('vi', 'ondelete') }}}(arg); }); }, emscripten_idb_async_exists: function(db, id, arg, oncheck, onerror) { IDBStore.existsFile(UTF8ToString(db), UTF8ToString(id), function(error, exists) { if (error) { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); return; } - if (oncheck) {{{ makeDynCall('vii') }}}(oncheck, arg, exists); + if (oncheck) {{{ makeDynCall('vii', 'oncheck') }}}(arg, exists); }); }, diff --git a/src/library_pthread.js b/src/library_pthread.js index 5d2ce5d188ce8..1f43053726570 100644 --- a/src/library_pthread.js +++ b/src/library_pthread.js @@ -1093,7 +1093,7 @@ var LibraryPThread = { pthread_cleanup_push__sig: 'vii', pthread_cleanup_push: function(routine, arg) { - PThread.threadExitHandlers.push(function() { {{{ makeDynCall('vi') }}}(routine, arg) }); + PThread.threadExitHandlers.push(function() { {{{ makeDynCall('vi', 'routine') }}}(arg) }); }, pthread_cleanup_pop: function(execute) { diff --git a/src/library_pthread_stub.js b/src/library_pthread_stub.js index a91fe938cc17f..4ae3e5864d5b7 100644 --- a/src/library_pthread_stub.js +++ b/src/library_pthread_stub.js @@ -71,9 +71,10 @@ var LibraryPThreadStub = { pthread_setcancelstate: function() { return 0; }, pthread_setcanceltype: function() { return 0; }, + pthread_cleanup_push__deps: ['$makeDynCaller'], pthread_cleanup_push__sig: 'vii', pthread_cleanup_push: function(routine, arg) { - __ATEXIT__.push(function() { {{{ makeDynCall('vi') }}}(routine, arg) }) + __ATEXIT__.push(function() { {{{ makeDynCall('vi', 'routine') }}}(arg) }) _pthread_cleanup_push.level = __ATEXIT__.length; }, diff --git a/src/library_sdl.js b/src/library_sdl.js index 4032dbb278f41..d312e5394c73b 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -873,7 +873,7 @@ var LibrarySDL = { if (!SDL.eventHandler) return; while (SDL.pollEvent(SDL.eventHandlerTemp)) { - {{{ makeDynCall('iii') }}}(SDL.eventHandler, SDL.eventHandlerContext, SDL.eventHandlerTemp); + {{{ makeDynCall('iii', 'SDL.eventHandler') }}}(SDL.eventHandlerContext, SDL.eventHandlerTemp); } }, @@ -2498,7 +2498,7 @@ var LibrarySDL = { if (secsUntilNextPlayStart >= SDL.audio.bufferingDelay + SDL.audio.bufferDurationSecs*SDL.audio.numSimultaneouslyQueuedBuffers) return; // Ask SDL audio data from the user code. - {{{ makeDynCall('viii') }}}(SDL.audio.callback, SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize); + {{{ makeDynCall('viii', 'SDL.audio.callback') }}}(SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize); // And queue it to be played after the currently playing audio stream. SDL.audio.pushAudio(SDL.audio.buffer, SDL.audio.bufferSize); } @@ -2966,7 +2966,7 @@ var LibrarySDL = { } audio['onended'] = function SDL_audio_onended() { // TODO: cache these if (channelInfo.audio == this) { channelInfo.audio.paused = true; channelInfo.audio = null; } - if (SDL.channelFinished) {{{ makeDynCall('vi') }}}(SDL.channelFinished, channel); + if (SDL.channelFinished) {{{ makeDynCall('vi', 'SDL.channelFinished') }}}(channel); } channelInfo.audio = audio; // TODO: handle N loops. Behavior matches Mix_PlayMusic @@ -2991,7 +2991,7 @@ var LibrarySDL = { info.audio = null; } if (SDL.channelFinished) { - {{{ makeDynCall('vi') }}}(SDL.channelFinished, channel); + {{{ makeDynCall('vi', 'SDL.channelFinished') }}}(channel); } } if (channel != -1) { @@ -3088,7 +3088,7 @@ var LibrarySDL = { } SDL.music.audio = null; if (SDL.hookMusicFinished) { - {{{ makeDynCall('v') }}}(SDL.hookMusicFinished); + {{{ makeDynCall('v', 'SDL.hookMusicFinished') }}}(); } return 0; }, @@ -3719,7 +3719,7 @@ var LibrarySDL = { SDL_AddTimer__sig: 'iiii', SDL_AddTimer: function(interval, callback, param) { return window.setTimeout(function() { - {{{ makeDynCall('iii') }}}(callback, interval, param); + {{{ makeDynCall('iii', 'callback') }}}(interval, param); }, interval); }, SDL_RemoveTimer__proxy: 'sync', diff --git a/src/library_signals.js b/src/library_signals.js index 152763f3e2516..a46553e5d1bfa 100644 --- a/src/library_signals.js +++ b/src/library_signals.js @@ -108,7 +108,7 @@ var funs = { alarm__deps: ['_sigalrm_handler'], alarm: function(seconds) { setTimeout(function() { - if (__sigalrm_handler) {{{ makeDynCall('vi') }}}(__sigalrm_handler, 0); + if (__sigalrm_handler) {{{ makeDynCall('vi', '__sigalrm_handler') }}}(0); }, seconds*1000); }, ualarm: function() { diff --git a/src/library_sockfs.js b/src/library_sockfs.js index 36985f9b823f3..4e7bf3ef44ddd 100644 --- a/src/library_sockfs.js +++ b/src/library_sockfs.js @@ -738,10 +738,10 @@ mergeInto(LibraryManager.library, { if (event === 'error') { var sp = stackSave(); var msg = allocate(intArrayFromString(data[2]), 'i8', ALLOC_STACK); - {{{ makeDynCall('viiii') }}}(callback, data[0], data[1], msg, userData); + {{{ makeDynCall('viiii', 'callback') }}}(data[0], data[1], msg, userData); stackRestore(sp); } else { - {{{ makeDynCall('vii') }}}(callback, data, userData); + {{{ makeDynCall('vii', 'callback') }}}(data, userData); } } catch (e) { if (e instanceof ExitStatus) { diff --git a/src/library_webgpu.js b/src/library_webgpu.js index 0a3adf1799352..bade54c5468af 100644 --- a/src/library_webgpu.js +++ b/src/library_webgpu.js @@ -1018,7 +1018,7 @@ var LibraryWebGPU = { if (ev.error instanceof GPUValidationError) type = Validation; else if (ev.error instanceof GPUOutOfMemoryError) type = OutOfMemory; var messagePtr = allocateUTF8(ev.error.message); - {{{ makeDynCall('viii') }}}(callback, type, messagePtr, userdata); + {{{ makeDynCall('viii', 'callback') }}}(type, messagePtr, userdata); _free(messagePtr); }; }, @@ -1031,9 +1031,9 @@ var LibraryWebGPU = { var completionValue = {{{ gpu.makeU64ToNumber('completionValue_low', 'completionValue_high') }}}; fence.onCompletion(completionValue).then(function() { - {{{ makeDynCall('vii') }}}(callback, 0 /* WEBGPU_FENCE_COMPLETION_STATUS_SUCCESS */, userdata); + {{{ makeDynCall('vii', 'callback') }}}(0 /* WEBGPU_FENCE_COMPLETION_STATUS_SUCCESS */, userdata); }, function() { - {{{ makeDynCall('vii') }}}(callback, 1 /* WEBGPU_FENCE_COMPLETION_STATUS_ERROR */, userdata); + {{{ makeDynCall('vii', 'callback') }}}(1 /* WEBGPU_FENCE_COMPLETION_STATUS_ERROR */, userdata); }); }, @@ -1374,10 +1374,10 @@ var LibraryWebGPU = { // `callback` takes (WGPUBufferMapAsyncStatus status, void * userdata) buffer["mapAsync"](mode, offset, size).then(function() { - {{{ makeDynCall('vii') }}}(callback, 0 /* WGPUBufferMapAsyncStatus_Success */, userdata); + {{{ makeDynCall('vii', 'callback') }}}(0 /* WGPUBufferMapAsyncStatus_Success */, userdata); }, function() { // TODO(kainino0x): Figure out how to pick other error status values. - {{{ makeDynCall('vii') }}}(callback, 1 /* WGPUBufferMapAsyncStatus_Error */, userdata); + {{{ makeDynCall('vii', 'callback') }}}(1 /* WGPUBufferMapAsyncStatus_Error */, userdata); }); }, diff --git a/src/library_websocket.js b/src/library_websocket.js index e98deb0c7390f..55b024c28a3c4 100644 --- a/src/library_websocket.js +++ b/src/library_websocket.js @@ -153,7 +153,7 @@ var LibraryWebSocket = { console.error('websocket event "open": socketId='+socketId+',userData='+userData+',callbackFunc='+callbackFunc+')'); #endif HEAPU32[WS.socketEvent>>2] = socketId; - {{{ makeDynCall('iiii') }}}(callbackFunc, 0/*TODO*/, WS.socketEvent, userData); + {{{ makeDynCall('iiii', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, @@ -180,7 +180,7 @@ var LibraryWebSocket = { console.error('websocket event "error": socketId='+socketId+',userData='+userData+',callbackFunc='+callbackFunc+')'); #endif HEAPU32[WS.socketEvent>>2] = socketId; - {{{ makeDynCall('iiii') }}}(callbackFunc, 0/*TODO*/, WS.socketEvent, userData); + {{{ makeDynCall('iiii', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, @@ -210,7 +210,7 @@ var LibraryWebSocket = { HEAPU32[(WS.socketEvent+4)>>2] = e.wasClean; HEAPU32[(WS.socketEvent+8)>>2] = e.code; stringToUTF8(e.reason, HEAPU32[(WS.socketEvent+10)>>2], 512); - {{{ makeDynCall('iiii') }}}(callbackFunc, 0/*TODO*/, WS.socketEvent, userData); + {{{ makeDynCall('iiii', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, @@ -264,7 +264,7 @@ var LibraryWebSocket = { } HEAPU32[(WS.socketEvent+4)>>2] = buf; HEAPU32[(WS.socketEvent+8)>>2] = len; - {{{ makeDynCall('iiii') }}}(callbackFunc, 0/*TODO*/, WS.socketEvent, userData); + {{{ makeDynCall('iiii', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData); _free(buf); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; diff --git a/src/parseTools.js b/src/parseTools.js index fd91713694a5d..66263c9ce7fd8 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1454,10 +1454,13 @@ function asmFFICoercion(value, type) { return value; } -function makeDynCall(sig) { - // TODO(sbc): Should this be: exportedAsmFunc('dynCall_' + sig); - // See https://github.com/emscripten-core/emscripten/pull/11991; - return 'dynCall_' + sig; +function makeDynCall(sig, funcPtr) { + assert(sig.indexOf('j') == -1); + if (USE_LEGACY_DYNCALLS) { + return `getDynCaller("${sig}", ${funcPtr})`; + } else { + return `wasmTable.get(${funcPtr})`; + } } function heapAndOffset(heap, ptr) { // given HEAP8, ptr , we return splitChunk, relptr diff --git a/src/postamble_minimal.js b/src/postamble_minimal.js index 2964b0974412c..6b944363bd67b 100644 --- a/src/postamble_minimal.js +++ b/src/postamble_minimal.js @@ -56,7 +56,7 @@ function initRuntime(asm) { // Export needed variables that worker.js needs to Module. Module['_emscripten_tls_init'] = _emscripten_tls_init; Module['HEAPU32'] = HEAPU32; - Module['dynCall_ii'] = dynCall_ii; + Module['dynCall'] = dynCall; Module['registerPthreadPtr'] = registerPthreadPtr; Module['_pthread_self'] = _pthread_self; diff --git a/src/settings_internal.js b/src/settings_internal.js index 2b15c469a2293..6fb20d17b9455 100644 --- a/src/settings_internal.js +++ b/src/settings_internal.js @@ -201,3 +201,5 @@ var EXPECT_MAIN = 1; // Provide and export a .ready() Promise. This is currently used by default with // MODULARIZE, and returned from the factory function. var EXPORT_READY_PROMISE = 1; + +var USE_LEGACY_DYNCALLS = 0; diff --git a/src/support.js b/src/support.js index b2ca86267e9b1..09e798b052090 100644 --- a/src/support.js +++ b/src/support.js @@ -571,33 +571,6 @@ function makeBigInt(low, high, unsigned) { return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); } -/** @param {Array=} args */ -function dynCall(sig, ptr, args) { -#if !WASM_BIGINT - // Without WASM_BIGINT support we cannot directly call function with i64 as - // part of their signature, so we rely on the dynCall functions generated by - // wasm-emscripten-finalize - if (sig.indexOf('j') != -1) { -#if ASSERTIONS - assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); - if (args && args.length) { - // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. - assert(args.length === sig.substring(1).replace(/j/g, '--').length); - } else { - assert(sig.length == 1); - } -#endif - if (args && args.length) { - return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); - } else { - return Module['dynCall_' + sig].call(null, ptr); - } - } -#endif - - return wasmTable.get(ptr).apply(null, args) -} - var tempRet0 = 0; var setTempRet0 = function(value) { diff --git a/src/worker.js b/src/worker.js index 8678de2d2807c..34ee7bb8d7e46 100644 --- a/src/worker.js +++ b/src/worker.js @@ -200,7 +200,7 @@ this.onmessage = function(e) { // enable that to work. If you find the following line to crash, either change the signature // to "proper" void *ThreadMain(void *arg) form, or try linking with the Emscripten linker // flag -s EMULATE_FUNCTION_POINTER_CASTS=1 to add in emulation for this x86 ABI extension. - var result = Module['dynCall_ii'](e.data.start_routine, e.data.arg); + var result = Module['dynCall']('ii', e.data.start_routine, [e.data.arg]); #if STACK_OVERFLOW_CHECK Module['checkStackCookie'](); diff --git a/tests/code_size/hello_webgl2_wasm.json b/tests/code_size/hello_webgl2_wasm.json index c72b745e33894..2460aa820a7ca 100644 --- a/tests/code_size/hello_webgl2_wasm.json +++ b/tests/code_size/hello_webgl2_wasm.json @@ -1,10 +1,10 @@ { "a.html": 563, "a.html.gz": 377, - "a.js": 5064, - "a.js.gz": 2417, - "a.wasm": 10917, - "a.wasm.gz": 6935, - "total": 16544, - "total_gz": 9729 + "a.js": 5060, + "a.js.gz": 2412, + "a.wasm": 10893, + "a.wasm.gz": 6922, + "total": 16516, + "total_gz": 9711 } diff --git a/tests/code_size/hello_webgl2_wasm2js.json b/tests/code_size/hello_webgl2_wasm2js.json index 6f8a5eef1d8dd..c329071c53be4 100644 --- a/tests/code_size/hello_webgl2_wasm2js.json +++ b/tests/code_size/hello_webgl2_wasm2js.json @@ -1,10 +1,10 @@ { "a.html": 588, "a.html.gz": 386, - "a.js": 22182, - "a.js.gz": 8483, + "a.js": 22114, + "a.js.gz": 8453, "a.mem": 3168, "a.mem.gz": 2711, - "total": 25938, - "total_gz": 11580 + "total": 25870, + "total_gz": 11550 } diff --git a/tests/code_size/hello_webgl_wasm.json b/tests/code_size/hello_webgl_wasm.json index f335d5fbf132d..605403ec06237 100644 --- a/tests/code_size/hello_webgl_wasm.json +++ b/tests/code_size/hello_webgl_wasm.json @@ -1,10 +1,10 @@ { "a.html": 563, "a.html.gz": 377, - "a.js": 4549, - "a.js.gz": 2240, - "a.wasm": 10917, - "a.wasm.gz": 6935, - "total": 16029, - "total_gz": 9552 + "a.js": 4545, + "a.js.gz": 2235, + "a.wasm": 10893, + "a.wasm.gz": 6922, + "total": 16001, + "total_gz": 9534 } diff --git a/tests/code_size/hello_webgl_wasm2js.json b/tests/code_size/hello_webgl_wasm2js.json index 8206626e74aaa..87ad8c5eb137a 100644 --- a/tests/code_size/hello_webgl_wasm2js.json +++ b/tests/code_size/hello_webgl_wasm2js.json @@ -1,10 +1,10 @@ { "a.html": 588, "a.html.gz": 386, - "a.js": 21671, - "a.js.gz": 8324, + "a.js": 21603, + "a.js.gz": 8293, "a.mem": 3168, "a.mem.gz": 2711, - "total": 25427, - "total_gz": 11421 + "total": 25359, + "total_gz": 11390 } diff --git a/tests/code_size/random_printf_wasm2js.json b/tests/code_size/random_printf_wasm2js.json index 454bbd9ff4760..ae31b6715fbb2 100644 --- a/tests/code_size/random_printf_wasm2js.json +++ b/tests/code_size/random_printf_wasm2js.json @@ -1,6 +1,6 @@ { "a.html": 19387, - "a.html.gz": 8068, + "a.html.gz": 8070, "total": 19387, - "total_gz": 8068 + "total_gz": 8070 } diff --git a/tests/other/metadce/hello_libcxx_O2.exports b/tests/other/metadce/hello_libcxx_O2.exports index e370369a3bc97..8a8bcc4e0e2cf 100644 --- a/tests/other/metadce/hello_libcxx_O2.exports +++ b/tests/other/metadce/hello_libcxx_O2.exports @@ -2,26 +2,10 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_ii -dynCall_iidiiii -dynCall_iii -dynCall_iiii -dynCall_iiiii -dynCall_iiiiid -dynCall_iiiiii -dynCall_iiiiiii -dynCall_iiiiiiii -dynCall_iiiiiiiii dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiji -dynCall_v -dynCall_vi -dynCall_vii -dynCall_viiii -dynCall_viiiii -dynCall_viiiiii dynCall_viijii free main diff --git a/tests/other/metadce/hello_libcxx_O2_fexceptions.exports b/tests/other/metadce/hello_libcxx_O2_fexceptions.exports index ce5222228ec74..8bdc3ac5572c1 100644 --- a/tests/other/metadce/hello_libcxx_O2_fexceptions.exports +++ b/tests/other/metadce/hello_libcxx_O2_fexceptions.exports @@ -5,37 +5,11 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_diii -dynCall_fiii -dynCall_i -dynCall_ii -dynCall_iidiiii -dynCall_iii -dynCall_iiii -dynCall_iiiii -dynCall_iiiiid -dynCall_iiiiii -dynCall_iiiiiii -dynCall_iiiiiiii -dynCall_iiiiiiiii -dynCall_iiiiiiiiiii -dynCall_iiiiiiiiiiii -dynCall_iiiiiiiiiiiii dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiiii dynCall_jiji -dynCall_v -dynCall_vi -dynCall_vii -dynCall_viii -dynCall_viiii -dynCall_viiiii -dynCall_viiiiii -dynCall_viiiiiii -dynCall_viiiiiiiiii -dynCall_viiiiiiiiiiiiiii dynCall_viijii free main diff --git a/tests/other/metadce/hello_libcxx_O2_fexceptions_DEMANGLE_SUPPORT.exports b/tests/other/metadce/hello_libcxx_O2_fexceptions_DEMANGLE_SUPPORT.exports index 3434e1d9218ff..8162a257a83ef 100644 --- a/tests/other/metadce/hello_libcxx_O2_fexceptions_DEMANGLE_SUPPORT.exports +++ b/tests/other/metadce/hello_libcxx_O2_fexceptions_DEMANGLE_SUPPORT.exports @@ -6,37 +6,11 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_diii -dynCall_fiii -dynCall_i -dynCall_ii -dynCall_iidiiii -dynCall_iii -dynCall_iiii -dynCall_iiiii -dynCall_iiiiid -dynCall_iiiiii -dynCall_iiiiiii -dynCall_iiiiiiii -dynCall_iiiiiiiii -dynCall_iiiiiiiiiii -dynCall_iiiiiiiiiiii -dynCall_iiiiiiiiiiiii dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiiii dynCall_jiji -dynCall_v -dynCall_vi -dynCall_vii -dynCall_viii -dynCall_viiii -dynCall_viiiii -dynCall_viiiiii -dynCall_viiiiiii -dynCall_viiiiiiiiii -dynCall_viiiiiiiiiiiiiii dynCall_viijii free main diff --git a/tests/other/metadce/hello_world.exports b/tests/other/metadce/hello_world.exports index 4541a116a95c2..22878a4a6e84d 100644 --- a/tests/other/metadce/hello_world.exports +++ b/tests/other/metadce/hello_world.exports @@ -2,11 +2,7 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_ii -dynCall_iidiiii -dynCall_iiii dynCall_jiji -dynCall_vii fflush free main diff --git a/tests/other/metadce/hello_world.funcs b/tests/other/metadce/hello_world.funcs index 244f5f951af9e..40885b7eef362 100644 --- a/tests/other/metadce/hello_world.funcs +++ b/tests/other/metadce/hello_world.funcs @@ -23,11 +23,7 @@ $__wasi_syscall_ret $__wasm_call_ctors $dlfree $dlmalloc -$dynCall_ii -$dynCall_iidiiii -$dynCall_iiii $dynCall_jiji -$dynCall_vii $emscripten_get_sbrk_ptr $fflush $fmt_fp diff --git a/tests/other/metadce/hello_world_O1.exports b/tests/other/metadce/hello_world_O1.exports index 2aa0ef17c56bd..9e43d3335f546 100644 --- a/tests/other/metadce/hello_world_O1.exports +++ b/tests/other/metadce/hello_world_O1.exports @@ -2,8 +2,6 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_ii -dynCall_iiii dynCall_jiji free main diff --git a/tests/other/metadce/hello_world_O1.funcs b/tests/other/metadce/hello_world_O1.funcs index 4c37be4c37267..65dd8d380ad5a 100644 --- a/tests/other/metadce/hello_world_O1.funcs +++ b/tests/other/metadce/hello_world_O1.funcs @@ -13,8 +13,6 @@ $__wasi_syscall_ret $__wasm_call_ctors $dlfree $dlmalloc -$dynCall_ii -$dynCall_iiii $dynCall_jiji $emscripten_get_sbrk_ptr $fputs diff --git a/tests/other/metadce/hello_world_O2.exports b/tests/other/metadce/hello_world_O2.exports index 2aa0ef17c56bd..9e43d3335f546 100644 --- a/tests/other/metadce/hello_world_O2.exports +++ b/tests/other/metadce/hello_world_O2.exports @@ -2,8 +2,6 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_ii -dynCall_iiii dynCall_jiji free main diff --git a/tests/other/metadce/hello_world_O2.funcs b/tests/other/metadce/hello_world_O2.funcs index 5e7924976d4e3..7c63c15bfaef8 100644 --- a/tests/other/metadce/hello_world_O2.funcs +++ b/tests/other/metadce/hello_world_O2.funcs @@ -10,8 +10,6 @@ $__wasi_syscall_ret $__wasm_call_ctors $dlfree $dlmalloc -$dynCall_ii -$dynCall_iiii $fwrite $legalstub$dynCall_jiji $main diff --git a/tests/other/metadce/hello_world_O3_MAIN_MODULE_2.exports b/tests/other/metadce/hello_world_O3_MAIN_MODULE_2.exports index 7345569c691c2..e51fa9e34c472 100644 --- a/tests/other/metadce/hello_world_O3_MAIN_MODULE_2.exports +++ b/tests/other/metadce/hello_world_O3_MAIN_MODULE_2.exports @@ -2,8 +2,6 @@ __assign_got_enties __errno_location __stdio_write __wasm_call_ctors -dynCall_ii -dynCall_iiii dynCall_jiji main malloc diff --git a/tests/return64bit/testbind_bigint.js b/tests/return64bit/testbind_bigint.js index 6fe717397cb40..08d657cb8ae60 100644 --- a/tests/return64bit/testbind_bigint.js +++ b/tests/return64bit/testbind_bigint.js @@ -17,7 +17,7 @@ Module['runtest'] = function() { console.log("high = " + high); var ptr = _get_func_ptr(); - bigint = dynCall_jj(ptr, eval('0xabcdef1912345678n')); + bigint = dynCall('jj', ptr, [eval('0xabcdef1912345678n')]); low = Number(bigint & BigInt(0xffffffff)); high = Number(bigint >> BigInt(32)); console.log("low = " + low); diff --git a/tests/test_core.py b/tests/test_core.py index b6e130f2bddbe..26a1b28cf6bdc 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6415,6 +6415,7 @@ def test_ccall(self): self.do_run_in_out_file_test('tests', 'core', 'test_ccall.cpp') def test_EXTRA_EXPORTED_RUNTIME_METHODS(self): + self.set_setting('DEFAULT_LIBRARY_FUNCS_TO_INCLUDE', ['$dynCall']) self.do_run_in_out_file_test('tests', 'core', 'EXTRA_EXPORTED_RUNTIME_METHODS.c') # test dyncall (and other runtime methods in support.js) can be exported self.emcc_args += ['-DEXPORTED'] diff --git a/tests/test_other.py b/tests/test_other.py index dfa245f28e3e3..89cab6ca12f5a 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -6254,7 +6254,8 @@ def test_sixtyfour_bit_return_value(self, args, bind_js): '--pre-js', path_from_root('tests', 'return64bit', 'testbindstart.js'), '--pre-js', path_from_root('tests', 'return64bit', bind_js), '--post-js', path_from_root('tests', 'return64bit', 'testbindend.js'), - '-s', 'EXPORTED_FUNCTIONS=["_test_return64"]', '-o', 'test.js', '-O2', + '-s', 'DEFAULT_LIBRARY_FUNCS_TO_INCLUDE=[$dynCall]', + '-s', 'EXPORTED_FUNCTIONS=[_test_return64]', '-o', 'test.js', '-O2', '--closure', '1', '-g1', '-s', 'WASM_ASYNC_COMPILATION=0'] + args) # Simple test program to load the test.js binding library and call the binding to the diff --git a/tools/ports/sdl2.py b/tools/ports/sdl2.py index 1741628c4f47f..349d8ba9e3cd5 100644 --- a/tools/ports/sdl2.py +++ b/tools/ports/sdl2.py @@ -90,7 +90,7 @@ def clear(ports, settings, shared): def process_dependencies(settings): - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$autoResumeAudioContext'] + settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$autoResumeAudioContext', '$dynCall'] def process_args(ports): diff --git a/tools/shared.py b/tools/shared.py index 79dbc931358da..2cfd60cef64ae 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1212,7 +1212,7 @@ def make_jscall(sig): @staticmethod def make_dynCall(sig, args): # wasm2c and asyncify are not yet compatible with direct wasm table calls - if Settings.ASYNCIFY or Settings.WASM2C or not JS.is_legal_sig(sig): + if Settings.USE_LEGACY_DYNCALLS or not JS.is_legal_sig(sig): args = ','.join(args) if not Settings.MAIN_MODULE and not Settings.SIDE_MODULE: # Optimize dynCall accesses in the case when not building with dynamic From 23b40673db59707c42b37b45a21397cfa7f7fa8f Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Mon, 31 Aug 2020 10:05:51 -0700 Subject: [PATCH 2/3] feedback --- emcc.py | 2 +- tools/ports/sdl2.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/emcc.py b/emcc.py index 127f8a550b4f3..25987d2ff0090 100755 --- a/emcc.py +++ b/emcc.py @@ -1531,7 +1531,7 @@ def check(input_file): if not shared.Settings.MINIMAL_RUNTIME or shared.Settings.EXIT_RUNTIME: # MINIMAL_RUNTIME only needs callRuntimeCallbacks in certain cases, but the normal runtime # always does. - shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$callRuntimeCallbacks'] + shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$callRuntimeCallbacks', '$dynCall'] if shared.Settings.USE_PTHREADS: # memalign is used to ensure allocated thread stacks are aligned. diff --git a/tools/ports/sdl2.py b/tools/ports/sdl2.py index 349d8ba9e3cd5..1741628c4f47f 100644 --- a/tools/ports/sdl2.py +++ b/tools/ports/sdl2.py @@ -90,7 +90,7 @@ def clear(ports, settings, shared): def process_dependencies(settings): - settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$autoResumeAudioContext', '$dynCall'] + settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$autoResumeAudioContext'] def process_args(ports): From 19fc4751646dffc182194a79ba98b056806c88f2 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Mon, 31 Aug 2020 10:10:45 -0700 Subject: [PATCH 3/3] . --- emcc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emcc.py b/emcc.py index 25987d2ff0090..5201129cab329 100755 --- a/emcc.py +++ b/emcc.py @@ -1267,7 +1267,7 @@ def check(input_file): if shared.Settings.RELOCATABLE: shared.Settings.ALLOW_TABLE_GROWTH = 1 - if shared.Settings.WASM2C or shared.Settings.ASYNCIFY: + if shared.Settings.ASYNCIFY: # See: https://github.com/emscripten-core/emscripten/issues/12065 # See: https://github.com/emscripten-core/emscripten/issues/12066 shared.Settings.USE_LEGACY_DYNCALLS = 1